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