import { Download } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { ProgressCard } from "@/components/common/progress-card"; 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 [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" />
Light Heavy
{/* Sensitivity */}
{sensitivity}%
setSensitivity(Number(e.target.value))} className="w-full mt-1" />
More faces Fewer false positives
); } export function BlurFacesSettings() { const { files } = useFileStore(); const { processFiles, processAllFiles, processing, error, 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 &&

{error}

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

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

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

)} {/* Process button */} {processing ? ( ) : ( )} {/* Download */} {downloadUrl && ( Download )}
); }