'use client'; import { useEffect, useRef, useState } from 'react'; import { useRouter } from 'next/navigation'; import { useAuth } from '@/components/providers/auth-provider'; import { ThemeToggle } from '@/components/ui/theme-toggle'; import { publicEnv } from '@/lib/env/public-env'; import { useAppShellStore } from '@/store/app-shell'; export function DashboardTopbar() { const router = useRouter(); const { logout, user } = useAuth(); const toggleSidebar = useAppShellStore((state) => state.toggleSidebar); const isMobileSidebarOpen = useAppShellStore((state) => state.isMobileSidebarOpen); const setMobileSidebarOpen = useAppShellStore((state) => state.setMobileSidebarOpen); const [isLoggingOut, setIsLoggingOut] = useState(false); const [isUserMenuOpen, setIsUserMenuOpen] = useState(false); const menuRef = useRef(null); useEffect(() => { if (!isUserMenuOpen) { return; } const handlePointerDown = (event: MouseEvent) => { if (!menuRef.current?.contains(event.target as Node)) { setIsUserMenuOpen(false); } }; const handleEscape = (event: KeyboardEvent) => { if (event.key === 'Escape') { setIsUserMenuOpen(false); } }; window.addEventListener('mousedown', handlePointerDown); window.addEventListener('keydown', handleEscape); return () => { window.removeEventListener('mousedown', handlePointerDown); window.removeEventListener('keydown', handleEscape); }; }, [isUserMenuOpen]); const handleLogout = async () => { setIsLoggingOut(true); setIsUserMenuOpen(false); await logout(); router.replace('/login'); }; const handleSidebarToggle = () => { if (window.innerWidth < 1000) { setMobileSidebarOpen(!isMobileSidebarOpen); return; } toggleSidebar(); }; return (
版本 {publicEnv.appVersion}
{isUserMenuOpen ? (

{user?.display_name || user?.username || '用户'}

{user?.username ? (

@{user.username}

) : null}
) : null}
); }