From da8ec0ba1bd713bd01926a2db9464b4b1d2fe96e Mon Sep 17 00:00:00 2001 From: Kevin Ressegaire <176156975+earzalien@users.noreply.github.com> Date: Sun, 22 Mar 2026 11:56:41 +0100 Subject: [PATCH 1/4] feat: add invitation email option --- client/src/pages/TripInvitation.tsx | 31 +++++-- client/src/pages/styles/TripInvitation.css | 13 +++ package-lock.json | 83 +++++++++++++++++-- server/.env.sample | 4 + server/package.json | 3 +- server/src/libs/resend.ts | 5 ++ .../modules/invitation/invitationActions.ts | 25 +++++- 7 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 server/src/libs/resend.ts diff --git a/client/src/pages/TripInvitation.tsx b/client/src/pages/TripInvitation.tsx index 91eb18a..37e325e 100644 --- a/client/src/pages/TripInvitation.tsx +++ b/client/src/pages/TripInvitation.tsx @@ -35,7 +35,7 @@ function TripInvitation({ email: "", message: "", }); - + const [copyLink, setCopyLink] = useState(false); const [loading, setLoading] = useState(false); const formatDate = (dateString: string) => { @@ -62,6 +62,7 @@ function TripInvitation({ const cancelInvitation = (e: React.MouseEvent) => { setInvitationForm({ email: "", message: "" }); + setCopyLink(false); if (onClose) onClose(e); }; @@ -74,7 +75,7 @@ function TripInvitation({ const copyToClipboard = async (text: string) => { try { await navigator.clipboard.writeText(text); - toast.success("Lien d’invitation copié 📋"); + toast.success("Lien d'invitation copié"); } catch { toast.error("Impossible de copier le lien"); } @@ -100,8 +101,13 @@ function TripInvitation({ throw new Error(data.error || "Erreur lors de l'envoi"); } - await copyToClipboard(data.invitationLink); + if (copyLink) { + await copyToClipboard(data.invitationLink); + toast.success("Email envoyé avec succès"); + } + setInvitationForm({ email: "", message: "" }); + setCopyLink(false); } catch { toast.error("Erreur lors de l'envoi de l'invitation"); } finally { @@ -120,7 +126,6 @@ function TripInvitation({ }} aria-modal="true" > -
@@ -162,6 +167,7 @@ function TripInvitation({ onChange={updateInvitationForm} required placeholder="adresse@email.com" + disabled={loading} /> @@ -172,15 +178,28 @@ function TripInvitation({ value={invitationForm.message} onChange={updateInvitationForm} placeholder="Ajoutez un message personnalisé..." + disabled={loading} /> + +