'use client'; import { Settings, Sun, Moon, Monitor, ArrowLeft, Loader2, Download, FileDown, Package, } from 'lucide-react'; import { useI18n } from '@/lib/hooks/use-i18n'; import { useTheme } from '@/lib/hooks/use-theme'; import { useState, useEffect, useRef, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { SettingsDialog } from './settings'; import { cn } from '@/lib/utils'; import { useSettingsStore } from '@/lib/store/settings'; import { useStageStore } from '@/lib/store/stage'; import { useMediaGenerationStore } from '@/lib/store/media-generation'; import { useExportPPTX } from '@/lib/export/use-export-pptx'; interface HeaderProps { readonly currentSceneTitle: string; } export function Header({ currentSceneTitle }: HeaderProps) { const { t, locale, setLocale } = useI18n(); const { theme, setTheme } = useTheme(); const router = useRouter(); const [settingsOpen, setSettingsOpen] = useState(false); const [languageOpen, setLanguageOpen] = useState(false); const [themeOpen, setThemeOpen] = useState(false); // Model setup state const currentModelId = useSettingsStore((s) => s.modelId); const needsSetup = !currentModelId; // Export const { exporting: isExporting, exportPPTX, exportResourcePack } = useExportPPTX(); 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 languageRef = useRef(null); const themeRef = useRef(null); // Close dropdown when clicking outside const handleClickOutside = useCallback( (e: MouseEvent) => { if (languageOpen && languageRef.current && !languageRef.current.contains(e.target as Node)) { setLanguageOpen(false); } 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); } }, [languageOpen, themeOpen, exportMenuOpen], ); useEffect(() => { if (languageOpen || themeOpen || exportMenuOpen) { document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); } }, [languageOpen, themeOpen, exportMenuOpen, handleClickOutside]); return ( <>
{t('stage.currentScene')}

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

{/* Language Selector */}
{languageOpen && (
)}
{/* Theme Selector */}
{themeOpen && (
)}
{/* Settings Button */}
{needsSetup && ( <> {t('settings.setupNeeded')} )}
{/* Export Dropdown */}
{exportMenuOpen && (
)}
); }