import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { getPools, getLpQuote, getLpPositions, addLp, removeLp, type LpDepositInput, } from '../api/poolsApi' export function usePools() { return useQuery({ queryKey: ['pools', 'list'], queryFn: getPools, staleTime: 30_000, retry: false, }) } export function useLpPositions() { return useQuery({ queryKey: ['pools', 'positions'], queryFn: getLpPositions, staleTime: 30_000, retry: false, }) } /** * Квота депозита. Запрашивается, только когда пул выбран, обе границы диапазона > 0 * и задана хотя бы одна сумма. Вход дебаунсится на стороне виджета. */ export function useLpQuote(input: LpDepositInput | null) { const ready = input != null && input.priceLower > 0 && input.priceUpper > 0 && (parseFloat(input.amount0Human) > 0 || parseFloat(input.amount1Human) > 0) return useQuery({ queryKey: [ 'pools', 'quote', input?.pool.poolAddress, input?.priceLower, input?.priceUpper, input?.amount0Human, input?.amount1Human, input?.slippageBps, input?.useNativeEth, ], queryFn: () => getLpQuote(input as LpDepositInput), enabled: ready, staleTime: 15_000, retry: false, }) } export function useAddLp() { const qc = useQueryClient() return useMutation({ mutationFn: (input: LpDepositInput) => addLp(input), // Депозит отражается в сети не мгновенно. Первый рефетч делаем не сразу, а спустя 1.5 с, // и повторяем для позиций через 6 с — позиция может ещё не появиться на чейне. Паттерн из useStake. onSettled: () => { setTimeout(() => { qc.invalidateQueries({ queryKey: ['wallet', 'balance', 'ETH'] }) qc.invalidateQueries({ queryKey: ['pools', 'positions'] }) }, 1500) setTimeout(() => { qc.invalidateQueries({ queryKey: ['pools', 'positions'] }) qc.invalidateQueries({ queryKey: ['wallet', 'balance', 'ETH'] }) }, 6000) }, }) } export function useRemoveLp() { const qc = useQueryClient() return useMutation({ mutationFn: ({ tokenId, percent }: { tokenId: string; percent: number }) => removeLp(tokenId, percent), onSuccess: () => { // Ликвидность + накопленные комиссии вернулись на кошелёк. qc.invalidateQueries({ queryKey: ['pools', 'positions'] }) qc.invalidateQueries({ queryKey: ['wallet', 'balance', 'ETH'] }) }, }) }