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 function VideoToGifSettings() { const { t } = useTranslation(); const s = t.toolSettings["video-to-gif"]; const { files } = useFileStore(); const { processFiles, processAllFiles, processing, error, progress } = useToolProcessor("video-to-gif"); const [fps, setFps] = useState(12); const [width, setWidth] = useState(480); const [startS, setStartS] = useState(0); const [durationS, setDurationS] = useState(5); const hasFile = files.length > 0; const hasMultiple = files.length > 1; const handleProcess = () => { const settings = { fps, width, startS, durationS }; if (hasMultiple) { processAllFiles(files, settings); } else { processFiles(files, settings); } }; return (
setFps(Number(e.target.value))} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
setWidth(Number(e.target.value))} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
setStartS(Number(e.target.value))} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
setDurationS(Number(e.target.value))} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
{error &&

{error}

} {processing ? ( ) : ( )}
); } export interface VideoToGifControlsProps { settings?: Record; onChange?: (settings: Record) => void; } export function VideoToGifControls({ settings: initial, onChange }: VideoToGifControlsProps) { const { t } = useTranslation(); const s = t.toolSettings["video-to-gif"]; const [fps, setFps] = useState(12); const [width, setWidth] = useState(480); const [startS, setStartS] = useState(0); const [durationS, setDurationS] = useState(5); const initializedRef = useRef(false); useEffect(() => { if (!initial || initializedRef.current) return; initializedRef.current = true; if (initial.fps != null) setFps(Number(initial.fps)); if (initial.width != null) setWidth(Number(initial.width)); if (initial.startS != null) setStartS(Number(initial.startS)); if (initial.durationS != null) setDurationS(Number(initial.durationS)); }, [initial]); const onChangeRef = useRef(onChange); useEffect(() => { onChangeRef.current = onChange; }); useEffect(() => { onChangeRef.current?.({ fps, width, startS, durationS }); }, [fps, width, startS, durationS]); return (
setFps(Number(e.target.value))} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
setWidth(Number(e.target.value))} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
setStartS(Number(e.target.value))} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
setDurationS(Number(e.target.value))} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
); }