import React, { useState } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { useAuth, useForum, useNetwork, useUIState } from '@/hooks'; import { EVerificationStatus } from '@opchan/core'; import { localDatabase } from '@opchan/core'; 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, Trash2, Loader2, } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@/components/ui/alert-dialog'; import { useToast } from '@/components/ui/use-toast'; import { useEthereumWallet } from '@opchan/react'; import { WalletWizard } from '@/components/ui/wallet-wizard'; import { CallSignSetupDialog } from '@/components/ui/call-sign-setup-dialog'; import { WakuHealthDot } from '@/components/ui/waku-health-indicator'; const Header = () => { const { currentUser, delegationInfo } = useAuth(); const { statusMessage, syncStatus, syncDetail } = useNetwork(); const location = useLocation(); const { toast } = useToast(); const { content } = useForum(); const { isConnected, disconnect } = useEthereumWallet(); const [walletWizardOpen, setWalletWizardOpen] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [callSignDialogOpen, setCallSignDialogOpen] = useState(false); // Use centralized UI state instead of direct LocalDatabase access const [hasShownWizard, setHasShownWizard] = useUIState( 'hasShownWalletWizard', false ); // Auto-open wizard when wallet connects for the first time React.useEffect(() => { if (isConnected && !hasShownWizard) { setWalletWizardOpen(true); setHasShownWizard(true); } }, [isConnected, hasShownWizard, setHasShownWizard]); const handleConnect = async () => { setWalletWizardOpen(true); }; const handleOpenWizard = () => { setWalletWizardOpen(true); }; const handleDisconnect = async () => { // For anonymous users, clear their session if (currentUser?.verificationStatus === EVerificationStatus.ANONYMOUS) { await localDatabase.clearUser(); await localDatabase.clearDelegation(); window.location.reload(); // Reload to reset state return; } // For wallet users, disconnect wallet await disconnect(); setHasShownWizard(false); // Reset so wizard can show again on next connection toast({ title: 'Wallet Disconnected', description: 'Your wallet has been disconnected successfully.', }); }; const handleClearDatabase = async () => { try { await localDatabase.clearAll(); toast({ title: 'Database Cleared', description: 'All local data has been cleared successfully.', }); } catch (error) { console.error('Failed to clear database:', error); toast({ title: 'Error', description: 'Failed to clear local database. Please try again.', variant: 'destructive', }); } }; const getStatusIcon = () => { if (!isConnected) return ; if ( currentUser?.verificationStatus === EVerificationStatus.ENS_VERIFIED && delegationInfo?.isValid ) { return ; } else if ( currentUser?.verificationStatus === EVerificationStatus.WALLET_CONNECTED ) { return ; } else if ( currentUser?.verificationStatus === EVerificationStatus.ENS_VERIFIED ) { return ; } else { return ; } }; return ( <>
{/* Top Row - Logo, Network Status, User Actions */}
{/* Left: Logo */}
opchan
{/* Center: Network Status (Desktop) */}
{statusMessage} {syncStatus === 'syncing' && syncDetail && syncDetail.missing > 0 && (
SYNCING ({syncDetail.missing})

Syncing messages
Pending: {syncDetail.missing}
Received: {syncDetail.received} {syncDetail.lost > 0 && ( <>
Lost: {syncDetail.lost} )}

)} {content.lastSync && (
{new Date(content.lastSync).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', })}

Last message sync time

)}
{/* Right: User Actions */}
{/* Network Status (Mobile) */}
{syncStatus === 'syncing' && syncDetail && syncDetail.missing > 0 ? ( ) : ( )}

{syncStatus === 'syncing' && syncDetail && syncDetail.missing > 0 ? `Syncing ${syncDetail.missing} messages...` : 'Network connected'}

{/* User Status & Actions */} {isConnected || currentUser?.verificationStatus === EVerificationStatus.ANONYMOUS ? (
{/* Status Badge - hidden for anonymous sessions */} {currentUser?.verificationStatus !== EVerificationStatus.ANONYMOUS && ( {getStatusIcon()} {currentUser?.verificationStatus === EVerificationStatus.WALLET_UNCONNECTED ? 'CONNECT' : delegationInfo?.isValid ? 'READY' : currentUser?.verificationStatus === EVerificationStatus.ENS_VERIFIED ? 'EXPIRED' : 'DELEGATE'} )} {/* User Dropdown */} Profile {currentUser?.verificationStatus === EVerificationStatus.ANONYMOUS ? ( setCallSignDialogOpen(true)} className="flex items-center space-x-2" > {currentUser?.callSign ? 'Update' : 'Set'} Call Sign ) : ( Setup Wizard )} e.preventDefault()} className="flex items-center space-x-2 text-orange-400 focus:text-orange-400" > Clear Database Clear Local Database This will permanently delete all locally stored data including:
• Posts and comments
• User identities and preferences
• Bookmarks and votes
• UI state and settings

This action cannot be undone.
Cancel Clear Database
{currentUser?.verificationStatus === EVerificationStatus.ANONYMOUS ? 'Exit Anonymous' : 'Disconnect'}
) : ( )} {/* Mobile Menu Toggle */}
{/* Builder Banner */}
Reference client on top of @opchan/core. UI is intentionally bare. Build your own →
{/* Navigation Bar (Desktop) */}
{/* Mobile Navigation */} {mobileMenuOpen && (
{/* Mobile Network Status */}
{statusMessage} {syncStatus === 'syncing' && syncDetail && syncDetail.missing > 0 && ( SYNCING ({syncDetail.missing}) )} {content.lastSync && ( {new Date(content.lastSync).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', })} )}
)}
{/* Wallet Wizard */} { setWalletWizardOpen(false); toast({ title: 'Setup Complete', description: 'Your wallet is ready to use!', }); }} /> {/* Call Sign Dialog for Anonymous Users */} {currentUser?.verificationStatus === EVerificationStatus.ANONYMOUS && ( )} ); }; export default Header;