@macalinao/grill
Version:
Modern Solana development kit for React applications with automatic account batching, caching, and transaction notifications
71 lines • 2.83 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import { useSolanaClient } from "@gillsdk/react";
import { createBatchAccountsLoader } from "@macalinao/solana-batch-accounts-loader";
import { useQueryClient } from "@tanstack/react-query";
import { getExplorerLink as defaultGetExplorerLink } from "gill";
import { useCallback, useMemo } from "react";
import { GrillContext } from "../contexts/grill-context.js";
import { useKitWallet } from "../hooks/use-kit-wallet.js";
import { createSendTX } from "../utils/internal/create-send-tx.js";
import { refetchAccounts as doRefetchAccounts } from "../utils/refetch-accounts.js";
import { SubscriptionProvider } from "./subscription-provider.js";
/**
* Headless provider component for Solana account batching functionality.
* Creates and provides a batch account loader for efficient Solana account fetching.
* This provider integrates with @gillsdk/react's useSolanaClient hook to access the RPC client.
*
* For UI integration with toast notifications, use GrillProvider instead.
*
* @example
* ```tsx
* <GrillHeadlessProvider>
* <App />
* </GrillHeadlessProvider>
* ```
*/
export const GrillHeadlessProvider = ({ children, maxBatchSize = 99, batchDurationMs = 10, onTransactionStatusEvent = (e) => {
console.log(e);
}, getExplorerLink = defaultGetExplorerLink, staticTokenInfo = [], fetchFromCertifiedTokenList = true, rpcUrl, cluster = "mainnet-beta", }) => {
const { rpc } = useSolanaClient();
const queryClient = useQueryClient();
const { signer } = useKitWallet();
const accountLoader = useMemo(() => createBatchAccountsLoader({
rpc,
maxBatchSize,
batchDurationMs,
}), [rpc, maxBatchSize, batchDurationMs]);
const refetchAccounts = useCallback(async (addresses) => {
await doRefetchAccounts({
queryClient,
accountLoader,
addresses,
});
}, [queryClient, accountLoader]);
const sendTX = useMemo(() => createSendTX({
signer,
rpc,
refetchAccounts,
onTransactionStatusEvent,
getExplorerLink,
rpcUrl,
cluster,
}), [
signer,
rpc,
refetchAccounts,
onTransactionStatusEvent,
getExplorerLink,
rpcUrl,
cluster,
]);
const staticTokenInfoMap = useMemo(() => new Map(staticTokenInfo.map((info) => [info.mint, info])), [staticTokenInfo]);
return (_jsx(SubscriptionProvider, { children: _jsx(GrillContext.Provider, { value: {
accountLoader,
refetchAccounts,
sendTX,
getExplorerLink,
staticTokenInfo: staticTokenInfoMap,
fetchFromCertifiedTokenList,
}, children: children }) }));
};
//# sourceMappingURL=grill-headless-provider.js.map