@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
JavaScript
"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