import { useQueryClient } from '@tanstack/react-query'; import { useCallback, useState } from 'react'; import type { IStellarWalletProvider, StellarChainKey } from '@sodax/sdk'; import { useSodaxContext } from './useSodaxContext.js'; export function useRequestTrustline(token: string | undefined): { requestTrustline: (params: { token: string; amount: bigint; srcChainKey: StellarChainKey; walletProvider: IStellarWalletProvider; }) => Promise; isLoading: boolean; isRequested: boolean; error: Error | null; data: string | null; } { const { sodax } = useSodaxContext(); const queryClient = useQueryClient(); const [isLoading, setIsLoading] = useState(false); const [isRequested, setIsRequested] = useState(false); const [error, setError] = useState(null); const [data, setData] = useState(null); const requestTrustline = useCallback( async ({ token, amount, srcChainKey, walletProvider, }: { token: string; amount: bigint; srcChainKey: StellarChainKey; walletProvider: IStellarWalletProvider; }): Promise => { if (!token || !amount) { const error = new Error('Token and amount are required'); setError(error); throw error; } setIsLoading(true); setError(null); try { const srcAddress = await walletProvider.getWalletAddress(); const result = await sodax.spoke.stellar.requestTrustline({ raw: false, srcChainKey, srcAddress, token, amount, walletProvider, }); setData(result); setIsRequested(true); queryClient.invalidateQueries({ queryKey: ['shared', 'stellarTrustlineCheck', token] }); return result; } catch (err) { const error = err instanceof Error ? err : new Error('Unknown error occurred'); setError(error); throw error; } finally { setIsLoading(false); } }, [queryClient, sodax], ); return { requestTrustline, isLoading, isRequested, error, data }; }