Files
frontend/src/features/staking/model/useStaking.ts
2026-06-15 23:06:24 +03:00

77 lines
2.3 KiB
TypeScript

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<EthStakePositions | SolStakePositions>({
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<EthUnstakeResult | SolUnstakeResult, Error, UnstakeVars>({
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'] }),
})
}