import { Download } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { ProgressCard } from "@/components/common/progress-card"; import { useTranslation } from "@/contexts/i18n-context"; import { useToolProcessor } from "@/hooks/use-tool-processor"; import { format } from "@/lib/format"; import { useFileStore } from "@/stores/file-store"; export interface RestorePhotoControlsProps { settings?: Record; onChange?: (settings: Record) => void; } export function RestorePhotoControls({ settings: initialSettings, onChange, }: RestorePhotoControlsProps) { const { t } = useTranslation(); const [scratchRemoval, setScratchRemoval] = useState(true); const [faceEnhancement, setFaceEnhancement] = useState(true); const [fidelity, setFidelity] = useState(70); const [denoise, setDenoise] = useState(true); const [denoiseStrength, setDenoiseStrength] = useState(25); const [colorize, setColorize] = useState(false); const [colorizeStrength, setColorizeStrength] = useState(85); // One-time init from pipeline settings const initializedRef = useRef(false); useEffect(() => { if (!initialSettings || initializedRef.current) return; initializedRef.current = true; if (initialSettings.scratchRemoval != null) setScratchRemoval(Boolean(initialSettings.scratchRemoval)); if (initialSettings.faceEnhancement != null) setFaceEnhancement(Boolean(initialSettings.faceEnhancement)); if (initialSettings.fidelity != null) setFidelity(Number(initialSettings.fidelity) * 100); if (initialSettings.denoise != null) setDenoise(Boolean(initialSettings.denoise)); if (initialSettings.denoiseStrength != null) setDenoiseStrength(Number(initialSettings.denoiseStrength)); if (initialSettings.colorize != null) setColorize(Boolean(initialSettings.colorize)); if (initialSettings.colorizeStrength != null) setColorizeStrength(Number(initialSettings.colorizeStrength)); }, [initialSettings]); // Emit settings on change const onChangeRef = useRef(onChange); useEffect(() => { onChangeRef.current = onChange; }); useEffect(() => { onChangeRef.current?.({ scratchRemoval, faceEnhancement, fidelity: fidelity / 100, denoise, denoiseStrength, colorize, colorizeStrength, }); }, [ scratchRemoval, faceEnhancement, fidelity, denoise, denoiseStrength, colorize, colorizeStrength, ]); return (
{/* Feature toggles */}
{/* Scratch Removal */} {/* Face Enhancement */} {/* Fidelity slider (only when face enhancement is on) */} {faceEnhancement && (

Face Fidelity

{fidelity}%
setFidelity(Number(e.target.value))} className="w-full h-1.5 rounded-full appearance-none bg-muted accent-primary" />
Enhanced Faithful
)} {/* Noise Reduction */} {/* Denoise strength slider */} {denoise && (

Denoise Strength

{denoiseStrength}
setDenoiseStrength(Number(e.target.value))} className="w-full h-1.5 rounded-full appearance-none bg-muted accent-primary" />
Subtle Strong
)}
{/* Auto-Colorize */} {/* Colorize strength slider */} {colorize && (

Colorize Strength

{colorizeStrength}%
setColorizeStrength(Number(e.target.value))} className="w-full h-1.5 rounded-full appearance-none bg-muted accent-primary" />
Subtle Vivid
)}
); } export function RestorePhotoSettings() { const { t } = useTranslation(); const { files } = useFileStore(); const { processFiles, processAllFiles, processing, error, downloadUrl, originalSize, processedSize, progress, } = useToolProcessor("restore-photo"); const [settings, setSettings] = useState>({}); const handleProcess = () => { if (files.length > 1) { processAllFiles(files, settings); } else { processFiles(files, settings); } }; const hasFile = files.length > 0; const hasMultiple = files.length > 1; return (
{/* Error */} {error &&

{error}

} {/* Size info */} {originalSize != null && processedSize != null && (

Original: {(originalSize / 1024).toFixed(1)} KB

Restored: {(processedSize / 1024).toFixed(1)} KB

)} {/* Process button / progress */} {processing ? ( ) : ( )} {/* Download (single file) */} {!hasMultiple && downloadUrl && ( Download )}
); }