@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).
41 lines • 1.83 kB
JSX
"use client";
import React, { createContext, useContext, useEffect, useLayoutEffect, useState } from "react";
import { CoinmecaWalletAdapter } from "@coinmeca/wallet-sdk/adapter";
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 address = adapter?.address;
const chain = adapter?.chain;
useLayoutEffect(() => {
setAdapter(window?.ethereum?.providerMap?.get("CoinmecaWallet") || new CoinmecaWalletAdapter(config));
const updateStorage = (event) => {
if (event.storageArea === localStorage)
update();
};
window.addEventListener("storage", updateStorage);
return () => {
window.removeEventListener("storage", updateStorage);
};
}, []);
useEffect(() => {
adapter?.on("accountChanged", update);
adapter?.on("chainChanged", update);
return () => {
adapter?.off("accountChanged", update);
adapter?.off("chainChanged", update);
};
}, [adapter]);
return (<TelegramProvider>
<CoinmecaWalletAdapterContext.Provider value={{ adapter, address, chain }}>{children}</CoinmecaWalletAdapterContext.Provider>
</TelegramProvider>);
};
//# sourceMappingURL=adapter.jsx.map