UNPKG

@saberhq/sail

Version:

Account caching and batched loading for React-based Solana applications.

71 lines 2.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useBatchedParsedAccounts = exports.makeBatchedParsedAccountQuery = void 0; const use_solana_1 = require("@saberhq/use-solana"); const react_1 = require("react"); const react_query_1 = require("react-query"); const __1 = require(".."); const provider_1 = require("../provider"); const makeBatchedParsedAccountQuery = (keys, network, fetchKeys, parser, options = {}) => ({ queryKey: [ "sail/batchedParsedAccounts", network, ...(keys ? (0, __1.serializeKeys)(keys) : keys === null ? ["null"] : ["undefined"]), ], queryFn: async () => { if (!keys) { return keys; } const accountsData = await (0, __1.fetchKeysMaybe)(fetchKeys, keys); return accountsData.map((result) => { if (!result) { return result; } const data = result.data; if (!data) { return null; } try { const parsed = parser.parse(data.accountInfo.data); return { publicKey: data.accountId, account: parsed, }; } catch (e) { throw new __1.SailProgramAccountParseError(e, data, parser); } }); }, staleTime: Infinity, ...options, }); exports.makeBatchedParsedAccountQuery = makeBatchedParsedAccountQuery; /** * Parses accounts with the given parser, fetching them in batch. * * @param keys * @param parser * @returns */ const useBatchedParsedAccounts = (keys, parser, options = {}) => { const { fetchKeys, onBatchCache } = (0, provider_1.useSail)(); const { network } = (0, use_solana_1.useSolana)(); const query = (0, react_query_1.useQuery)((0, exports.makeBatchedParsedAccountQuery)(keys, network, fetchKeys, parser, options)); (0, __1.useAccountsSubscribe)(keys); // refresh from the cache whenever the cache is updated const { refetch } = query; (0, react_1.useEffect)(() => { if (!keys) { return; } return onBatchCache((e) => { if (keys.find((key) => key && e.hasKey(key))) { void refetch(); } }); }, [keys, fetchKeys, onBatchCache, refetch]); return query; }; exports.useBatchedParsedAccounts = useBatchedParsedAccounts; //# sourceMappingURL=useBatchedParsedAccounts.js.map