"use client"; import { useRef, useState } from "react"; import { saveSignature, removeSignature } from "./actions"; import { Upload, X } from "lucide-react"; interface Props { currentSignatureUrl: string | null; } export function SignatureUploader({ currentSignatureUrl }: Props) { const inputRef = useRef(null); const [preview, setPreview] = useState(null); const [pending, setPending] = useState(false); const [removing, setRemoving] = useState(false); const [error, setError] = useState(""); const [success, setSuccess] = useState(""); function handleFileChange(e: React.ChangeEvent) { const file = e.target.files?.[0]; if (!file) return; setError(""); setSuccess(""); setPreview(URL.createObjectURL(file)); } async function handleUpload(e: React.FormEvent) { e.preventDefault(); const file = inputRef.current?.files?.[0]; if (!file) { setError("Please select a file first"); return; } const fd = new FormData(); fd.append("signature", file); setPending(true); setError(""); setSuccess(""); const result = await saveSignature(fd); setPending(false); if ("error" in result) { setError(result.error); } else { setSuccess("Signature saved successfully."); setPreview(null); if (inputRef.current) inputRef.current.value = ""; } } async function handleRemove() { setRemoving(true); setError(""); setSuccess(""); const result = await removeSignature(); setRemoving(false); if ("error" in result) setError(result.error); else setSuccess("Signature removed."); } const displayUrl = preview ?? currentSignatureUrl; return (
{displayUrl && (

{preview ? "Preview" : "Current signature"}

{/* eslint-disable-next-line @next/next/no-img-element */} Signature
)}
inputRef.current?.click()} >

Click to select signature image

PNG, JPG or WebP — max 2 MB

{error && (

{error}

)} {success && (

{success}

)}
{currentSignatureUrl && !preview && ( )}
); }