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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user