Checkpoint: Amélioration du test de rappels avec envoi multiple et indicateur de progression

- Modification du backend pour envoyer un email par inscrit confirmé (tous à l'adresse de test)
- Ajout d'un indicateur de progression moderne avec animation (spinner + effet ping)
- Message de succès affichant le nombre d'emails envoyés
- Validation avec séquence "test 3" : 3 emails envoyés correctement (4ème inscrit sans email ignoré)
- Synchronisation complète de la structure de la table logsrappels avec le VPS
This commit is contained in:
Manus
2026-01-22 08:50:00 -05:00
parent 94fed67d19
commit e3dffb85f4
5 changed files with 112 additions and 5 deletions

View File

@@ -36,6 +36,7 @@ export default function AdminSequences() {
const [isConfirmTestOpen, setIsConfirmTestOpen] = useState(false);
const [sequenceToTest, setSequenceToTest] = useState<number | null>(null);
const [testEmail, setTestEmail] = useState("");
const [sendingProgress, setSendingProgress] = useState<{ current: number; total: number } | null>(null);
const [formData, setFormData] = useState({
formationId: "",
@@ -91,13 +92,15 @@ export default function AdminSequences() {
});
const testerRappelMutation = trpc.rappels.testerRappel.useMutation({
onSuccess: () => {
toast.success("Email de test envoyé avec succès");
onSuccess: (data) => {
setSendingProgress(null);
toast.success(`${data.nbEnvoyes} email(s) de test envoyé(s) avec succès`);
setIsConfirmTestOpen(false);
setSequenceToTest(null);
setTestEmail("");
},
onError: (error) => {
setSendingProgress(null);
toast.error(`Erreur lors de l'envoi du test : ${error.message}`);
setIsConfirmTestOpen(false);
setSequenceToTest(null);
@@ -1104,6 +1107,27 @@ export default function AdminSequences() {
disabled={testerRappelMutation.isPending}
/>
</div>
{/* Indicateur de progression */}
{testerRappelMutation.isPending && (
<div className="space-y-3 p-4 bg-muted/50 rounded-lg border">
<div className="flex items-center gap-3">
<div className="relative flex h-10 w-10 shrink-0">
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"></span>
<span className="relative inline-flex rounded-full h-10 w-10 bg-primary items-center justify-center">
<svg className="animate-spin h-5 w-5 text-primary-foreground" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
</span>
</div>
<div className="flex-1">
<p className="text-sm font-medium">Envoi en cours...</p>
<p className="text-xs text-muted-foreground">Veuillez patienter pendant l'envoi des emails de test</p>
</div>
</div>
</div>
)}
</div>
<div className="flex justify-end gap-2">
<Button