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 { useFileStore } from "@/stores/file-store"; export interface BlurFacesControlsProps { settings?: Record; onChange?: (settings: Record) => void; } export function BlurFacesControls({ settings: initialSettings, onChange }: BlurFacesControlsProps) { const { t } = useTranslation(); const [blurRadius, setBlurRadius] = useState(30); const [sensitivity, setSensitivity] = useState(50); const initializedRef = useRef(false); useEffect(() => { if (!initialSettings || initializedRef.current) return; initializedRef.current = true; if (initialSettings.blurRadius != null) setBlurRadius(Number(initialSettings.blurRadius)); if (initialSettings.sensitivity != null) setSensitivity(Number(initialSettings.sensitivity) * 100); }, [initialSettings]); const onChangeRef = useRef(onChange); useEffect(() => { onChangeRef.current = onChange; }); useEffect(() => { onChangeRef.current?.({ blurRadius, sensitivity: sensitivity / 100 }); }, [blurRadius, sensitivity]); return (
{/* Blur radius */}
{blurRadius}
setBlurRadius(Number(e.target.value))} className="w-full mt-1" />
{t.toolSettings["blur-faces"].blurLight} {t.toolSettings["blur-faces"].blurHeavy}
{/* Sensitivity */}
{sensitivity}%
setSensitivity(Number(e.target.value))} className="w-full mt-1" />
{t.toolSettings["blur-faces"].moreFaces} {t.toolSettings["blur-faces"].fewerFaces}
); } export function BlurFacesSettings() { const { t } = useTranslation(); const { files } = useFileStore(); const { processFiles, processAllFiles, processing, error, warning, downloadUrl, originalSize, processedSize, progress, } = useToolProcessor("blur-faces"); const [settings, setSettings] = useState>({}); const handleProcess = () => { if (files.length > 1) { processAllFiles(files, settings); } else { processFiles(files, settings); } }; const hasFile = files.length > 0; return (
{error &&

{error}

} {warning &&

{warning}

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

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

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

)} {/* Process button */} {processing ? ( ) : ( )} {/* Download */} {downloadUrl && ( {t.common.download} )}
); }