1- import { AssetIndex } from '../data/types'
1+ import { AssetId } from '../data/types'
22import { indexer } from '@/features/common/data'
33import { TransactionResult , TransactionSearchResults } from '@algorandfoundation/algokit-utils/types/indexer'
44import { useMemo } from 'react'
55import { JotaiStore } from '@/features/common/data/types'
6- import { fetchTransactionsAtomBuilder , transactionResultsAtom } from '@/features/transactions/data'
6+ import { createTransactionsAtom , transactionResultsAtom } from '@/features/transactions/data'
77import { atomEffect } from 'jotai-effect'
88import { atom , useStore } from 'jotai'
99
10- const fetchAssetTransactionResults = async ( assetIndex : AssetIndex , pageSize : number , nextPageToken ?: string ) => {
10+ const fetchAssetTransactionResults = async ( assetId : AssetId , pageSize : number , nextPageToken ?: string ) => {
1111 const results = ( await indexer
1212 . searchForTransactions ( )
13- . assetID ( assetIndex )
13+ . assetID ( assetId )
1414 . nextToken ( nextPageToken ?? '' )
1515 . limit ( pageSize )
1616 . do ( ) ) as TransactionSearchResults
@@ -20,14 +20,16 @@ const fetchAssetTransactionResults = async (assetIndex: AssetIndex, pageSize: nu
2020 } as const
2121}
2222
23- const syncEffectBuilder = ( transactionResults : TransactionResult [ ] ) => {
23+ const createSyncEffect = ( transactionResults : TransactionResult [ ] ) => {
2424 return atomEffect ( ( _ , set ) => {
2525 ; ( async ( ) => {
2626 try {
2727 set ( transactionResultsAtom , ( prev ) => {
2828 const next = new Map ( prev )
2929 transactionResults . forEach ( ( transactionResult ) => {
30- next . set ( transactionResult . id , transactionResult )
30+ if ( ! next . has ( transactionResult . id ) ) {
31+ next . set ( transactionResult . id , atom ( transactionResult ) )
32+ }
3133 } )
3234 return next
3335 } )
@@ -38,13 +40,13 @@ const syncEffectBuilder = (transactionResults: TransactionResult[]) => {
3840 } )
3941}
4042
41- const fetchAssetTransactionsAtomBuilder = ( store : JotaiStore , assetIndex : AssetIndex , pageSize : number , nextPageToken ?: string ) => {
43+ const createAssetTransactionsAtom = ( store : JotaiStore , assetId : AssetId , pageSize : number , nextPageToken ?: string ) => {
4244 return atom ( async ( get ) => {
43- const { transactionResults, nextPageToken : newNextPageToken } = await fetchAssetTransactionResults ( assetIndex , pageSize , nextPageToken )
45+ const { transactionResults, nextPageToken : newNextPageToken } = await fetchAssetTransactionResults ( assetId , pageSize , nextPageToken )
4446
45- get ( syncEffectBuilder ( transactionResults ) )
47+ get ( createSyncEffect ( transactionResults ) )
4648
47- const transactions = await get ( fetchTransactionsAtomBuilder ( store , transactionResults ) )
49+ const transactions = await get ( createTransactionsAtom ( store , transactionResults ) )
4850
4951 return {
5052 rows : transactions ,
@@ -53,10 +55,10 @@ const fetchAssetTransactionsAtomBuilder = (store: JotaiStore, assetIndex: AssetI
5355 } )
5456}
5557
56- export const useFetchNextAssetTransactionsPage = ( assetIndex : AssetIndex ) => {
58+ export const useFetchNextAssetTransactionsPage = ( assetId : AssetId ) => {
5759 const store = useStore ( )
5860
5961 return useMemo ( ( ) => {
60- return ( pageSize : number , nextPageToken ?: string ) => fetchAssetTransactionsAtomBuilder ( store , assetIndex , pageSize , nextPageToken )
61- } , [ store , assetIndex ] )
62+ return ( pageSize : number , nextPageToken ?: string ) => createAssetTransactionsAtom ( store , assetId , pageSize , nextPageToken )
63+ } , [ store , assetId ] )
6264}
0 commit comments