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).

61 lines 2.8 kB
"use client"; import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useEffect, useLayoutEffect, useState } from "react"; import { CoinmecaWalletAdapter } from "@coinmeca/wallet-sdk/adapter"; import { formatChainId, valid } from "@coinmeca/wallet-sdk/utils"; import { TelegramProvider } from "./telegram"; const CoinmecaWalletAdapterContext = createContext(undefined); export const useCoinmecaWallet = () => { const context = useContext(CoinmecaWalletAdapterContext); if (!context) throw new Error("CoinmecaWalletAdapterContext is not initialized. Ensure the provider is set up correctly before using useCoinmecaWallet."); return context; }; export const CoinmecaWalletAdapterContextProvider = ({ config, children }) => { const [adapter, setAdapter] = useState(); const [updates, setUpdate] = useState(false); const update = () => setUpdate((_) => !_); const evented = (value) => !!value && typeof value === "object" && typeof value?.request === "function" && typeof value?.on === "function" && typeof value?.off === "function"; const find = () => { const ethereum = window?.ethereum; const injected = ethereum?.providerMap?.get?.("CoinmecaWallet"); if (evented(injected)) return injected; const provider = ethereum?.providers?.find?.((item) => item?.isCoinmecaWallet && evented(item)); if (evented(provider)) return provider; return evented(ethereum) && ethereum?.isCoinmecaWallet ? ethereum : undefined; }; const address = adapter?.address; const adapterChain = adapter?.chain; const adapterChainId = adapter?.chainId; const chain = adapterChain && adapterChainId && valid.chainId(adapterChain?.chainId) && formatChainId(adapterChain.chainId) === adapterChainId ? adapterChain : undefined; useLayoutEffect(() => { setAdapter(find() || new CoinmecaWalletAdapter(config)); const updateStorage = (event) => { if (event.storageArea === localStorage) update(); }; window.addEventListener("storage", updateStorage); return () => { window.removeEventListener("storage", updateStorage); }; }, []); useEffect(() => { if (!evented(adapter)) return; adapter.on("accountChanged", update); adapter.on("chainChanged", update); return () => { adapter.off("accountChanged", update); adapter.off("chainChanged", update); }; }, [adapter]); return (_jsx(TelegramProvider, { children: _jsx(CoinmecaWalletAdapterContext.Provider, { value: { adapter, address, chain }, children: children }) })); }; //# sourceMappingURL=adapter.js.map