@saberhq/sail
Version:
Account caching and batched loading for React-based Solana applications.
117 lines • 3.71 kB
JavaScript
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
;