import { BookingOptionPax, BookingPackagePax, BookingPackageRoom } from '@qite/tide-client/build/types'; import { ServiceType } from '@qite/tide-client'; import { compact, first, sortBy, uniqBy } from 'lodash'; import React from 'react'; import { useSelector } from 'react-redux'; import { buildClassName } from '../../../shared/utils/class-util'; import { formatPrice } from '../../../shared/utils/localization-util'; import { selectCurrencyCode, selectProductAttributes, selectTranslations } from '../booking/selectors'; import { getDatePeriodText, getDateText } from '../sidebar/sidebar-util'; interface OptionRoomProps { packageRoom: BookingPackageRoom; pax: BookingPackagePax[]; optionPax?: BookingOptionPax[]; onRoomChange: (index: number, accommodationCode: string, regimeCode: string | null) => void; includedServiceTypes?: number[]; } const OptionRoom: React.FC = ({ packageRoom, pax, optionPax, onRoomChange, includedServiceTypes }) => { const selectedOption = packageRoom?.options.find((x) => x.isSelected); const translations = useSelector(selectTranslations); const currencyCode = useSelector(selectCurrencyCode); let daysAndNightsText = ''; let startDate = ''; let endDate = ''; let productName = ''; if (packageRoom.index === 0) { const selectedOption = packageRoom.options.find((x) => x.isSelected); if (selectedOption) { startDate = getDateText(selectedOption.from, true) ?? ''; endDate = getDateText(selectedOption.to, true) ?? ''; daysAndNightsText = getDatePeriodText(translations, selectedOption.from, selectedOption.to) ?? ''; const productAttributes = useSelector(selectProductAttributes); productName = productAttributes?.productName ?? ''; } } const isFlightOnly = includedServiceTypes?.length === 1 && includedServiceTypes.includes(ServiceType.flight); const accommodations = uniqBy( compact( packageRoom && packageRoom.options .filter((x) => x.accommodationCode && !x.isLocked) .map((option) => { return { accommodationCode: option.accommodationCode, accommodationName: option.accommodationName }; }) ), 'accommodationCode' ); const regimes = uniqBy( compact( packageRoom && packageRoom.options .filter((x) => !selectedOption || x.accommodationCode == selectedOption.accommodationCode) .map((option) => { return { regimeCode: option.regimeCode, regimeName: option.regimeName }; }) ), 'regimeCode' ); const handleAccommodationChange: React.FormEventHandler = (e) => { const accommodationCode = e.currentTarget.value; var accommodationOptions = packageRoom?.options.filter((x) => x.accommodationCode == accommodationCode); if (accommodationOptions) { const option = accommodationOptions.find((x) => x.regimeCode == selectedOption?.regimeCode) ?? accommodationOptions[0]; if (option) { onRoomChange(packageRoom.index, option.accommodationCode, option.regimeCode); } } e.preventDefault(); }; const handleRegimeChange: React.FormEventHandler = (e) => { const regime = regimes.find((x) => x.regimeCode == e.currentTarget.value); if (selectedOption) { onRoomChange(packageRoom.index, selectedOption.accommodationCode, regime ? regime.regimeCode : null); } e.preventDefault(); }; const getPriceDifferenceText = (price: number) => { return price > 0 ? `+ ${formatPrice(Math.abs(price), currencyCode)}` : `- ${formatPrice(Math.abs(price), currencyCode)}`; }; const getAccommodationPriceDifference = (accommodation: { accommodationCode: string; accommodationName: string }) => { const selectedOption = packageRoom.options.find((x) => x.isSelected); if (selectedOption?.accommodationCode === accommodation.accommodationCode) return ''; var currentPrice = selectedOption?.price; var accommodationPrice = first( sortBy( packageRoom.options.filter((x) => x.regimeCode === selectedOption?.regimeCode && x.accommodationCode === accommodation.accommodationCode), (x) => x.price ) )?.price; var priceDifference = (accommodationPrice ?? 0) - (currentPrice ?? 0); if (priceDifference !== 0) { return `(${getPriceDifferenceText(priceDifference)})`; } else { return ''; } }; const getRegimePriceDifference = (regime: { regimeCode: string; regimeName: string }) => { const selectedOption = packageRoom.options.find((x) => x.isSelected); if (selectedOption?.regimeCode === regime.regimeCode) return ''; var currentPrice = selectedOption?.price; var regimePrice = packageRoom.options.find((x) => x.accommodationCode === selectedOption?.accommodationCode && x.regimeCode === regime.regimeCode)?.price; var priceDifference = (regimePrice ?? 0) - (currentPrice ?? 0); if (priceDifference !== 0) { return `(${getPriceDifferenceText(priceDifference)})`; } else { return ''; } }; const getPaxName = (id: number) => { const item = pax.find((x) => x.id === id); if (!item?.firstName && !item?.lastName) { const optionPaxItem = optionPax?.find((x) => x.id === id); return optionPaxItem?.paxName; } return `${item?.firstName} ${item?.lastName[0]}`; }; return (
{startDate && endDate && ( <> {startDate} {endDate} )}
{!isFlightOnly &&

{daysAndNightsText}

}
{productName}
{translations.OPTIONS_FORM.UNIT_TITLE} {packageRoom.index + 1}:{' '} {pax.map((p, i) => ( {i > 0 && ', '} {getPaxName(p.id)} ))}
{regimes.length > 1 && (
)} {regimes.length === 1 && <>{regimes.find((x) => x.regimeCode == selectedOption?.regimeCode)?.regimeName}}
); }; export default OptionRoom;