UNPKG

@macalinao/grill

Version:

Modern Solana development kit for React applications with automatic account batching, caching, and transaction notifications

53 lines 1.89 kB
import { useQueries } from "@tanstack/react-query"; import { useGrillContext } from "../contexts/grill-context.js"; import { createAccountQueryKey, fetchAndDecodeAccount, } from "../utils/account-helpers.js"; /** * Get account info for multiple addresses with automatic batching via DataLoader. * Concurrent queries are automatically batched into a single RPC call. * * @example * ```tsx * const tokenAccounts = useAccounts({ * addresses: [tokenAccount1, tokenAccount2, tokenAccount3], * decoder: tokenAccountDecoder, * }); * * // Access individual results * tokenAccounts.forEach((result, index) => { * if (result.data) { * console.log(`Account ${index}:`, result.data); * } * }); * ``` */ export function useAccounts({ options, addresses, decoder, }) { const { accountLoader } = useGrillContext(); return useQueries({ queries: addresses.map((address) => ({ networkMode: "offlineFirst", ...options, // eslint-disable-next-line @tanstack/query/exhaustive-deps queryKey: address ? createAccountQueryKey(address) : [null], queryFn: () => fetchAndDecodeAccount(address, accountLoader, decoder), enabled: !!address, })), combine: (results) => { const isLoading = results.some((result) => result.isLoading || result.data === undefined); if (isLoading) { return { isLoading: true, data: results.map((result) => result.data), addresses, }; } return { isLoading: false, data: results .map((result) => result.data) .filter((r) => r !== undefined), addresses, }; }, }); } //# sourceMappingURL=use-accounts.js.map