import React, { Fragment, useEffect, useState } from "react"; import type { Chain, EIP1193Provider, Transport } from "viem"; import { useConfig, useReconnect } from "wagmi"; import { injected } from "wagmi/connectors"; import { usePrivyCrossAppProvider } from "./usePrivyCrossAppProvider.js"; interface InjectWagmiConnectorProps extends React.PropsWithChildren { /** * The chain to connect to. * @type {Chain} */ chain: Chain; /** * Optional transport configuration for the provider. * @type {Transport} * @optional */ transport?: Transport; } /** * InjectWagmiConnector is a React component that injects the Abstract Wallet provider into Wagmi's connector system. * It handles the setup and reconnection of the wallet provider when ready. * * @example * ```tsx * import { InjectWagmiConnector } from '@abstractwallet/agw-react'; * * const App = () => { * return ( * * * * ); * }; * ``` * * @param {InjectWagmiConnectorProps} props - The component props * @param {Chain} props.chain - The blockchain network to connect to * @param {Transport} [props.transport] - Optional transport configuration for the provider * @param {React.ReactNode} props.children - Child components to render */ export const InjectWagmiConnector = (props: InjectWagmiConnectorProps) => { const { chain, transport, children } = props; const config = useConfig(); const { reconnect } = useReconnect(); const { provider, ready } = usePrivyCrossAppProvider({ chain, transport }); const [isSetup, setIsSetup] = useState(false); useEffect(() => { const setup = async (provider: EIP1193Provider) => { config.storage?.removeItem("xyz.abs.privy.disconnected"); const wagmiConnector = injected({ target: { provider, id: "xyz.abs.privy", name: "Abstract Global Wallet", icon: "", }, }); const connector = config._internal.connectors.setup(wagmiConnector); await config.storage?.setItem("recentConnectorId", "xyz.abs.privy"); config._internal.connectors.setState([connector]); return connector; }; if (ready && (!isSetup || config.connectors.length === 0)) { setup(provider).then((connector) => { if (connector) { reconnect({ connectors: [connector] }); setIsSetup(true); } }); } }, [provider, ready, isSetup, config, reconnect]); return {children}; };