import { Settings, Sun, Moon, Monitor, ArrowLeft, Loader2, Download, FileDown, Package, Archive, } from 'lucide-react'; import { useI18n } from '@/lib/hooks/use-i18n'; import { useTheme } from '@/lib/hooks/use-theme'; import { LanguageSwitcher } from './language-switcher'; import { useState, useEffect, useRef, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { SettingsDialog } from './settings'; import { cn } from '@/lib/utils'; import { useStageStore } from '@/lib/store/stage'; import { useMediaGenerationStore } from '@/lib/store/media-generation'; import { useExportPPTX } from '@/lib/export/use-export-pptx'; import { useExportClassroom } from '@/lib/export/use-export-classroom'; interface HeaderProps { readonly currentSceneTitle: string; } export function Header({ currentSceneTitle }: HeaderProps) { const { t } = useI18n(); const { theme, setTheme } = useTheme(); const router = useNavigate(); const [settingsOpen, setSettingsOpen] = useState(false); const [themeOpen, setThemeOpen] = useState(false); // Export const { exporting: isExporting, exportPPTX, exportResourcePack } = useExportPPTX(); const { exporting: isExportingZip, exportClassroomZip } = useExportClassroom(); const [exportMenuOpen, setExportMenuOpen] = useState(false); const exportRef = useRef(null); const scenes = useStageStore((s) => s.scenes); const generatingOutlines = useStageStore((s) => s.generatingOutlines); const failedOutlines = useStageStore((s) => s.failedOutlines); const mediaTasks = useMediaGenerationStore((s) => s.tasks); const canExport = scenes.length > 0 && generatingOutlines.length === 0 && failedOutlines.length === 0 && Object.values(mediaTasks).every((task) => task.status === 'done' || task.status === 'failed'); const themeRef = useRef(null); // Close dropdown when clicking outside const handleClickOutside = useCallback( (e: MouseEvent) => { if (themeOpen && themeRef.current && !themeRef.current.contains(e.target as Node)) { setThemeOpen(false); } if (exportMenuOpen && exportRef.current && !exportRef.current.contains(e.target as Node)) { setExportMenuOpen(false); } }, [themeOpen, exportMenuOpen], ); useEffect(() => { if (themeOpen || exportMenuOpen) { document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); } }, [themeOpen, exportMenuOpen, handleClickOutside]); return ( <>
{t('stage.currentScene')}

{currentSceneTitle || t('common.loading')}

{/* Language Selector */} setThemeOpen(false)} />
{/* Theme Selector */}
{themeOpen && (
)}
{/* Settings Button */}
{/* Export Dropdown */}
{exportMenuOpen && (
)}
); }