Skip to content

Commit

Permalink
feat(remix-react): add typeof action inference to useFetcher (#4392)
Browse files Browse the repository at this point in the history
* Support `typeof action` in useFetcher generic type.

* add myself to the list of contributors

* Create witty-kiwis-flow.md

Co-authored-by: Pedro Cattori <pcattori@gmail.com>
  • Loading branch information
2 people authored and kentcdodds committed Dec 15, 2022
1 parent faf0420 commit fb62120
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
8 changes: 8 additions & 0 deletions .changeset/witty-kiwis-flow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"remix": patch
"@remix-run/react": patch
---

Infer the type of the `.data` property of `useFetcher` from `loader` and `action` functions.
Similarly to how you can write useLoaderData<typeof loader>. e.g. you can now write useFetcher<typeof action>, and fetcher.data will be inferred correctly.
Previously, you had to write useFetcher<SerializeFrom<typeof action>>.
1 change: 1 addition & 0 deletions contributors.yml
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@
- michaeldebetaz
- michaeldeboey
- michaelfriedman
- michaelhelvey
- michaseel
- mikeybinnswebdesign
- mirzafaizan
Expand Down
6 changes: 4 additions & 2 deletions packages/remix-react/components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1436,7 +1436,9 @@ export type FetcherWithComponents<TData> = Fetcher<TData> & {
*
* @see https://remix.run/api/remix#usefetcher
*/
export function useFetcher<TData = any>(): FetcherWithComponents<TData> {
export function useFetcher<TData = any>(): FetcherWithComponents<
SerializeFrom<TData>
> {
let { transitionManager } = useRemixEntryContext();

let [key] = React.useState(() => String(++fetcherId));
Expand All @@ -1446,7 +1448,7 @@ export function useFetcher<TData = any>(): FetcherWithComponents<TData> {
});
let submit = useSubmitImpl(key);

let fetcher = transitionManager.getFetcher<TData>(key);
let fetcher = transitionManager.getFetcher<SerializeFrom<TData>>(key);

let fetcherWithComponents = React.useMemo(
() => ({
Expand Down

0 comments on commit fb62120

Please sign in to comment.