UNPKG

@coinmeca/wallet-provider

Version:

This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).

84 lines 3.98 kB
"use client"; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { createContext, useContext, useLayoutEffect, useState } from "react"; import { CoinmecaWalletProvider } from "@coinmeca/wallet-sdk/provider"; import { TelegramProvider } from "./telegram"; import { CoinmecaWalletNotificationBridge } from "./notification"; let sharedWalletProvider; const CoinmecaWalletContext = createContext(undefined); export const useCoinmecaWalletProvider = () => { const context = useContext(CoinmecaWalletContext); if (!context) throw new Error("CoinmecaWalletContext is not initialized yet. Ensure the provider is correctly set up before using useCoinmecaWalletProvider."); return context; }; export const CoinmecaWalletContextProvider = ({ children }) => { const [provider, setProvider] = useState(); const [, setUpdate] = useState(0); const updates = () => setUpdate((_) => _ + 1); useLayoutEffect(() => { const chainId = window?.coinmeca?.request?.chainId; const wallet = sharedWalletProvider || new CoinmecaWalletProvider({ chainId }); sharedWalletProvider = wallet; setProvider(wallet); const updateStorage = (event) => { if (event.storageArea === localStorage) updates(); }; window.addEventListener("storage", updateStorage); return () => { window.removeEventListener("storage", updateStorage); }; }, []); useLayoutEffect(() => { if (provider) { provider?.on("lock", updates); provider?.on("unlock", updates); provider?.on("lockTimeUpdated", updates); provider?.on("accountChanged", updates); provider?.on("accountUpdated", updates); provider?.on("chainChanged", updates); provider?.on("chainUpdated", updates); provider?.on("appUpdated", updates); provider?.on("tokenUpdated", updates); provider?.on("nftUpdated", updates); provider?.on("txUpdated", updates); provider?.on("storageUpdated", updates); provider?.on("storageCleared", updates); return () => { provider?.off("lock", updates); provider?.off("unlock", updates); provider?.off("lockTimeUpdated", updates); provider?.off("accountChanged", updates); provider?.off("accountUpdated", updates); provider?.off("chainChanged", updates); provider?.off("chainUpdated", updates); provider?.off("appUpdated", updates); provider?.off("tokenUpdated", updates); provider?.off("nftUpdated", updates); provider?.off("txUpdated", updates); provider?.off("storageUpdated", updates); provider?.off("storageCleared", updates); }; } }, [provider]); const chain = provider?.chain; const chainId = chain?.chainId?.toString() || ""; const account = provider?.account(); return (_jsx(TelegramProvider, { children: _jsxs(CoinmecaWalletContext.Provider, { value: { provider, account, accounts: provider?.accounts(), chain, chains: provider?.chains, apps: provider?.apps, tokens: { fungibles: chainId ? account?.tokens?.fungibles?.[chainId] : undefined, nonFungibles: chainId ? account?.tokens?.nonFungibles?.[chainId] : undefined, multiTokens: chainId ? account?.tokens?.multiTokens?.[chainId] : undefined, }, tx: account?.tx?.[chainId || ""], contact: provider?.contact || {}, }, children: [_jsx(CoinmecaWalletNotificationBridge, { provider: provider }), children] }) })); }; //# sourceMappingURL=provider.js.map