import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { trpc } from "@/lib/trpc"; import { CheckCircle2, Loader2, XCircle, PenTool } from "lucide-react"; import { useEffect, useState } from "react"; import { useParams } from "wouter"; import { toast } from "sonner"; import SignaturePadComponent from "@/components/SignaturePad"; export default function EmargementScan() { const { token } = useParams<{ token: string }>(); const [email, setEmail] = useState(""); const [selectedInscriptionId, setSelectedInscriptionId] = useState(null); const [selectedDateId, setSelectedDateId] = useState(null); const [selectedPeriode, setSelectedPeriode] = useState<"matin" | "apres_midi">("matin"); const [success, setSuccess] = useState(false); const [heureEnregistrement, setHeureEnregistrement] = useState(null); const [error, setError] = useState(null); const [showSignaturePad, setShowSignaturePad] = useState(false); const [signatureDataUrl, setSignatureDataUrl] = useState(null); // Récupérer l'apprenant par email const { data: apprenant, refetch: refetchApprenant } = trpc.apprenants.getByEmail.useQuery( { email }, { enabled: false } ); // Récupérer les inscriptions de l'apprenant avec les dates const { data: inscriptions } = trpc.inscriptions.listByApprenantWithDates.useQuery( { apprenantId: apprenant?.id || 0 }, { enabled: !!apprenant } ); // Récupérer les dates de formation pour l'inscription sélectionnée const selectedInscription = inscriptions?.find((i) => i.inscription.id === selectedInscriptionId); // Valider la présence const { mutate: validerPresence, isPending: validating } = trpc.presences.valider.useMutation({ onSuccess: () => { const now = new Date(); setHeureEnregistrement(now); setSuccess(true); toast.success("Présence validée avec succès !"); }, onError: (error) => { setError(error.message); toast.error("Erreur lors de la validation", { description: error.message, }); }, }); const handleSaveSignature = (dataUrl: string) => { setSignatureDataUrl(dataUrl); setShowSignaturePad(false); // Valider automatiquement après la signature handleValiderWithSignature(dataUrl); }; const handleSearchEmail = async () => { if (!email) { toast.error("Veuillez saisir votre email"); return; } refetchApprenant(); }; const handleValider = () => { if (!selectedInscriptionId || !selectedDateId) { toast.error("Veuillez sélectionner une date de formation"); return; } // Afficher le pad de signature au lieu de valider directement setShowSignaturePad(true); }; const handleValiderWithSignature = (dataUrl: string) => { if (!selectedInscriptionId || !selectedDateId) { toast.error("Veuillez sélectionner une date de formation"); return; } validerPresence({ token, inscriptionId: selectedInscriptionId, dateFormationId: selectedDateId, periode: selectedPeriode, modeValidation: "qrcode", signatureDataUrl: dataUrl, }); }; // Déterminer les dates disponibles const datesDisponibles = (selectedInscription?.sequence as any)?.dates || []; if (success) { return (
Présence validée ! Votre présence a été enregistrée avec succès
{heureEnregistrement && (

🕒 Heure d'enregistrement

{heureEnregistrement.toLocaleTimeString("fr-FR", { hour: "2-digit", minute: "2-digit", second: "2-digit", })}

{heureEnregistrement.toLocaleDateString("fr-FR", { weekday: "long", year: "numeric", month: "long", day: "numeric", })}

)}

Merci d'avoir confirmé votre présence. Vous pouvez maintenant fermer cette page.

); } if (error) { return (
Erreur {error}
); } return (
Émargement numérique Validez votre présence en renseignant vos informations {/* Étape 1: Recherche par email */} {!apprenant && (
setEmail(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { handleSearchEmail(); } }} />
)} {/* Étape 2: Sélection de l'inscription et de la date */} {apprenant && !success && (

{apprenant.prenom} {apprenant.nom}

{apprenant.email}

{inscriptions && inscriptions.length > 0 ? ( <>
{selectedInscriptionId && datesDisponibles.length > 0 && ( <>
)} ) : (

Aucune inscription trouvée pour cet email

)}
)}
{showSignaturePad && ( setShowSignaturePad(false)} /> )}
); }