import { Link } from '@tanstack/react-router' import { BookOpen, ChevronLeft, Globe, LogOut, Menu, Moon, PieChart, Search, Server, Sun } from 'lucide-react' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { BackgroundLayer } from '@/components/background-layer' import { BackendManager } from '@/components/electron/BackendManager' import { SearchDialog } from '@/components/search-dialog' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { Kbd } from '@/components/ui/kbd' import { toggleThemeWithTransition } from '@/components/use-theme' import { useBackground } from '@/hooks/use-background' import { logout } from '@/lib/fetch-with-auth' import { isElectron } from '@/lib/runtime' import { cn } from '@/lib/utils' const LANGUAGE_CODES = ['zh', 'en', 'ja', 'ko'] as const interface HeaderProps { sidebarOpen: boolean mobileMenuOpen: boolean searchOpen: boolean actualTheme: 'light' | 'dark' onSidebarToggle: () => void onMobileMenuToggle: () => void onSearchOpenChange: (open: boolean) => void onThemeChange: (theme: 'light' | 'dark' | 'system') => void } export function Header({ sidebarOpen, mobileMenuOpen, searchOpen, actualTheme, onSidebarToggle, onMobileMenuToggle, onSearchOpenChange, onThemeChange, }: HeaderProps) { const { t, i18n: i18nInstance } = useTranslation() const currentLang = i18nInstance.language || 'zh' const headerBg = useBackground('header') const [backendManagerOpen, setBackendManagerOpen] = useState(false) const [activeBackendName, setActiveBackendName] = useState('') useEffect(() => { if (!isElectron()) return window.electronAPI!.getActiveBackend().then((b) => { setActiveBackendName(b?.name ?? t('header.notConnected')) }) }, []) const handleLogout = async () => { await logout() } return (
{/* 移动端菜单按钮 */} {/* 桌面端侧边栏收起/展开按钮 */}
{/* 后端切换按钮(仅 Electron) */} {isElectron() && ( <>
)} {/* 年度总结入口 */} {/* 搜索框 */} {/* 搜索对话框 */} {/* 麦麦文档链接 */} {/* 语言切换 */} {LANGUAGE_CODES.map((code) => ( i18nInstance.changeLanguage(code)} className={cn( 'cursor-pointer', currentLang.split('-')[0] === code && 'font-semibold text-primary' )} > {currentLang.split('-')[0] === code && ( )} {t(`language.${code}`)} ))} {/* 主题切换按钮 */} {/* 分隔线 */}
{/* 登出按钮 */}
) }