From 4c8ca8a7b48d8a783946baaa5fb3f0398059746c Mon Sep 17 00:00:00 2001
From: Brieuc Dubois <git@bhasher.com>
Date: Wed, 9 Oct 2024 22:14:35 +0300
Subject: [PATCH] Improve booking logic #113

---
 docs/cal.com.md                  |  7 ++-----
 frontend/src/lang/fr.json        |  4 +++-
 frontend/src/routes/+page.svelte | 26 +++++++++++++++++++-------
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/docs/cal.com.md b/docs/cal.com.md
index 915fdca4..e77616c3 100644
--- a/docs/cal.com.md
+++ b/docs/cal.com.md
@@ -2,8 +2,5 @@ LanguageLab utilise le site https://cal.com pour programmer les séances entre l
 
 Afin que l'intégration soit réussie, il est nécessaire de suivre les étapes suivantes:
  - Créer un compte sur https://cal.com.
- - Créer un nouveau type d'événement de 60 mins (https://app.cal.com/event-types -> [+ Nouveau]).
- - Créer un webhook (onglet "Webhooks") avec l'URL https://languagelab.sipr.ucl.ac.be/api/v1/webhooks/sessions comme Lien de l'abonné. Tous les "Déclencheurs d'évènement" (triggers) peuvent être laissés tels quel. "Secret" peut être laissé vide. [Créer un webhook]
-   ![](cal-webhook.png)
- - Copier le lien vers l'évènement [🔗], p.ex. https://cal.com/username/eventtype
- - Coller le lien dans https://languagelab.sipr.ucl.ac.be/tutor/timeslots.
+ - Créer un nouveau type d'événement de 60 mins (https://app.cal.com/event-types -> [+ Nouveau]) avec un nom cohérent, par exemple `languagelab-tutorat`
+ - Indiquer le lien de l'évenement dans https://languagelab.sipr.ucl.ac.be/tutor/timeslots. Example: `username/languagelab-tutorat`
diff --git a/frontend/src/lang/fr.json b/frontend/src/lang/fr.json
index fcd432fa..ee50fe12 100644
--- a/frontend/src/lang/fr.json
+++ b/frontend/src/lang/fr.json
@@ -40,7 +40,9 @@
 		"currentSessions": "Sessions en cours",
 		"plannedSessions": "Sessions planifiées",
 		"pastSessions": "Sessions terminées",
-		"newContact": "Ajouter un contact"
+		"newContact": "Ajouter un contact",
+		"bookingSuccessful": "Session réservée avec succès",
+		"bookingFailed": "Erreur lors de la réservation de la session"
 	},
 	"login": {
 		"email": "E-mail",
diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte
index 5b3bd918..5acdde5d 100644
--- a/frontend/src/routes/+page.svelte
+++ b/frontend/src/routes/+page.svelte
@@ -17,7 +17,8 @@
 		getUserContactSessionsAPI
 	} from '$lib/api/users';
 	import { createSessionFromCalComAPI } from '$lib/api/sessions';
-	import { toastAlert, toastWarning } from '$lib/utils/toasts';
+	import { toastAlert, toastSuccess, toastWarning } from '$lib/utils/toasts';
+	import { get } from 'svelte/store';
 
 	let ready = false;
 	$: contacts = [] as User[];
@@ -82,16 +83,27 @@
 		// @ts-ignore
 		Cal('on', {
 			action: 'bookingSuccessful',
-			callback: (e: any) => {
+			callback: async (e: any) => {
 				if (!contact || !$user || !e.detail.data) {
-					toastAlert('Automatic session creation failed');
+					toastAlert(get(t)('home.bookingFailed'));
 					return;
 				}
 
-				let date = new Date(e.detail.data.date);
-				let duration = e.detail.data.duration;
-				let end = new Date(date.getTime() + duration * 60000);
-				createSessionFromCalComAPI($user.id, contact.id, date, end);
+				const date = new Date(e.detail.data.date);
+				const duration = e.detail.data.duration;
+				const end = new Date(date.getTime() + duration * 60000);
+				const sess_id: number | null = await createSessionFromCalComAPI(
+					$user.id,
+					contact.id,
+					date,
+					end
+				);
+				if (!sess_id) {
+					toastAlert(get(t)('home.bookingFailed'));
+					return;
+				}
+				toastSuccess(get(t)('home.bookingSuccessful'));
+				contactSessions = Session.parseAll(await getUserContactSessionsAPI($user!.id, contact.id));
 			}
 		});
 	});
-- 
GitLab