diff --git a/src/components/video-editor/ExportDialog.tsx b/src/components/video-editor/ExportDialog.tsx deleted file mode 100644 index 0b92ca19..00000000 --- a/src/components/video-editor/ExportDialog.tsx +++ /dev/null @@ -1,367 +0,0 @@ -import { useEffect, useState } from 'react'; -import { X, Download, Loader2 } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import type { ExportProgress } from '@/lib/exporter'; -import { toast } from 'sonner'; // Add this import -import { useScopedT } from "../../contexts/I18nContext"; -import { ExportSettingsMenu } from './ExportSettingsMenu'; -import type { ExportFormat, ExportQuality, GifFrameRate, GifSizePreset } from '@/lib/exporter'; - - -interface ExportDialogProps { - isOpen: boolean; - onClose: () => void; - progress: ExportProgress | null; - isExporting: boolean; - error: string | null; - onCancel?: () => void; - onRetrySave?: () => void; - canRetrySave?: boolean; - exportFormat?: 'mp4' | 'gif'; - exportedFilePath?: string; - exportQuality?: ExportQuality; - onExportQualityChange?: (quality: ExportQuality) => void; - onExportFormatChange?: (format: ExportFormat) => void; - gifFrameRate?: GifFrameRate; - onGifFrameRateChange?: (rate: GifFrameRate) => void; - gifLoop?: boolean; - onGifLoopChange?: (loop: boolean) => void; - gifSizePreset?: GifSizePreset; - onGifSizePresetChange?: (preset: GifSizePreset) => void; - gifOutputDimensions?: { width: number; height: number }; - onStartExport?: () => void; -} - -export function ExportDialog({ - isOpen, - onClose, - progress, - isExporting, - error, - onCancel, - onRetrySave, - canRetrySave = false, - exportFormat = 'mp4', - exportedFilePath, // Add this line - exportQuality = 'good', - onExportQualityChange, - onExportFormatChange, - gifFrameRate = 15, - onGifFrameRateChange, - gifLoop = true, - onGifLoopChange, - gifSizePreset = 'medium', - onGifSizePresetChange, - gifOutputDimensions = { width: 1280, height: 720 }, - onStartExport, -}: ExportDialogProps) { - const t = useScopedT('dialogs'); - const [showSuccess, setShowSuccess] = useState(false); - - // Reset showSuccess when a new export starts or dialog reopens - useEffect(() => { - if (isExporting) { - setShowSuccess(false); - } - }, [isExporting]); - - // Reset showSuccess when dialog opens fresh - useEffect(() => { - if (isOpen && !isExporting && !progress) { - setShowSuccess(false); - } - }, [isOpen, isExporting, progress]); - - useEffect(() => { - if (!isOpen) { - setShowSuccess(false); - } - }, [isOpen]); - - useEffect(() => { - if (!isExporting && progress && progress.percentage >= 100 && !error) { - setShowSuccess(true); - const timer = setTimeout(() => { - setShowSuccess(false); - onClose(); - }, 2000); - return () => clearTimeout(timer); - } - }, [isExporting, progress, error, onClose]); - - if (!isOpen) return null; - - const showSettings = !isExporting && !progress && !error && !showSuccess; - - const formatLabel = exportFormat === 'gif' ? 'GIF' : 'Video'; - - // Determine if we're in the compiling phase (frames done but still exporting) - const isCompiling = isExporting && progress && progress.percentage >= 100 && exportFormat === 'gif'; - const isFinalizing = progress?.phase === 'finalizing'; - const renderProgress = progress?.renderProgress; - - // Get status message based on phase - const getStatusMessage = () => { - if (error) return t('export.pleaseTryAgain'); - if (isCompiling || isFinalizing) { - if (renderProgress !== undefined && renderProgress > 0) { - return t('export.compilingGifProgress', undefined, { progress: renderProgress }); - } - return t('export.compilingGifWait'); - } - return t('export.takeMoment'); - }; - - // Get title based on phase - const getTitle = () => { - if (error) return t('export.exportFailed'); - if (isCompiling || isFinalizing) return t('export.compilingGifTitle'); - return t('export.exportingFormat', undefined, { format: formatLabel }); - }; - - const handleClickShowInFolder = async () => { - if (exportedFilePath) { - try { - const result = await window.electronAPI.revealInFolder(exportedFilePath); - if (!result.success) { - const errorMessage = result.error || result.message || 'Failed to reveal item in folder.'; - console.error('Failed to reveal in folder:', errorMessage); - toast.error(errorMessage); - } - } catch (err) { - const errorMessage = String(err); - console.error('Error calling revealInFolder IPC:', errorMessage); - toast.error(`Error revealing in folder: ${errorMessage}`); - } - } - }; - - return ( - <> -
-
- {showSettings ? ( -
-
-
- {t('export.exportingFormat', undefined, { format: formatLabel })} - Choose format and quality before exporting. -
- -
- -
- ) : ( -
-
-
- {showSuccess ? ( - <> -
- -
-
- {t('export.exportComplete')} - {t('export.formatReady', undefined, { format: formatLabel.toLowerCase() })} - {exportedFilePath && ( - - )} - {exportedFilePath && ( - - {exportedFilePath.split('/').pop()} - - )} -
- - ) : ( - <> - {isExporting ? ( -
- -
- ) : ( -
- -
- )} -
- - {getTitle()} - - - {getStatusMessage()} - -
- - )} -
- {!isExporting && ( - - )} -
- - {error && ( -
-
-
- -
-

{error}

-
- {!isExporting && canRetrySave && onRetrySave && ( - - )} -
- )} - - {!isExporting && !error && canRetrySave && onRetrySave && ( -
- -
- )} - - {isExporting && progress && ( -
-
-
- {isCompiling || isFinalizing ? t('export.compiling') : t('export.renderingFrames')} - - {isCompiling || isFinalizing ? ( - renderProgress !== undefined && renderProgress > 0 ? ( - `${renderProgress}%` - ) : ( - - - {t('export.processing')} - - ) - ) : ( - `${progress.percentage.toFixed(0)}%` - )} - -
-
- {isCompiling || isFinalizing ? ( - // Show render progress if available, otherwise animated indeterminate bar - renderProgress !== undefined && renderProgress > 0 ? ( -
- ) : ( -
-
- -
- ) - ) : ( -
- )} -
-
- -
-
-
- {isCompiling || isFinalizing ? t('export.status') : t('export.format')} -
-
- {isCompiling || isFinalizing ? t('export.compilingStatus') : formatLabel} -
-
-
-
{t('export.frames')}
-
- {progress.currentFrame} / {progress.totalFrames} -
-
-
- - {onCancel && ( -
- -
- )} -
- )} - - {showSuccess && ( -
-

- {t('export.savedSuccess', undefined, { format: formatLabel })} -

-
- )} -
- )} -
- - ); -} -