diff --git a/src/app/routes/__root.tsx b/src/app/routes/__root.tsx index fae7445..33daa3b 100644 --- a/src/app/routes/__root.tsx +++ b/src/app/routes/__root.tsx @@ -127,6 +127,11 @@ export const Route = createRootRouteWithContext<{ return { auth }; } catch (error: any) { + if (error?.options?.to && error?.options?.statusCode) { + console.log('__root beforeLoad: Re-throwing redirect', error.options); + throw error; + } + console.error('__root beforeLoad error:', error); return {}; } diff --git a/src/features/players/server.ts b/src/features/players/server.ts index 5309a3c..70167cd 100644 --- a/src/features/players/server.ts +++ b/src/features/players/server.ts @@ -15,7 +15,7 @@ export const fetchMe = createServerFn() const request = getRequest(); try { - const context = await getSessionContext(request); + const context = await getSessionContext(request, { isServerFunction: true }); await pbAdmin.authPromise; const result = await pbAdmin.getPlayerByAuthId(context.userAuthId); @@ -55,6 +55,24 @@ export const fetchMe = createServerFn() } } + if (error?.message === "SESSION_REFRESH_REQUIRED") { + logger.info("FetchMe: Session refresh required (server function)"); + throw new Response( + JSON.stringify({ + error: "SESSION_REFRESH_REQUIRED", + message: "Session needs to be refreshed", + shouldRetry: true + }), + { + status: 440, + headers: { + "Content-Type": "application/json", + "X-Session-Expired": "true" + } + } + ); + } + if (error?.message === "Unauthenticated") { logger.info("FetchMe: No authenticated user (expected when not logged in)"); return { user: undefined, roles: [], metadata: {}, phone: undefined }; diff --git a/src/lib/tanstack-query/utils/ensure.ts b/src/lib/tanstack-query/utils/ensure.ts index b6e0fa3..dbe3b80 100644 --- a/src/lib/tanstack-query/utils/ensure.ts +++ b/src/lib/tanstack-query/utils/ensure.ts @@ -11,13 +11,20 @@ export async function ensureServerQueryData( return queryClient.ensureQueryData({ queryKey: query.queryKey, queryFn: async () => { - const result = await query.queryFn(); - - if (!result.success) { - throw new Error(result.error.userMessage); + try { + const result = await query.queryFn(); + + if (!result.success) { + throw new Error(result.error.userMessage); + } + + return result.data; + } catch (error: any) { + if (error?.options?.to && error?.options?.statusCode) { + throw error; + } + throw error; } - - return result.data; } }); } \ No newline at end of file diff --git a/src/lib/tanstack-query/utils/global-error-handler.ts b/src/lib/tanstack-query/utils/global-error-handler.ts index c4a5ec2..e1a4465 100644 --- a/src/lib/tanstack-query/utils/global-error-handler.ts +++ b/src/lib/tanstack-query/utils/global-error-handler.ts @@ -10,6 +10,11 @@ export async function handleQueryError(error: any): Promise { throw error; } + if (error.options?.to && error.options?.statusCode) { + logger.info('handleQueryError: Re-throwing TanStack Router redirect', error.options); + throw error; + } + if (error instanceof Response) { const status = error.status; diff --git a/src/lib/tanstack-query/utils/to-server-result.ts b/src/lib/tanstack-query/utils/to-server-result.ts index d910b37..ed3c429 100644 --- a/src/lib/tanstack-query/utils/to-server-result.ts +++ b/src/lib/tanstack-query/utils/to-server-result.ts @@ -26,6 +26,14 @@ export const toServerResult = async ( const data = await serverFn(); return { success: true, data }; } catch (error) { + if (error && typeof error === 'object' && 'options' in error) { + const redirectError = error as any; + if (redirectError.options?.to && redirectError.options?.statusCode) { + logger.info('toServerResult: Re-throwing TanStack Router redirect', redirectError.options); + throw error; + } + } + const duration = Date.now() - startTime; logger.error('Server Fn Error', error);