From 136ed8121eb2b014ed36f44707747399211380a6 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Sat, 22 Jun 2024 09:03:00 +0200 Subject: [PATCH] Proper handling of reservation validation errors --- .../AccommodationsReservationsApi.tsx | 16 ++++++++++++++-- .../AccommodationsReservationsRoute.tsx | 12 +++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/geneit_app/src/api/accommodations/AccommodationsReservationsApi.tsx b/geneit_app/src/api/accommodations/AccommodationsReservationsApi.tsx index 8b3c15f..23ea118 100644 --- a/geneit_app/src/api/accommodations/AccommodationsReservationsApi.tsx +++ b/geneit_app/src/api/accommodations/AccommodationsReservationsApi.tsx @@ -2,6 +2,12 @@ import { APIClient } from "../ApiClient"; import { Family } from "../FamilyApi"; import { Accommodation } from "./AccommodationListApi"; +export enum ValidateResaResult { + Success, + Error, + Conflict, +} + export interface AccommodationReservation { id: number; family_id: number; @@ -151,13 +157,19 @@ export class AccommodationsReservationsApi { static async Validate( r: AccommodationReservation, accept: boolean - ): Promise { - await APIClient.exec({ + ): Promise { + const res = await APIClient.exec({ method: "POST", uri: `/family/${r.family_id}/accommodations/reservation/${r.id}/validate`, jsonData: { validate: accept, }, + allowFail: true, }); + + if (res.status >= 200 && res.status <= 299) + return ValidateResaResult.Success; + if (res.status === 409) return ValidateResaResult.Conflict; + return ValidateResaResult.Error; } } diff --git a/geneit_app/src/routes/family/accommodations/AccommodationsReservationsRoute.tsx b/geneit_app/src/routes/family/accommodations/AccommodationsReservationsRoute.tsx index 531464a..4461655 100644 --- a/geneit_app/src/routes/family/accommodations/AccommodationsReservationsRoute.tsx +++ b/geneit_app/src/routes/family/accommodations/AccommodationsReservationsRoute.tsx @@ -34,6 +34,7 @@ import { AccommodationReservation, AccommodationsReservationsApi, AccommodationsReservationsList, + ValidateResaResult, } from "../../../api/accommodations/AccommodationsReservationsApi"; import { useAlert } from "../../../hooks/context_providers/AlertDialogProvider"; import { useConfirm } from "../../../hooks/context_providers/ConfirmDialogProvider"; @@ -186,9 +187,18 @@ export function AccommodationsReservationsRoute(): React.ReactElement { try { loadingMessage.show("Validation de la réservation en cours..."); + setValidateResaAnchorEl(null); setActiveEvent(undefined); - await AccommodationsReservationsApi.Validate(r, validate); + const res = await AccommodationsReservationsApi.Validate(r, validate); + + if (res === ValidateResaResult.Conflict) { + throw new Error( + "The reservation is in conflict with other reservations!" + ); + } else if (res === ValidateResaResult.Error) { + throw new Error("Failed to validate the reservation!"); + } reload(); snackbar("La réservation a été mise à jour avec succès !");