From 0ce7167fed7e794444aa48bc74b3460f80c831bd Mon Sep 17 00:00:00 2001 From: Caleb Cox Date: Sun, 4 Jan 2026 08:36:47 -0600 Subject: [PATCH 1/3] fix(react-start): useServerFn returns undefined after redirect --- .../basic-auth/src/hooks/useMutation.ts | 14 ++++++++------ .../start-supabase-basic/src/hooks/useMutation.ts | 14 ++++++++------ packages/react-start/src/useServerFn.ts | 2 +- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/e2e/react-start/basic-auth/src/hooks/useMutation.ts b/e2e/react-start/basic-auth/src/hooks/useMutation.ts index 1ff7a4653bd..dbbf994c98d 100644 --- a/e2e/react-start/basic-auth/src/hooks/useMutation.ts +++ b/e2e/react-start/basic-auth/src/hooks/useMutation.ts @@ -1,7 +1,7 @@ import * as React from 'react' export function useMutation(opts: { - fn: (variables: TVariables) => Promise + fn: (variables: TVariables) => Promise onSuccess?: (ctx: { data: TData }) => void | Promise }) { const [submittedAt, setSubmittedAt] = React.useState() @@ -20,11 +20,13 @@ export function useMutation(opts: { // try { const data = await opts.fn(variables) - await opts.onSuccess?.({ data }) - setStatus('success') - setError(undefined) - setData(data) - return data + if (data) { + await opts.onSuccess?.({ data }) + setStatus('success') + setError(undefined) + setData(data) + return data + } } catch (err: any) { setStatus('error') setError(err) diff --git a/examples/react/start-supabase-basic/src/hooks/useMutation.ts b/examples/react/start-supabase-basic/src/hooks/useMutation.ts index afe59694d43..f5f94e35d02 100644 --- a/examples/react/start-supabase-basic/src/hooks/useMutation.ts +++ b/examples/react/start-supabase-basic/src/hooks/useMutation.ts @@ -1,7 +1,7 @@ import * as React from 'react' export function useMutation(opts: { - fn: (variables: TVariables) => Promise + fn: (variables: TVariables) => Promise onSuccess?: (ctx: { data: TData }) => void | Promise }) { const [submittedAt, setSubmittedAt] = React.useState() @@ -20,11 +20,13 @@ export function useMutation(opts: { // try { const data = await opts.fn(variables) - await opts.onSuccess?.({ data }) - setStatus('success') - setError(undefined) - setData(data) - return data + if (data) { + await opts.onSuccess?.({ data }) + setStatus('success') + setError(undefined) + setData(data) + return data + } } catch (err) { setStatus('error') setError(err as TError) diff --git a/packages/react-start/src/useServerFn.ts b/packages/react-start/src/useServerFn.ts index 67a09a4358c..45f8171b7f3 100644 --- a/packages/react-start/src/useServerFn.ts +++ b/packages/react-start/src/useServerFn.ts @@ -3,7 +3,7 @@ import { isRedirect, useRouter } from '@tanstack/react-router' export function useServerFn) => Promise>( serverFn: T, -): (...args: Parameters) => ReturnType { +): (...args: Parameters) => ReturnType | Promise { const router = useRouter() return React.useCallback( From ddd6a34b12a19194052e25c4e7fdc8f8c8d2ff57 Mon Sep 17 00:00:00 2001 From: Caleb Cox Date: Sun, 4 Jan 2026 12:26:30 -0600 Subject: [PATCH 2/3] Remove unneeded as any cast --- packages/react-start/src/useServerFn.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-start/src/useServerFn.ts b/packages/react-start/src/useServerFn.ts index 45f8171b7f3..54202ea121f 100644 --- a/packages/react-start/src/useServerFn.ts +++ b/packages/react-start/src/useServerFn.ts @@ -26,5 +26,5 @@ export function useServerFn) => Promise>( } }, [router, serverFn], - ) as any + ) } From 31cadc5421dd1fe87bea0283975a5b94996c3265 Mon Sep 17 00:00:00 2001 From: Caleb Cox Date: Sun, 4 Jan 2026 12:33:24 -0600 Subject: [PATCH 3/3] Use undefined instead of void --- packages/react-start/src/useServerFn.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-start/src/useServerFn.ts b/packages/react-start/src/useServerFn.ts index 54202ea121f..fd4f9524dd5 100644 --- a/packages/react-start/src/useServerFn.ts +++ b/packages/react-start/src/useServerFn.ts @@ -3,7 +3,7 @@ import { isRedirect, useRouter } from '@tanstack/react-router' export function useServerFn) => Promise>( serverFn: T, -): (...args: Parameters) => ReturnType | Promise { +): (...args: Parameters) => ReturnType | Promise { const router = useRouter() return React.useCallback(