import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { getStakeQuote, getOpCost, getEthPositions, getSolPositions, stake, unstakeEth, unstakeSol, claimUnstake, type StakeChain, type EthStakePositions, type SolStakePositions, type EthUnstakeResult, type SolUnstakeResult, } from '../api/stakingApi' export function useStakeQuote(chain: StakeChain, amountHuman: string) { const amount = parseFloat(amountHuman) return useQuery({ queryKey: ['staking', 'quote', chain, amountHuman], queryFn: () => getStakeQuote(chain, amountHuman), enabled: Number.isFinite(amount) && amount > 0, staleTime: 15_000, retry: false, }) } export function useOpCost(chain: StakeChain, amountHuman: string) { const amount = parseFloat(amountHuman) return useQuery({ queryKey: ['staking', 'op-cost', chain, amountHuman], queryFn: () => getOpCost(chain, amountHuman), enabled: Number.isFinite(amount) && amount > 0, staleTime: 15_000, retry: false, }) } export function useStakePositions(chain: StakeChain) { return useQuery({ queryKey: ['staking', 'positions', chain], queryFn: () => (chain === 'ETH' ? getEthPositions() : getSolPositions()), staleTime: 30_000, retry: false, }) } export function useStake() { const qc = useQueryClient() return useMutation({ mutationFn: ({ chain, amountHuman }: { chain: StakeChain; amountHuman: string }) => stake(chain, amountHuman), onSuccess: (_data, { chain }) => qc.invalidateQueries({ queryKey: ['staking', 'positions', chain] }), }) } export type UnstakeVars = | { chain: 'ETH'; amountHuman: string; mode: 'swap' | 'queue' } | { chain: 'SOL'; stakeAccount: string } export function useUnstake() { const qc = useQueryClient() return useMutation({ mutationFn: (vars) => vars.chain === 'ETH' ? unstakeEth(vars.amountHuman, vars.mode) : unstakeSol(vars.stakeAccount), onSuccess: (_data, vars) => qc.invalidateQueries({ queryKey: ['staking', 'positions', vars.chain] }), }) } export function useClaim() { const qc = useQueryClient() return useMutation({ mutationFn: (requestId: string) => claimUnstake(requestId), onSuccess: () => qc.invalidateQueries({ queryKey: ['staking', 'positions', 'ETH'] }), }) }