@macalinao/grill
Version:
Modern Solana development kit for React applications with automatic account batching, caching, and transaction notifications
87 lines • 3.56 kB
JavaScript
import { fetchTokenInfo } from "@macalinao/gill-extra";
import { useQueries } from "@tanstack/react-query";
import { useMintAccounts } from "../accounts/mint.js";
import { useGrillContext } from "../contexts/grill-context.js";
import { createTokenInfoQueryKey } from "../query-keys.js";
import { useTokenMetadataAccounts } from "./use-token-metadata-account.js";
/**
* Hook for getting the {@link TokenInfo} for multiple mint addresses.
* @param param0
* @returns
*/
export function useTokenInfos({ mints, }) {
const { staticTokenInfo } = useGrillContext();
// Filter out null/undefined mints for account fetching
const validMints = mints?.filter((mint) => !!mint) ?? [];
const metadataAccountsResult = useTokenMetadataAccounts({
mints: validMints.length > 0 ? validMints : null,
});
const mintAccountsResult = useMintAccounts({
addresses: validMints.length > 0 ? validMints : [],
});
// Create a map for easy lookup
const metadataMap = new Map();
const mintMap = new Map();
if (!(metadataAccountsResult.isLoading || mintAccountsResult.isLoading)) {
validMints.forEach((mint, index) => {
if (metadataAccountsResult.data[index]) {
metadataMap.set(mint, metadataAccountsResult.data[index]);
}
if (mintAccountsResult.data[index]) {
mintMap.set(mint, mintAccountsResult.data[index]);
}
});
}
const result = useQueries({
queries: (mints ?? []).map((mint) => {
const metadataAccount = mint ? metadataMap.get(mint) : undefined;
const mintAccount = mint ? mintMap.get(mint) : undefined;
// Check for static token info
const staticInfo = mint ? staticTokenInfo.get(mint) : undefined;
return {
queryKey: createTokenInfoQueryKey(mint),
queryFn: async () => {
if (!mint) {
return null;
}
// Return static token info if available
if (staticInfo) {
return staticInfo;
}
if (!mintAccount) {
return null;
}
return fetchTokenInfo({
mint: mintAccount,
metadata: metadataAccount?.data ?? null,
});
},
enabled: !!mint &&
(staticInfo !== undefined ||
(mintAccount !== undefined && metadataAccount !== undefined)),
staleTime: staticInfo ? Number.POSITIVE_INFINITY : 5 * 60 * 1000, // Static info never goes stale
gcTime: 60 * 60 * 1000, // Keep in cache for 1 hour
placeholderData: staticInfo ?? undefined,
};
}),
combine: (results) => {
const isLoading = results.some((result) => result.isLoading || result.data === undefined);
if (isLoading) {
return {
isLoading: true,
data: results.map((result) => result.data),
mints,
};
}
return {
isLoading: false,
data: results
.map((result) => result.data)
.filter((r) => r !== undefined),
mints,
};
},
});
return result;
}
//# sourceMappingURL=use-token-infos.js.map