@qite/tide-booking-component
Version:
React Booking wizard & Booking product component for Tide
165 lines (148 loc) • 4.23 kB
text/typescript
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;
}
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;