import { QRCodeSVG } from "qrcode.react"; import { LoaderCircle, X } from "lucide-react"; import { useEffect, useState } from "react"; import { useI18n } from "../i18n"; import type { WalletKind } from "./injected"; import { useWallet } from "./WalletProvider"; import { useWalletConnectLogin } from "./useWalletConnectLogin"; import { WalletBrandIcon } from "./WalletBrandIcon"; const wallets: WalletKind[] = ["tokenPocket", "metaMask", "imToken"]; function isMobileDevice(): boolean { if (typeof navigator === "undefined") return false; return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile/i.test( navigator.userAgent || "", ); } export function WalletLoginModal() { const { t } = useI18n(); const { closeLoginModal, loginModalOpen } = useWallet(); const wc = useWalletConnectLogin(); const [selected, setSelected] = useState(null); const [mobileDevice, setMobileDevice] = useState(false); const resetWalletConnect = wc.reset; useEffect(() => { if (!loginModalOpen) return; setMobileDevice(isMobileDevice()); setSelected(null); resetWalletConnect(); }, [loginModalOpen, resetWalletConnect]); if (!loginModalOpen) return null; const walletName = (kind: WalletKind) => t(walletNameKey(kind)); const walletHint = (kind: WalletKind) => { if (kind === "tokenPocket") { return mobileDevice ? t("walletTpMobileDesc") : t("walletTokenPocketQrDesc"); } return t("walletRainbowFallbackDesc"); }; const busy = wc.state !== "idle"; const close = () => { closeLoginModal(); setSelected(null); wc.reset(); }; const selectWallet = (kind: WalletKind) => { setSelected(kind); wc.reset(); }; const startWalletLogin = (kind: WalletKind, mode: "deeplink" | "qr") => { setSelected(kind); void wc.start(kind, mode); }; return (

{t("walletLoginTitle")}

{t("walletLoginDesc")}

{wallets.map((kind) => { const active = selected === kind; const connecting = active && wc.state === "connecting"; const signing = active && wc.state === "signing"; return (
{mobileDevice && active ? (
) : null}
); })}
{!wc.available ? (

{t("walletRainbowUnavailable")}

) : null} {selected && wc.qrUri ? (

{mobileDevice ? t("walletTpWaiting") : t("walletQrUseAnotherDevice")}

) : null} {wc.error ? (

{wc.error}

) : null} {selected ? (

Wallet debug

state: {wc.state}

connected: {wc.isConnected ? "yes" : "no"}

address: {wc.address || "-"}

qr: {wc.qrUri ? "received" : "-"}

) : null} {selected ? (

{t("walletNetworkWarning")}

) : null}
); } function walletNameKey(kind: WalletKind): string { if (kind === "tokenPocket") return "walletTokenPocket"; if (kind === "metaMask") return "walletMetaMask"; return "walletImToken"; }