import { Download, Loader2 } from "lucide-react"; import { useState } from "react"; import { formatHeaders } from "@/lib/api"; import { useFileStore } from "@/stores/file-store"; export function SplitSettings() { const { files, processing, error, setProcessing, setError } = useFileStore(); const [columns, setColumns] = useState(2); const [rows, setRows] = useState(2); const [downloadReady, setDownloadReady] = useState(false); const handleProcess = async () => { if (files.length === 0) return; setProcessing(true); setError(null); setDownloadReady(false); try { const formData = new FormData(); formData.append("file", files[0]); formData.append("settings", JSON.stringify({ columns, rows })); const res = await fetch("/api/v1/tools/split", { method: "POST", headers: formatHeaders(), body: formData, }); if (!res.ok) { const text = await res.text(); throw new Error(text || `Failed: ${res.status}`); } // Download the ZIP const blob = await res.blob(); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `split-${columns}x${rows}.zip`; a.click(); URL.revokeObjectURL(url); setDownloadReady(true); } catch (err) { setError(err instanceof Error ? err.message : "Split failed"); } finally { setProcessing(false); } }; const hasFile = files.length > 0; const presets = [ { label: "2x2", c: 2, r: 2 }, { label: "3x3", c: 3, r: 3 }, { label: "1x3", c: 1, r: 3 }, { label: "3x1", c: 3, r: 1 }, { label: "4x4", c: 4, r: 4 }, ]; return (

Grid Presets

{presets.map((p) => ( ))}
setColumns(Math.max(1, Number(e.target.value)))} min={1} max={10} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />
setRows(Math.max(1, Number(e.target.value)))} min={1} max={10} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" />

Will produce {columns * rows} parts

{error &&

{error}

} {downloadReady && (

ZIP downloaded successfully

)}
); }