import { Download, Loader2, Upload } from "lucide-react"; import { useRef, useState } from "react"; import { useFileStore } from "@/stores/file-store"; type Position = "center" | "top-left" | "top-right" | "bottom-left" | "bottom-right"; function getToken(): string { return localStorage.getItem("stirling-token") || ""; } export function WatermarkImageSettings() { const { files, processing, error, setProcessing, setError, setProcessedUrl, setSizes, setJobId } = useFileStore(); const [position, setPosition] = useState("bottom-right"); const [opacity, setOpacity] = useState(50); const [scale, setScale] = useState(25); const [watermarkFile, setWatermarkFile] = useState(null); const [downloadUrl, setDownloadUrl] = useState(null); const [originalSize, setOriginalSize] = useState(null); const [processedSize, setProcessedSize] = useState(null); const watermarkInputRef = useRef(null); const handleProcess = async () => { if (files.length === 0 || !watermarkFile) return; setProcessing(true); setError(null); setDownloadUrl(null); try { const formData = new FormData(); formData.append("file", files[0]); formData.append("watermark", watermarkFile); formData.append("settings", JSON.stringify({ position, opacity, scale })); const res = await fetch("/api/v1/tools/watermark-image", { method: "POST", headers: { Authorization: `Bearer ${getToken()}` }, body: formData, }); if (!res.ok) { const body = await res.json().catch(() => ({})); throw new Error(body.error || `Processing failed: ${res.status}`); } const result = await res.json(); setJobId(result.jobId); setProcessedUrl(result.downloadUrl); setDownloadUrl(result.downloadUrl); setOriginalSize(result.originalSize); setProcessedSize(result.processedSize); setSizes(result.originalSize, result.processedSize); } catch (err) { setError(err instanceof Error ? err.message : "Processing failed"); } finally { setProcessing(false); } }; const hasFile = files.length > 0; return (
setWatermarkFile(e.target.files?.[0] ?? null)} className="hidden" />
{opacity}%
setOpacity(Number(e.target.value))} className="w-full mt-1" />
{scale}%
setScale(Number(e.target.value))} className="w-full mt-1" />
{error &&

{error}

} {originalSize != null && processedSize != null && (

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

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

)} {downloadUrl && ( Download )}
); }