import { useQuery } from '@tanstack/react-query' import { BOOST_DATA_API_URL, STAKEABLE_TOKENS_DATA } from 'utils/constants' import { ActivityFeed, EmptyObject } from 'types' import dayjs from 'dayjs' import useStakeAccounts from './useStakeAccounts' import { useMemo } from 'react' import mangoStore from '@store/mangoStore' import { PublicKey } from '@solana/web3.js' import useMangoGroup from './useMangoGroup' import { useWallet } from '@solana/wallet-adapter-react' const fetchHistory = async ( mangoAccountPk: string, ): Promise | EmptyObject | null> => { const response = await fetch( `${BOOST_DATA_API_URL}/stats/activity-feed?mango-account=${mangoAccountPk}&offset=0&limit=1000`, ) const parsedResponse: Array = await response.json() if (Array.isArray(parsedResponse)) { const activity = parsedResponse .map((i) => { return { ...i, } }) .sort( (a, b) => dayjs(b.block_datetime).unix() - dayjs(a.block_datetime).unix(), ) // only add to current feed if data request is offset and the mango account hasn't changed // const combinedFeed = // offset !== 0 ? loadedFeed.concat(latestFeed) : latestFeed return activity } else return null } const accountNums = STAKEABLE_TOKENS_DATA.map((d) => d.id) export default function useAccountHistory() { const { stakeAccounts } = useStakeAccounts() const { group } = useMangoGroup() const { wallet } = useWallet() // const accountPks = stakeAccounts?.map((acc) => acc.publicKey.toString()) || [] const accountPks = useMemo(() => { const client = mangoStore.getState().client const payer = wallet?.adapter.publicKey?.toBuffer() if (!group || !payer) return [] const x = accountNums.map((n) => { const acctNumBuffer = Buffer.alloc(4) acctNumBuffer.writeUInt32LE(n) const [mangoAccountPda] = PublicKey.findProgramAddressSync( [ Buffer.from('MangoAccount'), group.publicKey.toBuffer(), payer, acctNumBuffer, ], client.program.programId, ) return mangoAccountPda.toString() }) return x }, [group, wallet]) const activeStakeAccts = stakeAccounts?.map((acc) => acc.publicKey.toString()) ?? [] const uniqueAccts = [...new Set([...accountPks, ...activeStakeAccts])] const response = useQuery | EmptyObject | null>( ['history', ...activeStakeAccts], () => stakeAccounts?.length ? Promise.all(uniqueAccts.map((act) => fetchHistory(act))) : // ? fetchHistory(mangoAccount.publicKey.toString()) null, { cacheTime: 1000 * 60 * 5, staleTime: 1000 * 60, retry: 3, refetchOnWindowFocus: true, enabled: !!stakeAccounts, }, ) return { refetch: response.refetch, history: response?.data && Array.isArray(response.data) ? response.data .flat() .filter((n) => n) .sort( (a, b) => new Date(b.block_datetime).getTime() - new Date(a.block_datetime).getTime(), ) : [], isLoading: response.isLoading || response.isFetching, } }