diff --git a/src/hooks/useMutation.ts b/src/hooks/useMutation.ts deleted file mode 100644 index 8e1a621e8..000000000 --- a/src/hooks/useMutation.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { isRedirect, useRouter } from '@tanstack/react-router' -import * as React from 'react' - -type BaseMutationProps = { - fn: (variables: TVariables) => Promise - onSuccess?: (ctx: { - variables: TVariables - data: TData - }) => void | Promise - onError?: (ctx: { variables: TVariables; error: TError }) => void - onSettled?: (ctx: { - variables: TVariables - data: TData | undefined - error: TError | undefined - }) => void | Promise -} - -export function useBaseMutation( - opts: BaseMutationProps, -) { - const [submittedAt, setSubmittedAt] = React.useState() - const [variables, setVariables] = React.useState() - const [error, setError] = React.useState() - const [data, setData] = React.useState() - const [status, setStatus] = React.useState< - 'idle' | 'pending' | 'success' | 'error' - >('idle') - - const mutate = React.useCallback( - (async (variables: TVariables): Promise => { - setStatus('pending') - setSubmittedAt(Date.now()) - setVariables(variables) - // - try { - const data = await opts.fn(variables) - await opts.onSuccess?.({ variables, data }) - await opts.onSettled?.({ variables, data, error: undefined }) - setStatus('success') - setError(undefined) - setData(data) - return data - } catch (err: any) { - opts.onError?.({ variables, error: err }) - opts.onSettled?.({ variables, data: undefined, error: err }) - setStatus('error') - setError(err) - } - }) as TVariables extends undefined - ? (variables?: TVariables) => Promise - : (variables: TVariables) => Promise, - // eslint-disable-next-line react-hooks/exhaustive-deps - [opts.fn], - ) - - const handleSubmit = React.useCallback( - (e: React.FormEvent) => { - e.preventDefault() - mutate(new FormData((e as any).target) as TVariables) - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [mutate, variables], - ) - - return { - status, - variables, - submittedAt, - mutate, - error, - data, - handleSubmit, - } -} - -export function useMutation( - opts: BaseMutationProps, -) { - const router = useRouter() - - return useBaseMutation({ - ...opts, - // Use onSettled to handle potential redirects - onSettled: async (ctx) => { - if (isRedirect(ctx.data)) { - router.navigate({ ...(ctx.data as any) }) - } else if (isRedirect(ctx.error)) { - router.navigate({ ...(ctx.error as any) }) - } - - router.invalidate() - - await opts.onSettled?.(ctx) - }, - }) -}