"use client"; import { injected } from "@wagmi/connectors/injected"; import Link from "next/link"; import { useAccount, useConnect, useDisconnect, useChainId, useSwitchChain, } from "wagmi"; import { usePortalAuth } from "@/components/auth/portal-auth-provider"; import { Button, buttonVariants } from "@/components/ui/button"; import { MetaMaskLogo, MaviWalletLogo, } from "@/components/wallet/wallet-logos"; import { createDemoWalletSession } from "@/lib/demo-session"; import { hasVault, shortAddress, readVault } from "@/lib/mavi/storage"; import { establishPortalSession } from "@/lib/portal-session"; import { cn } from "@/lib/utils"; import { useEffect, useState } from "react"; export function ConnectWalletButton({ className, onConnected, /** Compact layout for dashboard cards */ compact = false, /** Show mavi wallet row under MetaMask */ showMavi = true, /** Also mint portal session (same as sign-in) so dashboard stays open */ asLogin = false, }: { className?: string; onConnected?: (address: string) => void; compact?: boolean; showMavi?: boolean; asLogin?: boolean; }) { const { address, isConnected, isConnecting } = useAccount(); const { connect, error, isPending } = useConnect(); const { disconnect } = useDisconnect(); const chainId = useChainId(); const { switchChain } = useSwitchChain(); const { setDemoSession, clearDemo, demoSession } = usePortalAuth(); const [maviVault, setMaviVault] = useState(false); const [maviAddr, setMaviAddr] = useState(null); useEffect(() => { setMaviVault(hasVault()); setMaviAddr(readVault()?.address ?? null); }, []); function handleConnect() { connect( { connector: injected() }, { onSuccess: (data) => { const addr = data.accounts[0]; if (addr) { setDemoSession(createDemoWalletSession(addr)); if (asLogin) { void establishPortalSession({ userId: `wallet_${addr.toLowerCase()}`, method: "wallet", walletAddress: addr, }).then(() => { window.dispatchEvent(new Event("krypco-auth-change")); onConnected?.(addr); }); } else { onConnected?.(addr); } } }, }, ); } function handleDisconnect() { disconnect(); if (demoSession?.kind === "wallet") { clearDemo(); } } if (isConnected && address) { return (
MetaMask

{address}

chain id {chainId}

{chainId !== 31337 && switchChain ? ( ) : null}
{showMavi ? ( ) : null}
); } return (
{showMavi ? ( mavi wallet ) : null}
{error ? (

{error.message}

) : !compact ? (

MetaMask is the browser extension.{" "} mavi is krypco's wallet (create + backup on this site).

) : (

MetaMask extension or mavi on this site.

)}
); } function MaviLinkRow({ compact, hasVault: vault, address, }: { compact?: boolean; hasVault: boolean; address: string | null; }) { return (

mavi wallet

{vault && address ? `Saved · ${shortAddress(address)}` : "Create + back up recovery phrase"}

mavi wallet
); }