diff --git a/components/wizard/context/validationError.ts b/components/wizard/context/validationError.ts new file mode 100644 index 0000000..6153d99 --- /dev/null +++ b/components/wizard/context/validationError.ts @@ -0,0 +1,25 @@ +interface ValidationErrors { + [key: string]: { properties: { message: string } } +} + +export class ValidationError extends Error { + private errors: ValidationErrors + + constructor(errors: ValidationErrors) { + super() + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, ValidationError) + } + this.name = this.constructor.name + this.errors = errors + } + + get message() { + return Object.entries<{ properties: { message: string } }>(this.errors) + .map(([_key, value]) => { + return `${value?.properties?.message}` + }) + .join(',') + } +} diff --git a/components/wizard/context/wizardStore.tsx b/components/wizard/context/wizardStore.tsx index 9f9db25..db2af08 100644 --- a/components/wizard/context/wizardStore.tsx +++ b/components/wizard/context/wizardStore.tsx @@ -4,6 +4,7 @@ import { loadBookingData, storeBookingData, } from '../../../helpers/storage' +import { ValidationError } from './validationError' interface WizardFormData { startDate: string @@ -163,7 +164,7 @@ async function createBooking(formData: WizardFormData) { if (response.status === 400) { const error = await response.json() - throw Error(error.message) + throw new ValidationError(error.errors) } if (!response.ok) {