import { DependencyList, useCallback, useState } from 'react'; interface UseMutationOptions { deps?: DependencyList; } type State = 'idle' | 'loading' | 'error' | 'success'; export function useMutation( fn: any, { deps = [], onSuccess, onError, }: UseMutationOptions & { onSuccess?: () => void; onError?: (error: any) => void; } = {}, ): { isLoading: boolean; isError: boolean; isSuccess: boolean; state: State; error: any; handler: (args: any) => Promise; } { const [state, setState] = useState('idle'); const [error, setError] = useState(); const isLoading = state === 'loading'; const isError = state === 'error'; const isSuccess = state === 'success'; const callback = useCallback((...args: any): any => fn(...args), deps); async function handler(args: any) { setState('loading'); try { const result = await callback(args); setState('success'); onSuccess?.(); return result; } catch (err) { setState('error'); setError(err); onError?.(error); } } return { isLoading, isError, isSuccess, state, error, handler }; }