import { useEffect, useRef, useState } from "react"; import { FileText, History, Languages, Loader2, RotateCcw, Save, Sparkles, Trash2 } from "lucide-react"; import type { SavedScript } from "@/features/home/model/useSavedScripts"; const LANGUAGES = [ { code: "English", label: "英语 English" }, { code: "日本語", label: "日语 日本語" }, { code: "한국어", label: "韩语 한국어" }, { code: "Français", label: "法语 Français" }, { code: "Deutsch", label: "德语 Deutsch" }, { code: "Español", label: "西班牙语 Español" }, { code: "Русский", label: "俄语 Русский" }, { code: "Italiano", label: "意大利语 Italiano" }, { code: "Português", label: "葡萄牙语 Português" }, ]; interface ScriptEditorProps { text: string; onChangeText: (value: string) => void; onOpenExtractModal: () => void; onOpenRewriteModal: () => void; onGenerateMeta: () => void; isGeneratingMeta: boolean; onTranslate: (targetLang: string) => void; isTranslating: boolean; hasOriginalText: boolean; onRestoreOriginal: () => void; savedScripts: SavedScript[]; onSaveScript: () => void; onLoadScript: (content: string) => void; onDeleteScript: (id: string) => void; } export function ScriptEditor({ text, onChangeText, onOpenExtractModal, onOpenRewriteModal, onGenerateMeta, isGeneratingMeta, onTranslate, isTranslating, hasOriginalText, onRestoreOriginal, savedScripts, onSaveScript, onLoadScript, onDeleteScript, }: ScriptEditorProps) { const [showLangMenu, setShowLangMenu] = useState(false); const langMenuRef = useRef(null); const [showHistoryMenu, setShowHistoryMenu] = useState(false); const historyMenuRef = useRef(null); useEffect(() => { if (!showLangMenu) return; const handleClickOutside = (e: MouseEvent) => { if (langMenuRef.current && !langMenuRef.current.contains(e.target as Node)) { setShowLangMenu(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, [showLangMenu]); useEffect(() => { if (!showHistoryMenu) return; const handleClickOutside = (e: MouseEvent) => { if (historyMenuRef.current && !historyMenuRef.current.contains(e.target as Node)) { setShowHistoryMenu(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, [showHistoryMenu]); const handleSelectLang = (langCode: string) => { setShowLangMenu(false); onTranslate(langCode); }; const formatDate = (ts: number) => { const d = new Date(ts); return `${(d.getMonth() + 1).toString().padStart(2, "0")}-${d.getDate().toString().padStart(2, "0")} ${d.getHours().toString().padStart(2, "0")}:${d.getMinutes().toString().padStart(2, "0")}`; }; return (

一、文案提取与编辑

{/* 历史文案 */}
{showHistoryMenu && (
{savedScripts.length === 0 ? (
暂无保存的文案
) : ( savedScripts.map((script) => (
)) )}
)}
{showLangMenu && (
{hasOriginalText && ( <>
)} {LANGUAGES.map((lang) => ( ))}
)}