UNPKG

@saberhq/sail

Version:

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

117 lines 3.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useParsedAccount = exports.makeParsedAccountQuery = exports.useParsedAccounts = 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 useAccountsData_1 = require("../hooks/useAccountsData"); /** * Parses accounts with the given parser. * * *NOTE: the reference to the accounts array is not memoized.* * * @param keys * @param parser * @returns */ const useParsedAccounts = (keys, parser, options = {}) => { const { network } = (0, use_solana_1.useSolana)(); const data = (0, useAccountsData_1.useAccountsData)(keys); return (0, react_query_1.useQueries)(keys.map((key, i) => { const datum = data[i]; return { queryKey: [ "sail/parsedAccount", network, parser.programID.toString(), parser.name, key ? key.toString() : key, ], queryFn: () => { if (!datum) { return datum; } try { const parsed = parser.parse(datum.accountInfo.data); return { publicKey: datum.accountId, account: parsed }; } catch (e) { throw new __1.SailProgramAccountParseError(e, datum, parser); } }, enabled: key !== undefined && datum !== undefined, ...options, }; })); }; exports.useParsedAccounts = useParsedAccounts; /** * Makes the query to fetch a parsed account. * @param key * @param fetchKeys * @param parser * @param options * @returns */ const makeParsedAccountQuery = (key, network, fetchKeys, parser, options = {}) => ({ queryKey: [ "sail/parsedAccount", network, parser.programID.toString(), parser.name, key ? key.toString() : key, ], queryFn: async () => { const [result] = await (0, __1.fetchKeysMaybe)(fetchKeys, [key]); 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, enabled: key !== undefined, ...options, }); exports.makeParsedAccountQuery = makeParsedAccountQuery; /** * Fetches and parses a single account with the given parser. * * @param keys * @param parser * @returns */ const useParsedAccount = (key, parser, options = {}) => { const { fetchKeys, onBatchCache } = (0, __1.useSail)(); const { network } = (0, use_solana_1.useSolana)(); const query = (0, react_query_1.useQuery)((0, exports.makeParsedAccountQuery)(key, network, fetchKeys, parser, options)); (0, __1.useAccountsSubscribe)((0, react_1.useMemo)(() => [key], [key])); // refresh from the cache whenever the cache is updated const { refetch } = query; (0, react_1.useEffect)(() => { if (!key) { return; } return onBatchCache((e) => { if (e.hasKey(key)) { void refetch(); } }); }, [key, fetchKeys, onBatchCache, refetch]); return query; }; exports.useParsedAccount = useParsedAccount; //# sourceMappingURL=useParsedAccount.js.map