import { useState, useRef, type FormEvent } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { SignaturePad, type SignaturePadRef } from "./SignaturePad"; import { Turnstile } from "@marsidev/react-turnstile"; import { Eraser, Check, CheckCircle, AlertCircle } from "lucide-react"; import type { Language } from "@/types/petition"; interface SignatureFormProps { language: Language; onSubmit: (data: { name: string; idCard: string; signature: string; turnstileToken: string; }) => Promise; } export function SignatureForm({ language, onSubmit }: SignatureFormProps) { const [name, setName] = useState(""); const [idCardDigits, setIdCardDigits] = useState(""); const [consent, setConsent] = useState(false); const [turnstileToken, setTurnstileToken] = useState(null); const [message, setMessage] = useState<{ text: string; type: "success" | "error"; } | null>(null); const [isSubmitting, setIsSubmitting] = useState(false); const signaturePadRef = useRef(null); const isRtl = language === "dv"; const handleClear = () => { signaturePadRef.current?.clear(); }; const showMessage = (text: string, type: "success" | "error") => { setMessage({ text, type }); setTimeout(() => setMessage(null), 5000); }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); // Validate signature if (signaturePadRef.current?.isEmpty()) { showMessage( language === "en" ? "Please provide your signature." : "ސޮއި ލިޔުއްވާ.", "error", ); return; } // Validate consent if (!consent) { showMessage( language === "en" ? "Please confirm that your submission will be sent to the Parliament Petition Committee and that your information is true." : "މައުލޫމާތު ކަށަވަރުކޮށް، ޕެޓިޝަން ކޮމިޓީއަށް ފޮނުވުމަށް އެއްބަސްވެލައްވާ.", "error", ); return; } // Validate ID card (6 digits) const idCardPattern = /^\d{6}$/; if (!idCardPattern.test(idCardDigits)) { showMessage( language === "en" ? "Please enter your ID number as 6 digits (numbers only)." : "ކާޑު ނަންބަރު 6 އަކުރު ޖައްސަވާ.", "error", ); return; } // Validate turnstile if (!turnstileToken && !import.meta.env.DEV) { showMessage( language === "en" ? "Please complete the captcha challenge." : "ކެޕްޗާ ފުރިހަމަ ކުރައްވާ.", "error", ); return; } const signature = signaturePadRef.current?.toSVG(); if (!signature) { showMessage( language === "en" ? "Please provide your signature." : "ސޮއި ލިޔުއްވާ.", "error", ); return; } setIsSubmitting(true); try { await onSubmit({ name, idCard: "A" + idCardDigits, signature, turnstileToken: turnstileToken || "DEV_BYPASS_TOKEN", }); showMessage( language === "en" ? "Signature submitted successfully!" : "ސޮއި ކޯމިއުކުރެވިއްޖެ!", "success", ); // Reset form setName(""); setIdCardDigits(""); setConsent(false); signaturePadRef.current?.clear(); } catch (error) { showMessage( language === "en" ? `Failed to submit signature: ${error instanceof Error ? error.message : "Unknown error"}` : "ސޮއި ހުށަހެޅުމުން ކުށެއް ދިމާވެއްޖެ.", "error", ); } finally { setIsSubmitting(false); } }; return (

{language === "en" ? "Sign this Petition" : "މި މައްސަލައިގައި ސޮއި ކުރައްވާ"}

{/* Name Field */}
setName(e.target.value)} minLength={3} maxLength={30} required className={isRtl ? "text-right" : ""} placeholder={language === "en" ? "Enter your full name" : ""} />
{/* ID Card Field */}
A setIdCardDigits(e.target.value.replace(/\D/g, "").slice(0, 6)) } maxLength={6} required placeholder="XXXXXX" className="border-0 focus-visible:ring-0 text-left shadow-none" dir="ltr" />
{/* Signature Pad */}

{language === "en" ? "Sign in the box above" : "މަތީގައިވާ ގޮޅީގައި ސޮއި ކުރައްވާ"}

{/* Consent Checkbox */}
setConsent(checked === true)} className="mt-1" />
{/* Message Display */} {message && ( {message.type === "error" ? ( ) : ( )} {message.text} )} {/* Turnstile and Submit */}
setTurnstileToken(null)} onExpire={() => setTurnstileToken(null)} />
); }