UNPKG

@rainbow-me/rainbowkit

Version:
84 lines (81 loc) 2.19 kB
"use client"; // src/components/RainbowKitProvider/AuthenticationContext.tsx import React, { createContext, useContext, useEffect, useMemo, useState } from "react"; import { useAccount, useAccountEffect } from "wagmi"; function createAuthenticationAdapter(adapter) { return adapter; } var AuthenticationContext = createContext( null ); function RainbowKitAuthenticationProvider({ adapter, children, enabled = true, status }) { const { connector } = useAccount(); const [currentConnectorUid, setCurrentConnectorUid] = useState(); useAccountEffect({ onDisconnect: () => { adapter.signOut(); setCurrentConnectorUid(void 0); } }); const handleChangedAccount = (data) => { if (data.accounts) { setCurrentConnectorUid(void 0); adapter.signOut(); } }; useEffect(() => { if (typeof connector?.emitter?.on === "function" && status === "authenticated") { setCurrentConnectorUid(connector?.uid); connector.emitter.on("change", handleChangedAccount); return () => { connector.emitter.off("change", handleChangedAccount); }; } }, [connector?.emitter, status]); useEffect(() => { if (currentConnectorUid && typeof connector?.emitter?.on === "function" && status === "authenticated") { if (connector?.uid !== currentConnectorUid) { setCurrentConnectorUid(void 0); adapter.signOut(); } } }, [connector?.emitter, currentConnectorUid, status]); return /* @__PURE__ */ React.createElement( AuthenticationContext.Provider, { value: useMemo( () => enabled ? { adapter, status } : null, [enabled, adapter, status] ) }, children ); } function useAuthenticationAdapter() { const { adapter } = useContext(AuthenticationContext) ?? {}; if (!adapter) { throw new Error("No authentication adapter found"); } return adapter; } function useAuthenticationStatus() { const contextValue = useContext(AuthenticationContext); return contextValue?.status ?? null; } export { createAuthenticationAdapter, RainbowKitAuthenticationProvider, useAuthenticationAdapter, useAuthenticationStatus };