Frontend : écran Messages branché sur l'envoi d'emails

- api : PlanningNotificationRequest/Result dans schema.ts, méthode
  notifications.sendPlanning (http + mock), hook useSendPlanningNotification
- mock : compte les destinataires avec/sans email, émet des liens magiques
  quand {lien_connexion} est présent
- ConfigMail : plus une maquette. Éditeur objet/corps, variables cliquables
  ({prenom} {nom} {nb_creneaux} {nb_heures} {creneaux} {lien_connexion}),
  boutons « Envoyer le récapitulatif » et « Envoyer avec lien de connexion »,
  retour d'envoi (queued / sans adresse) et ErrorNote
- i18n config.mail.* mis à jour ; onglet « MESSAGES » (plus « (MAQUETTE) »)

typecheck + lint + build + smoke : OK

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
AdamThomas
2026-09-10 08:13:28 +02:00
co-authored by Claude Sonnet 5
parent b268e308ab
commit 6b08dcc953
8 changed files with 151 additions and 35 deletions
+21
View File
@@ -239,3 +239,24 @@ export interface MagicLinkRequest {
export interface VerifyRequest {
token: string;
}
// --------------------------------------------------------------------------- //
// Notifications par email //
// --------------------------------------------------------------------------- //
/**
* `subject` / `body` sont des modèles. Variables : {prenom} {nom}
* {nb_creneaux} {nb_heures} {creneaux} {lien_connexion} (ce dernier déclenche
* l'émission d'un lien magique personnel).
*/
export interface PlanningNotificationRequest {
subject?: string | null;
body?: string | null;
/** null / absent = tous les bénévoles de l'édition qui ont un email. */
volunteer_ids?: string[] | null;
}
export interface PlanningNotificationResult {
queued: number;
skipped_no_email: number;
recipients: string[];
}