add staking page
This commit is contained in:
76
src/features/staking/model/useStaking.ts
Normal file
76
src/features/staking/model/useStaking.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
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'] }),
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user