mirror of
https://github.com/hanzonet/explore.git
synced 2026-10-30 18:16:57 +00:00
* add prefix to API resources * fix pw tests * refactor config * remove unnecessary prefixes in resource names * fixes * update screenshots
90 lines
2.3 KiB
TypeScript
90 lines
2.3 KiB
TypeScript
import { useQuery } from '@tanstack/react-query';
|
|
import { uniq, chunk } from 'es-toolkit';
|
|
import React from 'react';
|
|
|
|
import type { NovesDescribeTxsResponse } from 'types/api/noves';
|
|
import type { Transaction } from 'types/api/transaction';
|
|
|
|
import config from 'configs/app';
|
|
import useApiFetch from 'lib/api/useApiFetch';
|
|
|
|
const feature = config.features.txInterpretation;
|
|
|
|
const translateEnabled = feature.isEnabled && feature.provider === 'noves';
|
|
|
|
export default function useDescribeTxs(items: Array<Transaction> | undefined, viewAsAccountAddress: string | undefined, isPlaceholderData: boolean) {
|
|
const apiFetch = useApiFetch();
|
|
|
|
const txsHash = items ? uniq(items.map(i => i.hash)) : [];
|
|
const txChunks = chunk(txsHash, 10);
|
|
|
|
const queryKey = {
|
|
viewAsAccountAddress,
|
|
firstHash: txsHash[0] || '',
|
|
lastHash: txsHash[txsHash.length - 1] || '',
|
|
};
|
|
|
|
const describeQuery = useQuery({
|
|
queryKey: [ 'noves_describe_txs', queryKey ],
|
|
queryFn: async() => {
|
|
const queries = txChunks.map((hashes) => {
|
|
if (hashes.length === 0) {
|
|
return Promise.resolve([]);
|
|
}
|
|
|
|
return apiFetch('general:noves_describe_txs', {
|
|
queryParams: {
|
|
viewAsAccountAddress,
|
|
hashes,
|
|
},
|
|
}) as Promise<NovesDescribeTxsResponse>;
|
|
});
|
|
|
|
return Promise.all(queries);
|
|
},
|
|
select: (data) => {
|
|
return data.flat();
|
|
},
|
|
enabled: translateEnabled && !isPlaceholderData,
|
|
});
|
|
|
|
const itemsWithTranslation = React.useMemo(() => items?.map(tx => {
|
|
const queryData = describeQuery.data;
|
|
const isLoading = describeQuery.isLoading;
|
|
|
|
if (isLoading) {
|
|
return {
|
|
...tx,
|
|
translation: {
|
|
isLoading,
|
|
},
|
|
};
|
|
}
|
|
|
|
if (!queryData || !translateEnabled) {
|
|
return tx;
|
|
}
|
|
|
|
const query = queryData.find(data => data.txHash.toLowerCase() === tx.hash.toLowerCase());
|
|
|
|
if (query) {
|
|
return {
|
|
...tx,
|
|
translation: {
|
|
data: query,
|
|
isLoading: false,
|
|
},
|
|
};
|
|
}
|
|
|
|
return tx;
|
|
}), [ items, describeQuery.data, describeQuery.isLoading ]);
|
|
|
|
if (!translateEnabled || isPlaceholderData) {
|
|
return items;
|
|
}
|
|
|
|
// return same "items" array of Transaction with a new "translation" field.
|
|
return itemsWithTranslation;
|
|
}
|