diff --git a/packages/react-router/lib/components.tsx b/packages/react-router/lib/components.tsx index adbc243164..60c5a6bee0 100644 --- a/packages/react-router/lib/components.tsx +++ b/packages/react-router/lib/components.tsx @@ -371,144 +371,6 @@ export interface RouterProviderProps { unstable_transitions?: boolean; } -function shallowDiff(a: any, b: any) { - if (a === b) { - return false; - } - let aKeys = Object.keys(a); - let bKeys = Object.keys(b); - if (aKeys.length !== bKeys.length) { - return true; - } - for (let key of aKeys) { - if (a[key] !== b[key]) { - return true; - } - } - return false; -} - -export function UNSTABLE_TransitionEnabledRouterProvider({ - router, - flushSync: reactDomFlushSyncImpl, - unstable_onError, -}: Omit): React.ReactElement { - let fetcherData = React.useRef>(new Map()); - let [revalidating, startRevalidation] = React.useTransition(); - let [state, setState] = React.useState(router.state); - - (router as any).__setPendingRerender = (promise: Promise<() => void>) => - startRevalidation( - // @ts-expect-error - need react 19 types for this to be async - async () => { - const rerender = await promise; - startRevalidation(() => { - rerender(); - }); - }, - ); - - let navigator = React.useMemo((): Navigator => { - return { - createHref: router.createHref, - encodeLocation: router.encodeLocation, - go: (n) => router.navigate(n), - push: (to, state, opts) => - router.navigate(to, { - state, - preventScrollReset: opts?.preventScrollReset, - }), - replace: (to, state, opts) => - router.navigate(to, { - replace: true, - state, - preventScrollReset: opts?.preventScrollReset, - }), - }; - }, [router]); - - let basename = router.basename || "/"; - - let dataRouterContext = React.useMemo( - () => ({ - router, - navigator, - static: false, - basename, - unstable_onError, - }), - [router, navigator, basename, unstable_onError], - ); - - React.useLayoutEffect(() => { - return router.subscribe( - (newState, { deletedFetchers, flushSync, viewTransitionOpts }) => { - newState.fetchers.forEach((fetcher, key) => { - if (fetcher.data !== undefined) { - fetcherData.current.set(key, fetcher.data); - } - }); - deletedFetchers.forEach((key) => fetcherData.current.delete(key)); - - const diff = shallowDiff(state, newState); - - if (!diff) return; - - if (flushSync) { - if (reactDomFlushSyncImpl) { - reactDomFlushSyncImpl(() => setState(newState)); - } else { - setState(newState); - } - } else { - React.startTransition(() => { - setState(newState); - }); - } - }, - ); - }, [router, reactDomFlushSyncImpl, state]); - - // The fragment and {null} here are important! We need them to keep React 18's - // useId happy when we are server-rendering since we may have a