@rainbow-me/rainbowkit
Version:
The best way to connect a wallet
84 lines (81 loc) • 2.19 kB
JavaScript
"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
};