"use client"; /** * MetaMask + mavi shown the same way (logo, name, address, actions). */ import { injected } from "@wagmi/connectors/injected"; import Link from "next/link"; import { useEffect, useState, type ReactNode } from "react"; import { useAccount, useChainId, useConnect, useDisconnect, 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, readVault, shortAddress } from "@/lib/mavi/storage"; import { establishPortalSession } from "@/lib/portal-session"; import { cn } from "@/lib/utils"; export function WalletsPanel({ className, /** Also open portal session when MetaMask connects */ asLogin = false, onConnected, }: { className?: string; asLogin?: boolean; onConnected?: (address: string) => void; }) { 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 [maviAddr, setMaviAddr] = useState(null); const [maviSaved, setMaviSaved] = useState(false); useEffect(() => { const vault = readVault(); setMaviSaved(hasVault()); setMaviAddr(vault?.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(); } } const mmConnected = isConnected && Boolean(address); return (
{/* MetaMask — same card shape as mavi */} } name="MetaMask" status={mmConnected ? "connected" : "not connected"} address={mmConnected ? address! : null} detail={mmConnected ? `chain id ${chainId}` : "Browser extension"} actions={ mmConnected ? ( <> {chainId !== 31337 && switchChain ? ( ) : null} ) : ( ) } /> {/* mavi — same card shape */} } name="mavi wallet" status={maviSaved ? "saved on this browser" : "not created"} address={maviSaved && maviAddr ? maviAddr : null} detail={ maviSaved ? "24-word recovery · encrypted here" : "Create + back up 24 words" } actions={ maviSaved ? ( mavi wallet ) : ( <> mavi wallet Import ) } /> {error ? (

{error.message}

) : null}
); } function WalletRow({ logo, name, status, address, detail, actions, }: { logo: ReactNode; name: string; status: string; address: string | null; detail: string; actions: ReactNode; }) { return (
{logo}

{name}

{status}
{address ? (

{address}

) : (

No address yet

)}

{detail}

{address ? (

Short: {shortAddress(address)}

) : null}
{actions}
); }