UNPKG

@qite/tide-booking-component

Version:

React Booking wizard & Booking product component for Tide

156 lines (148 loc) 4.22 kB
import { BookingOptionGroup, BookingOptionPax, BookingOptionUnit, BookingPackage, BookingPackageOption, BookingPackageRoom, ChangedLine, PerBookingPackageOption, PerPaxPackageOption, PerUnitPackageOption, } from "@qite/tide-client/build/types"; export const updatePackageDetails = ( packageDetails: BookingPackage, changedLines: ChangedLine[] ): BookingPackage => { return { ...packageDetails, options: packageDetails.options.map((opt) => { return { ...opt, rooms: opt.isSelected ? updateRooms(opt.rooms, changedLines) : opt.rooms, groups: opt.isSelected ? updateBookingGroups(opt.groups, changedLines) : opt.groups, optionUnits: opt.isSelected ? updateOptionUnits(opt.optionUnits, changedLines) : opt.optionUnits, optionPax: opt.isSelected ? updateOptionPax(opt.optionPax, changedLines) : opt.optionPax, } as BookingPackageOption; }), }; }; // ROOMS const updateRooms = ( rooms: BookingPackageRoom[], changedLines: ChangedLine[] ) => { return rooms.map((room) => ({ ...room, options: room.options.map((option) => ({ ...option, price: changedLines.find((x) => x.entryLineGuid == option.entryLineGuid) ?.price ?? option.price, })), })); }; // PAX const updateOptionPax = ( pax: BookingOptionPax[], changedLines: ChangedLine[] ): BookingOptionPax[] => { return pax.map((p) => ({ ...p, groups: updatePaxGroups(p.groups, changedLines), })); }; const updatePaxGroups = ( groups: BookingOptionGroup<PerPaxPackageOption>[], changedLines: ChangedLine[] ): BookingOptionGroup<PerPaxPackageOption>[] => { return groups.map((g) => ({ ...g, options: g.options.map((o) => ({ ...o, groups: updatePaxGroups(o.groups, changedLines), line: { ...o.line, price: changedLines.find((cl) => cl.entryLineGuid === o.line.entryLineGuid) ?.price ?? o.line.price, }, alternatives: o.alternatives.map((a) => ({ ...a, price: changedLines.find((cl) => cl.entryLineGuid === a.entryLineGuid) ?.price ?? a.price, })), })), })); }; // UNITS const updateOptionUnits = ( units: BookingOptionUnit[], changedLines: ChangedLine[] ): BookingOptionUnit[] => { return units.map((u) => ({ ...u, groups: updateUnitGroups(u.groups, changedLines), })); }; const updateUnitGroups = ( groups: BookingOptionGroup<PerUnitPackageOption>[], changedLines: ChangedLine[] ): BookingOptionGroup<PerUnitPackageOption>[] => { return groups.map((g) => ({ ...g, options: g.options.map((o) => ({ ...o, groups: updateUnitGroups(o.groups, changedLines), pax: updateOptionPax(o.pax, changedLines), line: { ...o.line, price: changedLines.find((cl) => cl.entryLineGuid === o.line.entryLineGuid) ?.price ?? o.line.price, }, alternatives: o.alternatives.map((a) => ({ ...a, price: changedLines.find((cl) => cl.entryLineGuid === a.entryLineGuid) ?.price ?? a.price, })), })), })); }; // BOOKING const updateBookingGroups = ( groups: BookingOptionGroup<PerBookingPackageOption>[], changedLines: ChangedLine[] ): BookingOptionGroup<PerBookingPackageOption>[] => { return groups.map((g) => ({ ...g, options: g.options.map((o) => ({ ...o, groups: updateBookingGroups(o.groups, changedLines), units: updateOptionUnits(o.units, changedLines), pax: updateOptionPax(o.pax, changedLines), line: { ...o.line, price: changedLines.find((cl) => cl.entryLineGuid === o.line.entryLineGuid) ?.price ?? o.line.price, }, alternatives: o.alternatives.map((a) => ({ ...a, price: changedLines.find((cl) => cl.entryLineGuid === a.entryLineGuid) ?.price ?? a.price, })), })), })); };