import React, { useContext, useEffect } from 'react'; import { AirlineBookingPackageOption, AirportBookingPackageOption, BookingAirlineGroup, BookingAirportGroup, BookingOptionGroup, BookingOptionPax, BookingOptionUnit, BookingPackageFlight, Pax, PerBookingPackageOption } from '@qite/tide-client/build/types'; import { isEmpty } from 'lodash'; import { useSelector } from 'react-redux'; import { buildClassName } from '../../../shared/utils/class-util'; import SettingsContext from '../../settings-context'; import { useAppDispatch } from '../../store'; import { setCurrentStep, setPackage, setPackageAirlineGroups, setPackageAirportGroups, setPackageGroups, setPackageOptionPax, setPackageOptionUnits, setPackageRooms, setTagIds } from '../booking/booking-slice'; import { FLIGHT_OPTIONS_FORM_STEP, ROOM_OPTIONS_FORM_STEP, SUMMARY_STEP, TRAVELERS_FORM_STEP } from '../booking/constants'; import { selectAvailabilities, selectBookingPackagePax, selectBookingQueryString, selectIncludedServiceTypes, selectIsFetchingProductOptions, selectPackageAirlineGroups, selectPackageAirportGroups, selectPackageDetails, selectPackageGroups, selectPackageOptionPax, selectPackageOptionUnits, selectPackageRooms, selectPackageTags, selectRequestRooms, selectTagIds, selectTranslations, selectTravelersFirstStep } from '../booking/selectors'; import { fetchPriceDetails } from '../price-details/price-details-slice'; import { updatePackageRooms } from '../room-options/room-utils'; import NoOptions from './no-options'; import OptionBookingAirlineGroup from './option-booking-airline-group'; import OptionBookingGroup from './option-booking-group'; import OptionPaxCard from './option-pax-card'; import OptionRoom from './option-room'; import OptionUnitsCard from './option-units-card'; import PrintOfferButton from '../../components/print-offer-button'; import { Link, useNavigate } from 'react-router-dom'; interface OptionsFormProps {} const OptionsForm: React.FC = () => { const settings = useContext(SettingsContext); const navigate = settings.skipRouter ? () => {} : useNavigate(); const { token } = settings; const translations = useSelector(selectTranslations); const dispatch = useAppDispatch(); const packageDetails = useSelector(selectPackageDetails); const requestRooms = useSelector(selectRequestRooms); const requestRoomsPax = requestRooms?.flatMap((x) => x.pax); const bookingQueryString = useSelector(selectBookingQueryString); const isLoading = useSelector(selectIsFetchingProductOptions); const groups = useSelector(selectPackageGroups); const airlineGroups = useSelector(selectPackageAirlineGroups); const airportGroups = useSelector(selectPackageAirportGroups); const optionUnits = useSelector(selectPackageOptionUnits); const optionPax = useSelector(selectPackageOptionPax); const availabilities = useSelector(selectAvailabilities); const includedServiceTypes = useSelector(selectIncludedServiceTypes); const travelersFirstStep = useSelector(selectTravelersFirstStep); // ROOMS const showRoomOptions = settings?.options?.showRoomOptions ?? settings.roomOptions.isHidden; const packageRooms = useSelector(selectPackageRooms); const pax = useSelector(selectBookingPackagePax); const getRoomPax = (index: number) => { var room = requestRooms?.find((x) => x.index == index); var bookingPackagePax = pax.filter((x) => room?.pax.some((y) => y.id == x.id)); return bookingPackagePax.length > 0 ? bookingPackagePax : room?.pax ?? []; }; const handleOnRoomChange = (index: number, accommodationCode: string, regimeCode: string | null) => { if (!packageRooms) return; const updatedPackageRooms = updatePackageRooms(packageRooms, index, accommodationCode, regimeCode, availabilities!); dispatch(setPackageRooms(updatedPackageRooms)); dispatch(fetchPriceDetails()); }; const getPax = () => { if (!packageDetails) return undefined; const selectedOption = packageDetails.options.find((o) => o.isSelected) ?? packageDetails.options[0]; return selectedOption?.requestRooms.flatMap((r) => r.pax) as Pax[]; }; // TAGS const packageTags = settings.hideTags ? [] : useSelector(selectPackageTags); let tagIds = useSelector(selectTagIds) ?? []; const handleSubmit: React.FormEventHandler = (e) => { if (settings.skipRouter) { if (travelersFirstStep) { dispatch(setCurrentStep(SUMMARY_STEP)); } else { dispatch(setCurrentStep(TRAVELERS_FORM_STEP)); } } else { if (travelersFirstStep) { navigate(`${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.summary.pathSuffix}?${bookingQueryString}`); } else { navigate(`${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.travellers.pathSuffix}?${bookingQueryString}`); } } e.preventDefault(); }; const handleOnPaxChange = (pax: BookingOptionPax[]) => { dispatch(setPackageOptionPax(pax)); dispatch(fetchPriceDetails()); }; const handleOnUnitsChange = (units: BookingOptionUnit[]) => { dispatch(setPackageOptionUnits(units)); dispatch(fetchPriceDetails()); }; const handleOnGroupChange = (group: BookingOptionGroup) => { if (groups) { const updatedGroups = groups?.map((g) => (g.name === group.name ? group : g)); dispatch(setPackageGroups(updatedGroups)); dispatch(fetchPriceDetails()); } }; const handleOnAirlineGroupChange = (group: BookingAirlineGroup) => { if (airlineGroups) { const updatedGroups = airlineGroups.map((g) => (g.label === group.label ? group : g)); dispatch(setPackageAirlineGroups(updatedGroups)); dispatch(fetchPriceDetails()); } }; const handleOnAirportGroupChange = (group: BookingAirportGroup) => { if (airportGroups) { const updatedGroups = airportGroups.map((g) => (g.label === group.label ? group : g)); dispatch(setPackageAirportGroups(updatedGroups)); dispatch(fetchPriceDetails()); } }; const handleOnTagChange = (id: number, checked: boolean) => { let updatedTags = [...tagIds]; if (checked) { if (!updatedTags?.includes(id)) { updatedTags?.push(id); } } else { updatedTags = updatedTags?.filter((x) => x != id); } dispatch(setTagIds(updatedTags)); dispatch(fetchPriceDetails()); }; useEffect(() => { if (packageDetails && settings.roomOptions.isHidden && settings.flightOptions.isHidden) { const params = new URLSearchParams(location.search); const outwardFlight = params.get('outwardflight') ?? undefined; const returnFlight = params.get('returnflight') ?? undefined; if (outwardFlight && returnFlight) { const desiredOutwardFlight = packageDetails.outwardFlights.find((x) => x.entryLineGuid == outwardFlight); const desiredReturnFlight = packageDetails.returnFlights.find((x) => x.entryLineGuid == returnFlight); if (desiredOutwardFlight && desiredReturnFlight) { dispatch( setPackage({ ...packageDetails, outwardFlights: packageDetails.outwardFlights.map((flight) => { return { ...flight, isSelected: flight.entryLineGuid == desiredOutwardFlight.entryLineGuid ? true : false } as BookingPackageFlight; }), returnFlights: packageDetails.returnFlights.map((flight) => { return { ...flight, isSelected: flight.entryLineGuid == desiredReturnFlight.entryLineGuid ? true : false } as BookingPackageFlight; }) }) ); } } } dispatch(fetchPriceDetails()); }, []); const goPrevious = () => { if (settings.roomOptions.isHidden) { dispatch(setCurrentStep(FLIGHT_OPTIONS_FORM_STEP)); } else { dispatch(setCurrentStep(ROOM_OPTIONS_FORM_STEP)); } }; const previousUrl = settings.roomOptions.isHidden ? `${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.flightOptions.pathSuffix}?${bookingQueryString}` : `${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.roomOptions.pathSuffix}?${bookingQueryString}`; const hasPrevious = !settings.roomOptions.isHidden || !settings.flightOptions.isHidden; const showPackageTagsOrRoomoptions = showRoomOptions || (packageTags && !isEmpty(packageTags)); return ( <>
{isLoading && settings.loaderComponent} {!isLoading && (
{showPackageTagsOrRoomoptions && (
{showRoomOptions && {translations.OPTIONS_FORM.PACKAGE}}
{showRoomOptions && ( {packageRooms && packageRooms.map((room) => ( ))}
)} {packageTags && !isEmpty(packageTags) && (
{packageTags.map((tag, index) => ( ))}
)}
)} {optionUnits && !isEmpty(optionUnits) && (

{translations.OPTIONS_FORM.PER_UNIT_TITLE}

)} {optionPax && !isEmpty(optionPax) && (

{translations.OPTIONS_FORM.PER_PAX_TITLE}

)} {groups && !isEmpty(groups) && (

{translations.OPTIONS_FORM.PER_BOOKING_TITLE}

{groups.map((group, i) => ( ))} {airlineGroups?.map((group, i) => ( ))} {airportGroups?.map((group, i) => ( ))}
)} {isEmpty(groups) && isEmpty(optionUnits) && isEmpty(optionPax) && }
)}
{hasPrevious && ( <> {settings.skipRouter ? ( ) : ( {translations.STEPS.PREVIOUS} )} )} {token && settings.options.reportPrintActionId && ( )}
); }; export default OptionsForm;