import { useQuery } from '@tanstack/react-query' import { MANGO_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 { AnchorProvider } from '@project-serum/anchor' const fetchHistory = async ( mangoAccountPk: string, ): Promise | EmptyObject | null> => { const response = await fetch( `${MANGO_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 accountPks = stakeAccounts?.map((acc) => acc.publicKey.toString()) || [] const accountPks = useMemo(() => { const client = mangoStore.getState().client const payer = (client.program.provider as AnchorProvider).wallet.publicKey if (!group) 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.toBuffer(), acctNumBuffer, ], client.program.programId, ) return mangoAccountPda.toString() }) return x }, [group]) const response = useQuery | EmptyObject | null>( ['history', ...accountPks], () => stakeAccounts?.length ? Promise.all( stakeAccounts.map((acc) => fetchHistory(acc.publicKey.toString())), ) : // ? fetchHistory(mangoAccount.publicKey.toString()) null, { cacheTime: 1000 * 60 * 5, staleTime: 1000 * 60, retry: 3, refetchOnWindowFocus: true, enabled: !!stakeAccounts, }, ) console.log('response', response) return { 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, } }