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 { LogOut, AlertTriangle, CheckCircle, Key, CircleSlash, Trash2, } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; 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 RemixBanner from '@/components/RemixBanner'; const Header = () => { const { currentUser, delegationInfo } = useAuth(); const { statusMessage, syncStatus, syncDetail } = useNetwork(); const location = useLocation(); const { toast } = useToast(); const { isConnected, disconnect } = useEthereumWallet(); const [walletWizardOpen, setWalletWizardOpen] = 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 ( <>
{/* Single Row - Logo, Nav, Status, User */}
{/* Logo & Nav */}
OPCHAN
{/* Network Status */}
{statusMessage} {syncStatus === 'syncing' && syncDetail && syncDetail.missing > 0 && ( SYNCING ({syncDetail.missing}) )}
{/* User */}
{isConnected || currentUser?.verificationStatus === EVerificationStatus.ANONYMOUS ? (
Profile {currentUser?.verificationStatus === EVerificationStatus.ANONYMOUS ? ( setCallSignDialogOpen(true)}> {currentUser?.callSign ? 'Update' : 'Set'} Call Sign ) : ( Setup Wizard )} e.preventDefault()} className="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'}
) : ( )}
{/* Remix Banner */} {/* 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;