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"; type SheetFormat = "xlsx" | "ods" | "csv"; const ALL_FORMATS: { value: SheetFormat; label: string }[] = [ { value: "xlsx", label: "XLSX" }, { value: "ods", label: "ODS" }, { value: "csv", label: "CSV" }, ]; export function ConvertSpreadsheetSettings() { const { t } = useTranslation(); const s = t.toolSettings["convert-spreadsheet"]; const { files } = useFileStore(); const { processFiles, processAllFiles, processing, error, progress } = useToolProcessor("convert-spreadsheet"); const [outFormat, setOutFormat] = useState("ods"); // Never offer the input's own format as a target. LibreOffice rejects a // same-format conversion ("already in that format"), so drop it from the // options and keep the current selection valid. const inputExt = files[0]?.name.split(".").pop()?.toLowerCase(); const formats = ALL_FORMATS.filter((f) => f.value !== inputExt); const selected = formats.some((f) => f.value === outFormat) ? outFormat : (formats[0]?.value ?? outFormat); const hasFile = files.length > 0; const hasMultiple = files.length > 1; const handleProcess = () => { const settings = { format: selected }; if (hasMultiple) { processAllFiles(files, settings); } else { processFiles(files, settings); } }; return (

{s.hint}

{error &&

{error}

} {processing ? ( ) : ( )}
); } export interface ConvertSpreadsheetControlsProps { settings?: Record; onChange?: (settings: Record) => void; } export function ConvertSpreadsheetControls({ settings: initial, onChange, }: ConvertSpreadsheetControlsProps) { const { t } = useTranslation(); const s = t.toolSettings["convert-spreadsheet"]; const [outFormat, setOutFormat] = useState("xlsx"); const initializedRef = useRef(false); useEffect(() => { if (!initial || initializedRef.current) return; initializedRef.current = true; if (initial.format != null) setOutFormat(initial.format as SheetFormat); }, [initial]); const onChangeRef = useRef(onChange); useEffect(() => { onChangeRef.current = onChange; }); useEffect(() => { onChangeRef.current?.({ format: outFormat }); }, [outFormat]); return (
); }