// packages/dapp-kit/src/hooks/staking/useInstantUnstakeApprove.ts import type { GetWalletProviderType, InstantUnstakeParams, SpokeChainKey, TxReturnType } from '@sodax/sdk'; import { useQueryClient } from '@tanstack/react-query'; import { useSodaxContext } from '../shared/useSodaxContext.js'; import type { MutationHookParams } from '../shared/types.js'; import { useSafeMutation, type SafeUseMutationResult } from '../shared/useSafeMutation.js'; import { unwrapResult } from '../shared/unwrapResult.js'; /** * Mutation variables for {@link useInstantUnstakeApprove}. The `action` literal is injected by * the hook. */ export type UseInstantUnstakeApproveVars = { params: Omit, 'action'>; walletProvider: GetWalletProviderType; }; /** * React hook for approving xSODA spending on the instant-unstake action. * * Throws on SDK failure so React Query's native error model engages (`isError`, `error`, * `onError`, `retry`). Returns the unwrapped tx return value on success. */ export function useInstantUnstakeApprove({ mutationOptions, }: MutationHookParams, UseInstantUnstakeApproveVars> = {}): SafeUseMutationResult< TxReturnType, Error, UseInstantUnstakeApproveVars > { const { sodax } = useSodaxContext(); const queryClient = useQueryClient(); return useSafeMutation, Error, UseInstantUnstakeApproveVars>({ mutationKey: ['staking', 'approve', 'instantUnstake'], ...mutationOptions, mutationFn: async ({ params, walletProvider }) => unwrapResult( await sodax.staking.approve({ params: { ...params, action: 'instantUnstake' }, raw: false, walletProvider, }), ), onSuccess: async (data, vars, ctx) => { queryClient.invalidateQueries({ queryKey: ['staking', 'allowance', vars.params.srcChainKey, 'instantUnstake'], }); await mutationOptions?.onSuccess?.(data, vars, ctx); }, }); }