import { useState, useEffect } from 'react'; import { invoke } from '@tauri-apps/api/core'; import { FileSelector } from './components/FileSelector'; import './styles/index.css'; interface FileState { path: string; name: string; } function App() { const [videoFile, setVideoFile] = useState(null); const [subtitleFile, setSubtitleFile] = useState(null); const [progress, setProgress] = useState(0); const [isProcessing, setIsProcessing] = useState(false); const [error, setError] = useState(null); const [addBlackBar, setAddBlackBar] = useState(true); const [resizeTo720p, setResizeTo720p] = useState(true); useEffect(() => { invoke('check_dependencies') .catch(err => { setError(err as string); console.error('Dependency check failed:', err); }); }, []); const handleVideoSelect = (path: string) => { const name = path.split('/').pop() || ''; setVideoFile({ path, name }); }; const handleSubtitleSelect = (path: string) => { const name = path.split('/').pop() || ''; setSubtitleFile({ path, name }); }; useEffect(() => { let intervalId: number | undefined; if (isProcessing) { // Poll for progress every 100ms while processing intervalId = window.setInterval(async () => { try { const currentProgress = await invoke('get_progress'); console.log('Progress update:', currentProgress); setProgress(currentProgress); } catch (error) { console.error('Failed to get progress:', error); } }, 100); } return () => { if (intervalId !== undefined) { window.clearInterval(intervalId); } }; }, [isProcessing]); const handleMerge = async () => { if (!videoFile || !subtitleFile) return; setIsProcessing(true); setProgress(0); try { console.log('Starting merge with args:', { videoPath: videoFile.path, subtitlePath: subtitleFile.path, addBlackBar, resizeTo720p }); const result = await invoke('merge_video_subtitle', { args: { video_path: videoFile.path, subtitle_path: subtitleFile.path, add_black_bar: addBlackBar, resize_to_720p: resizeTo720p } }); console.log('Merge completed:', result); setProgress(100); } catch (error) { console.error('Error merging files:', error); setError(error as string); } finally { setIsProcessing(false); } }; return (

Video Subtitle Merger 2.0

Video file:

{videoFile?.name || 'No file selected'}

Subtitle file:

{subtitleFile?.name || 'No file selected'}

{isProcessing ? `${Math.round(progress)}%` : ''}

{error && (
Error: {error}
)}
); } export default App;