44 ClientActionFunctionArgs ,
55 ClientLoaderFunctionArgs ,
66 useLoaderData ,
7+ useNavigate ,
78} from "@remix-run/react" ;
89import { useEffect , useState } from "react" ;
910import React from "react" ;
@@ -122,6 +123,7 @@ export function useCachedLoaderData<T extends any>(
122123 { adapter = cache } : { adapter ?: CacheAdapter } = { adapter : cache } ,
123124) {
124125 const loaderData = useLoaderData < any > ( ) ;
126+ const navigate = useNavigate ( ) ;
125127 const [ freshData , setFreshData ] = useState < any > ( {
126128 ...( "serverData" in loaderData ? loaderData . serverData : loaderData ) ,
127129 } ) ;
@@ -130,12 +132,22 @@ export function useCachedLoaderData<T extends any>(
130132 useEffect ( ( ) => {
131133 let isMounted = true ;
132134 if ( loaderData . deferredServerData ) {
133- loaderData . deferredServerData . then ( ( newData : any ) => {
134- if ( isMounted ) {
135- adapter . setItem ( loaderData . key , newData ) ;
136- setFreshData ( newData ) ;
137- }
138- } ) ;
135+ loaderData . deferredServerData
136+ . then ( ( newData : any ) => {
137+ if ( isMounted ) {
138+ adapter . setItem ( loaderData . key , newData ) ;
139+ setFreshData ( newData ) ;
140+ }
141+ } )
142+ . catch ( ( e : any ) => {
143+ const res = e instanceof Response ? e : undefined ;
144+ if ( res && res . status === 302 ) {
145+ const to = res . headers . get ( "Location" ) ;
146+ to && navigate ( to ) ;
147+ } else {
148+ throw e ;
149+ }
150+ } ) ;
139151 }
140152 return ( ) => {
141153 isMounted = false ;
0 commit comments