UNPKG

@qite/tide-booking-component

Version:

React Booking wizard & Booking product component for Tide

158 lines (141 loc) 4.07 kB
import { PayloadAction, createSelector, createSlice } from '@reduxjs/toolkit'; import { differenceInYears } from 'date-fns'; import { RootState } from '../../store'; import { TravelersFormValues, RoomTraveler } from '../../types'; export interface TravelersFormState { formValues?: TravelersFormValues; isTravelersFirst?: boolean; } export const CHILD_MAX_AGE = 17; const isDebug = false; const debugFormValues = { rooms: [ { adults: [ { id: 1, firstName: 'Jan', lastName: 'Jansens', birthDate: '1984-05-20', gender: 'm' }, { id: 2, firstName: 'Leen', lastName: 'Leenders', birthDate: '1986-08-09', gender: 'f' } ], // children: [ // { // id: "3", // firstName: "Jonas", // lastName: "Jansens", // birthDate: "2015-06-14", // gender: "m", // }, // { // id: "4", // firstName: "Janne", // lastName: "Jansens", // birthDate: "2016-03-19", // gender: "f", // }, // ], children: [] }, { adults: [ { id: 3, firstName: 'Jan', lastName: 'Jansens', birthDate: '1984-05-20', gender: 'm' }, { id: 4, firstName: 'Leen', lastName: 'Leenders', birthDate: '1986-08-09', gender: 'f' } ], // children: [ // { // id: "3", // firstName: "Jonas", // lastName: "Jansens", // birthDate: "2015-06-14", // gender: "m", // }, // { // id: "4", // firstName: "Janne", // lastName: "Jansens", // birthDate: "2016-03-19", // gender: "f", // }, // ], children: [] } ], mainBookerId: 1, street: 'Nieuwstraat', houseNumber: '20', box: 'A', zipCode: '9000', place: 'Gent', country: 'be', email: 'staging@qite.be', emailConfirmation: 'staging@qite.be', phone: '+32 471 12 34 56', travelAgentId: 0, travelAgentName: '' }; const initialState: TravelersFormState = { formValues: isDebug ? debugFormValues : undefined }; const travelersFormSlice = createSlice({ name: 'travelersForm', initialState, reducers: { setFormValues(state, action: PayloadAction<TravelersFormValues>) { state.formValues = action.payload; } } }); export const { setFormValues } = travelersFormSlice.actions; export const selectTravelersFormValues = (state: RootState) => state.travelersForm.formValues; export const selectRooms = createSelector(selectTravelersFormValues, (formValues) => formValues?.rooms ?? []); export const selectAgentId = createSelector(selectTravelersFormValues, (formValues) => formValues?.travelAgentId); const selectRequestRooms = (state: RootState) => state.booking.package?.options.find((x) => x.isSelected)?.requestRooms; export const selectFormRooms = createSelector(selectRequestRooms, (rooms) => { const formRooms: { adults: RoomTraveler[]; children: RoomTraveler[] }[] = []; if (rooms) { rooms.forEach((x) => { const formRoom: { adults: RoomTraveler[]; children: RoomTraveler[] } = { adults: [], children: [] }; x.pax.forEach((p) => { if (p.age && p.age > CHILD_MAX_AGE) { formRoom.adults.push({ id: p.id, age: 30 }); } else if (p.age && p.age <= CHILD_MAX_AGE) { formRoom.children.push({ id: p.id, age: p.age }); } else if (p.dateOfBirth) { const age = differenceInYears(new Date(), new Date(p.dateOfBirth)); if (age > CHILD_MAX_AGE) { formRoom.adults.push({ id: p.id, age: 30 }); } else { formRoom.children.push({ id: p.id, age: age }); } } }); formRooms.push(formRoom); }); } return formRooms; }); export default travelersFormSlice.reducer;