@macalinao/grill
Version:
Modern Solana development kit for React applications with automatic account batching, caching, and transaction notifications
53 lines • 1.89 kB
JavaScript
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