import React, { useRef, useState } from 'react'; import { Upload, CheckCircle2, Circle } from 'lucide-react'; import TrimModal from './TrimModal'; import { DEFAULT_SUBTITLE_DEFAULTS, SubtitleDefaults } from '../types'; import { useI18n } from '../i18n'; const LANGUAGES = [ { code: 'zh', apiName: 'Chinese', group: 'C' }, { code: 'yue', apiName: 'Cantonese', group: 'C' }, { code: 'en', apiName: 'English', group: 'E' }, { code: 'id', apiName: 'Indonesian', group: 'I' }, { code: 'de', apiName: 'German', group: 'G' }, { code: 'fil', apiName: 'Filipino', group: 'F' }, { code: 'fr', apiName: 'French', group: 'F' }, ]; export default function UploadScreen({ onUpload, }: { onUpload: ( file: File, targetLanguage: string, ttsLanguage: string, subtitleDefaults: SubtitleDefaults, startTime?: number, endTime?: number, ) => void }) { const { m, format } = useI18n(); const [mode, setMode] = useState<'editing' | 'simple'>('editing'); const [selectedTtsLanguage, setSelectedTtsLanguage] = useState('en'); const [showTrimModal, setShowTrimModal] = useState(false); const [tempFile, setTempFile] = useState(null); const [subtitleDefaults, setSubtitleDefaults] = useState(DEFAULT_SUBTITLE_DEFAULTS); const fileInputRef = useRef(null); const activeModeLabel = mode === 'editing' ? m.upload.editingMode : m.upload.simpleMode; const previewFontSize = Math.max(10, Math.round(subtitleDefaults.fontSize * 0.5)); const previewTextShadowSize = previewFontSize >= 18 ? 2 : 1; const settingsCardClass = 'app-surface rounded-[24px] border border-white/70 px-4 py-4 shadow-[0_18px_60px_-34px_rgba(15,23,42,0.3)] sm:px-5'; const clearPendingUpload = () => { setTempFile(null); if (fileInputRef.current) { fileInputRef.current.value = ''; } }; const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files[0]) { setTempFile(e.target.files[0]); setShowTrimModal(true); } }; const handleTrimConfirm = (file: File, startTime: number, endTime: number) => { setShowTrimModal(false); const ttsLanguage = LANGUAGES.find((language) => language.code === selectedTtsLanguage)?.apiName || 'English'; onUpload(file, 'English', ttsLanguage, subtitleDefaults, startTime, endTime); }; return (

{m.upload.uploadPanelTitle}

{m.upload.uploadPanelDescription}

{m.upload.subtitleDefaults}

{m.upload.subtitleDefaultsDesc}

{m.upload.subtitlePreview}

{format(m.upload.fromBottom, { value: subtitleDefaults.bottomOffsetPercent })}
setSubtitleDefaults((previous) => ({ ...previous, bottomOffsetPercent: Number(e.target.value), })) } className="w-full accent-sky-500" />
{format(m.upload.pxValue, { value: subtitleDefaults.fontSize })}
setSubtitleDefaults((previous) => ({ ...previous, fontSize: Number(e.target.value), })) } className="w-full accent-sky-500" />

{m.upload.supportedFormats}

{activeModeLabel}

{m.upload.uploadVideo}

{m.upload.clickToUpload}

{m.upload.modeWorkflowTitle}

{m.upload.modeWorkflowDescription}

{m.upload.languageDubbingTitle}

{m.upload.languageDubbingDescription}

{m.upload.subtitleLanguage}

{m.upload.subtitleLanguageHint}

{m.upload.languages.en}

{m.upload.ttsLanguage}

{m.upload.ttsLanguageHint}

{LANGUAGES.map((lang) => ( ))}
{showTrimModal && tempFile && ( { setShowTrimModal(false); clearPendingUpload(); }} onConfirm={handleTrimConfirm} /> )}
); }