"use client"; import { useRef, useState } from "react"; export function ImageConsentForm({ saveAction, defaultName, compact = false, currentDecision = null, }: { saveAction: (formData: FormData) => Promise; defaultName: string; compact?: boolean; currentDecision?: "accepted" | "refused" | null; }) { const canvasRef = useRef(null); const [drawing, setDrawing] = useState(false); const [signature, setSignature] = useState(""); const [error, setError] = useState(""); function point(event: React.PointerEvent) { const canvas = canvasRef.current; if (!canvas) return null; const rect = canvas.getBoundingClientRect(); return { x: ((event.clientX - rect.left) / rect.width) * canvas.width, y: ((event.clientY - rect.top) / rect.height) * canvas.height, }; } function draw(event: React.PointerEvent) { if (!drawing) return; const p = point(event); const ctx = canvasRef.current?.getContext("2d"); if (!p || !ctx) return; ctx.lineTo(p.x, p.y); ctx.strokeStyle = "#13324F"; ctx.lineWidth = 3; ctx.lineCap = "round"; ctx.stroke(); setSignature(canvasRef.current?.toDataURL("image/png") ?? ""); } function start(event: React.PointerEvent) { const p = point(event); const ctx = canvasRef.current?.getContext("2d"); if (!p || !ctx) return; event.currentTarget.setPointerCapture(event.pointerId); ctx.beginPath(); ctx.moveTo(p.x, p.y); setDrawing(true); } function clear() { const canvas = canvasRef.current; const ctx = canvas?.getContext("2d"); if (canvas && ctx) ctx.clearRect(0, 0, canvas.width, canvas.height); setSignature(""); setError(""); } function onSubmit(event: React.FormEvent) { const submitter = (event.nativeEvent as SubmitEvent).submitter as HTMLButtonElement | null; if (submitter?.value === "accepted" && !signature) { event.preventDefault(); setError("Signez dans le cadre pour valider l'autorisation."); } } if (currentDecision === "accepted") { return (
); } return (
J'autorise l'association Plein R à utiliser mon image dans les supports liés à la vie associative: site internet, réseaux sociaux et supports imprimés. Autorisation gratuite, valable 5 ans, sans vente à des tiers. Je peux retirer mon accord à tout moment.
setDrawing(false)} onPointerCancel={() => setDrawing(false)} style={{ width: "100%", height: compact ? 120 : 150, display: "block", touchAction: "none", background: "#fff", border: "1px dashed #d6c9ad", borderRadius: 12, }} /> {error &&
{error}
}
); }