import React, { useState } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { useAuth, useWakuHealthStatus } from '@/hooks'; import { useAuth as useAuthContext } from '@/contexts/useAuth'; import { EVerificationStatus } from '@/types/identity'; import { useForum } from '@/contexts/useForum'; import { localDatabase } from '@/lib/database/LocalDatabase'; import { DelegationFullStatus } from '@/lib/delegation'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { LogOut, Terminal, AlertTriangle, CheckCircle, Key, CircleSlash, Home, Grid3X3, User, Bookmark, Settings, Menu, X, Clock, } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useToast } from '@/components/ui/use-toast'; import { useAppKitAccount, useDisconnect } from '@reown/appkit/react'; import { WalletWizard } from '@/components/ui/wallet-wizard'; import { useUserDisplay } from '@/hooks'; import { WakuHealthDot } from '@/components/ui/waku-health-indicator'; const Header = () => { const { verificationStatus } = useAuth(); const { getDelegationStatus } = useAuthContext(); const [delegationInfo, setDelegationInfo] = useState(null); const wakuHealth = useWakuHealthStatus(); const location = useLocation(); const { toast } = useToast(); const forum = useForum(); // Use AppKit hooks for multi-chain support const bitcoinAccount = useAppKitAccount({ namespace: 'bip122' }); const ethereumAccount = useAppKitAccount({ namespace: 'eip155' }); const { disconnect } = useDisconnect(); // Determine which account is connected const isBitcoinConnected = bitcoinAccount.isConnected; const isEthereumConnected = ethereumAccount.isConnected; const isConnected = isBitcoinConnected || isEthereumConnected; const address = isConnected ? isBitcoinConnected ? bitcoinAccount.address : ethereumAccount.address : undefined; const [walletWizardOpen, setWalletWizardOpen] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); // ✅ Get display name from enhanced hook const { displayName } = useUserDisplay(address || ''); // Load delegation status React.useEffect(() => { getDelegationStatus().then(setDelegationInfo).catch(console.error); }, [getDelegationStatus]); // Use LocalDatabase to persist wizard state across navigation const getHasShownWizard = async (): Promise => { try { const value = await localDatabase.loadUIState('hasShownWalletWizard'); return value === true; } catch { return false; } }; const setHasShownWizard = async (value: boolean): Promise => { try { await localDatabase.storeUIState('hasShownWalletWizard', value); } catch (e) { console.error('Failed to store wizard state', e); } }; // Auto-open wizard when wallet connects for the first time React.useEffect(() => { if (isConnected) { getHasShownWizard().then(hasShown => { if (!hasShown) { setWalletWizardOpen(true); setHasShownWizard(true).catch(console.error); } }); } }, [isConnected]); const handleConnect = async () => { setWalletWizardOpen(true); }; const handleOpenWizard = () => { setWalletWizardOpen(true); }; const handleDisconnect = async () => { await disconnect(); await setHasShownWizard(false); // Reset so wizard can show again on next connection toast({ title: 'Wallet Disconnected', description: 'Your wallet has been disconnected successfully.', }); }; const getStatusIcon = () => { if (!isConnected) return ; if ( verificationStatus === EVerificationStatus.ENS_ORDINAL_VERIFIED && delegationInfo?.isValid ) { return ; } else if (verificationStatus === EVerificationStatus.WALLET_CONNECTED) { return ; } else if ( verificationStatus === EVerificationStatus.ENS_ORDINAL_VERIFIED ) { return ; } else { return ; } }; return ( <>
{/* Top Row - Logo, Network Status, User Actions */}
{/* Left: Logo */}
opchan
{/* Center: Network Status (Desktop) */}
{wakuHealth.statusMessage} {forum.lastSync && (
{new Date(forum.lastSync).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', })}
)}
{/* Right: User Actions */}
{/* Network Status (Mobile) */}
{/* User Status & Actions */} {isConnected ? (
{/* Status Badge */} {getStatusIcon()} {verificationStatus === EVerificationStatus.ENS_ORDINAL_VERIFIED && delegationInfo?.isValid ? 'READY' : verificationStatus === EVerificationStatus.ENS_ORDINAL_VERIFIED ? 'EXPIRED' : 'VERIFY'} {/* User Dropdown */}
{displayName}
{address?.slice(0, 8)}...{address?.slice(-4)}
Profile Setup Wizard Disconnect
) : ( )} {/* Mobile Menu Toggle */}
{/* Navigation Bar (Desktop) */}
{/* Mobile Navigation */} {mobileMenuOpen && (
{/* Mobile Network Status */}
{wakuHealth.statusMessage} {forum.lastSync && ( {new Date(forum.lastSync).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', })} )}
)}
{/* Wallet Wizard */} { setWalletWizardOpen(false); toast({ title: 'Setup Complete', description: 'Your wallet is ready to use!', }); }} /> ); }; export default Header;