{"id":13726637,"url":"https://github.com/rescriptbr/reason-async-hook","last_synced_at":"2025-05-07T22:30:26.767Z","repository":{"id":114862949,"uuid":"280663789","full_name":"rescriptbr/reason-async-hook","owner":"rescriptbr","description":"A simple hook for sane promise handling in ReasonReact ","archived":true,"fork":false,"pushed_at":"2020-07-21T01:41:25.000Z","size":161,"stargazers_count":40,"open_issues_count":5,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-14T17:47:14.186Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Reason","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rescriptbr.png","metadata":{"files":{"readme":"README-pt.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-07-18T13:37:54.000Z","updated_at":"2024-11-05T00:44:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"2bcf995d-9ffb-451e-8865-b326532f170e","html_url":"https://github.com/rescriptbr/reason-async-hook","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rescriptbr%2Freason-async-hook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rescriptbr%2Freason-async-hook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rescriptbr%2Freason-async-hook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rescriptbr%2Freason-async-hook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rescriptbr","download_url":"https://codeload.github.com/rescriptbr/reason-async-hook/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252965065,"owners_count":21832815,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T01:03:15.315Z","updated_at":"2025-05-07T22:30:26.447Z","avatar_url":"https://github.com/rescriptbr.png","language":"Reason","readme":"\u003cp align=\"center\"\u003e\n  \u003cbr /\u003e\n  \u003cimg src=\"./assets/logo-pt-br.svg\" width=\"700\" /\u003e \n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n   \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e • \n   \u003ca target=\"_blank\" href=\"#usage\"\u003eUsage\u003c/a\u003e •\n   \u003ca target=\"_blank\" href=\"#how-does-it-work\"\u003eHow does it work\u003c/a\u003e\n\u003c/p\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n```reason\n[@react.component]\nlet make = () =\u003e {\n  let ({state: createUserState}, createUser) = AsyncHook.use((~cb, ~name, ~age) =\u003e cb(() =\u003e {\n    fetch(\"/user\", ~params={\n      name,\n      age,\n    })\n  }))\n\n\n  let onSubmit= () =\u003e {\n    createUser(~name=form.values.name, ~age=form.values.age)\n    // Handle the result after the call\n    |\u003e Promise.tapError(error =\u003e {\n      Js.log(error)\n    })\n    |\u003e Promise.getOk(result =\u003e {\n      Js.log(\"Success!\")\n    })\n  }\n\n  // or use the declarative mode\n  \u003cdiv\u003e\n    {\n      switch(createUserState) {\n        | Idle =\u003e \u003cbutton onClick={_ =\u003e onSubmit()}\u003e\"Create user\"-\u003eReact.string\u003c/button\u003e\n        | Loading =\u003e \u003cp\u003e{\"Loading...\"-\u003eReact.string}\u003c/p\u003e\n        | Error(error) =\u003e \n          \u003cp\u003e\n            \"User created with id #\"-\u003eReact.string\n            {data.user.id-\u003eReact.string}\n          \u003c/p\u003e\n        | Data(data) =\u003e\n          \u003cp\u003e\n            \"User created with id #\"-\u003eReact.string\n            {data.user.id-\u003eReact.string}\n          \u003c/p\u003e\n      }\n    }\n  \u003c/div\u003e\n}\n```\n\n# Instalação\n\n```\nyarn add reason-async-hook reason-promise\n```\n\n`bsconfig.json`\n```json\n  \"bs-dependencies\": [\n    \"reason-async-hook\",\n    \"reason-promise\"\n  ]\n```\n\nPromises são apenas melhores com reason-promise!\n\n# Como isso funciona?\n\nA lib apenas usa o currying por padrão e a inferência de tipos mágica do ReasonML.\n`reason-promise` roda em cima das promises JavaScript mas ele adiciona mais funcionalidades a elas, e uma delas é o suporte ao tipo `result`. Permitindo controle fino sobre o fluxo da chamada e permitindo _railway programming_.\n","funding_links":[],"categories":["Reason"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frescriptbr%2Freason-async-hook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frescriptbr%2Freason-async-hook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frescriptbr%2Freason-async-hook/lists"}