Skip to content

Commit 5bd2a31

Browse files
committed
fixup fetchers
1 parent 691f8f9 commit 5bd2a31

File tree

3 files changed

+31
-19
lines changed

3 files changed

+31
-19
lines changed

packages/react-router/lib/components.tsx

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,6 @@ export function RouterProvider({
410410
unstable_transitions,
411411
}: RouterProviderProps): React.ReactElement {
412412
let [_state, setStateImpl] = React.useState(router.state);
413-
let [pending, startTransition] = React.useTransition();
414413
// @ts-expect-error - Needs React 19 types
415414
let [state, setOptimisticState] = React.useOptimistic(_state);
416415
let [pendingState, setPendingState] = React.useState<RouterState>();
@@ -424,7 +423,10 @@ export function RouterProvider({
424423
currentLocation: Location;
425424
nextLocation: Location;
426425
}>();
427-
let fetcherData = React.useRef<Map<string, any>>(new Map());
426+
// let fetcherData = React.useRef<Map<string, any>>(new Map());
427+
let [fetcherData, setFetcherData] = React.useState<Map<string, any>>(
428+
new Map(),
429+
);
428430
let logErrorsAndSetState = React.useCallback(
429431
(newState: RouterState) => {
430432
setStateImpl((prevState) => {
@@ -450,12 +452,24 @@ export function RouterProvider({
450452
newState: RouterState,
451453
{ deletedFetchers, flushSync, viewTransitionOpts },
452454
) => {
453-
newState.fetchers.forEach((fetcher, key) => {
454-
if (fetcher.data !== undefined) {
455-
fetcherData.current.set(key, fetcher.data);
456-
}
455+
setFetcherData((prev) => {
456+
const newFetchers = new Map(prev);
457+
458+
newState.fetchers.forEach((fetcher, key) => {
459+
if (fetcher.data !== undefined) {
460+
newFetchers.set(key, fetcher.data);
461+
}
462+
});
463+
deletedFetchers.forEach((key) => newFetchers.delete(key));
464+
465+
return newFetchers;
457466
});
458-
deletedFetchers.forEach((key) => fetcherData.current.delete(key));
467+
// newState.fetchers.forEach((fetcher, key) => {
468+
// if (fetcher.data !== undefined) {
469+
// fetcherData.current.set(key, fetcher.data);
470+
// }
471+
// });
472+
// deletedFetchers.forEach((key) => fetcherData.current.delete(key));
459473

460474
warnOnce(
461475
flushSync === false || reactDomFlushSyncImpl != null,
@@ -487,7 +501,7 @@ export function RouterProvider({
487501
} else if (unstable_transitions === false) {
488502
logErrorsAndSetState(newState);
489503
} else {
490-
startTransition(() => {
504+
React.startTransition(() => {
491505
if (unstable_transitions === true) {
492506
// @ts-expect-error - Needs React 19 types
493507
setOptimisticState((state) => ({
@@ -600,7 +614,7 @@ export function RouterProvider({
600614
if (unstable_transitions === false) {
601615
logErrorsAndSetState(newState);
602616
} else {
603-
startTransition(() => {
617+
React.startTransition(() => {
604618
if (unstable_transitions === true) {
605619
setOptimisticState((state: any) => ({
606620
...state,
@@ -743,7 +757,7 @@ export function RouterProvider({
743757
<>
744758
<DataRouterContext.Provider value={dataRouterContext}>
745759
<DataRouterStateContext.Provider value={state}>
746-
<FetchersContext.Provider value={fetcherData.current}>
760+
<FetchersContext.Provider value={fetcherData}>
747761
<ViewTransitionContext.Provider value={vtContext}>
748762
<Router
749763
basename={basename}

packages/react-router/lib/dom/lib.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2938,7 +2938,7 @@ export function useFetcher<T = any>({
29382938
React.useEffect(() => {
29392939
router.getFetcher(fetcherKey);
29402940
return () => router.deleteFetcher(fetcherKey);
2941-
}, [router, fetcherKey]);
2941+
}, [router.getFetcher, router.deleteFetcher, fetcherKey]);
29422942

29432943
// Fetcher additions
29442944
let load = React.useCallback(

packages/react-router/lib/rsc/browser.tsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -746,37 +746,35 @@ export function RSCHydratedRouter({
746746
}
747747
}, []);
748748

749-
let [{ routes, state }, setState] = React.useState(() => ({
749+
let [{ fetchers, routes, state }, setState] = React.useState(() => ({
750+
fetchers: new Map(router.state.fetchers),
750751
routes: cloneRoutes(router.routes),
751752
state: router.state,
752753
}));
753754

754-
// const [cachedRoutes, setCachedRoutes] = React.useState(() =>
755-
// cloneRoutes(router.routes),
756-
// );
757-
// const [cachedState, setCachedState] = React.useState(router.state);
758-
759755
React.useLayoutEffect(
760756
() =>
761757
router.subscribe((newState) => {
762758
React.startTransition(() => {
763759
setState({
760+
fetchers: new Map(newState.fetchers),
764761
routes: cloneRoutes(router.routes),
765762
state: newState,
766763
});
767764
});
768765
}),
769-
[router, location],
766+
[router.subscribe],
770767
);
771768

772769
const transitionEnabledRouter = React.useMemo(
773770
() =>
774771
({
775772
...router,
773+
fetchers,
776774
state,
777775
routes,
778776
}) as typeof router,
779-
[router, routes, state],
777+
[router, fetchers, routes, state],
780778
);
781779

782780
React.useEffect(() => {

0 commit comments

Comments
 (0)