import { BookingPackageLine, PerPackageOption } from '@qite/tide-client/build/types'; import { compact, first, isEmpty, sortBy, uniqBy } from 'lodash'; import React from 'react'; import { buildClassName } from '../../../shared/utils/class-util'; import { getPriceDifferenceText } from '../../../shared/utils/localization-util'; import { getDateText } from '../sidebar/sidebar-util'; import { useSelector } from 'react-redux'; import { selectCurrencyCode } from '../booking/selectors'; interface OptionItemProps { option: PerPackageOption; parentId: string; index: number; selectedPrice: number; onOptionChange?: (option: PerPackageOption, index: number) => void; } const OptionItem: React.FC = ({ option, parentId, index, selectedPrice, onOptionChange }) => { const currencyCode = useSelector(selectCurrencyCode); const priceDifference = option.requirementType === 1 ? option.isSelected ? -option.line.price : option.line.price : option.requirementType === 2 || option.requirementType === 3 ? option.line.price - selectedPrice : 0; const accommodations = uniqBy( compact( [option.line, ...option.alternatives].map((option) => { if (!option.accommodationCode) { return undefined; } return { accommodationCode: option.accommodationCode, accommodationName: option.accommodationName }; }) ), 'accommodationCode' ); const regimes = uniqBy( compact( [option.line, ...option.alternatives] .filter((x) => x.accommodationCode === option.line.accommodationCode) .map((option) => { return { regimeCode: option.regimeCode, regimeName: option.regimeName }; }) ), 'regimeCode' ); const handleAccommodationChange: React.FormEventHandler = (e) => { const accommodationCode = e.currentTarget.value; var accommodationAlternatives = option.alternatives.filter((x) => x.accommodationCode == accommodationCode); if (accommodationAlternatives) { const alternative = accommodationAlternatives.find((x) => x.regimeCode == option.line.regimeCode) ?? accommodationAlternatives[0]; updateOption(alternative); } e.preventDefault(); }; const handleRegimeChange: React.FormEventHandler = (e) => { const regimeCode = e.currentTarget.value; const alternative = option.alternatives.find((x) => x.accommodationCode === option.line.accommodationCode && x.regimeCode == regimeCode); updateOption(alternative); e.preventDefault(); }; const handleSelectionChange: React.FormEventHandler = (e) => { const updatedOption = { ...option, isSelected: e.currentTarget.checked }; // Bubble up option changes if (onOptionChange) onOptionChange(updatedOption, index); }; const updateOption = (alternative?: BookingPackageLine) => { if (alternative) { const updatedAlternatives = [option.line, ...option.alternatives].filter((x) => x != alternative).sort((x, y) => x.price - y.price); const updatedOption = { ...option, line: alternative, alternatives: updatedAlternatives }; // Bubble up option changes if (onOptionChange) onOptionChange(updatedOption, index); } }; const getAccommodationPriceDifference = (accommodation: { accommodationCode: string; accommodationName: string }) => { if (option.line.accommodationCode === accommodation.accommodationCode) return ''; var currentPrice = option.line.price; var accommodationPrice = first( sortBy( option.alternatives.filter((x) => x.accommodationCode === accommodation.accommodationCode), (x) => x.price ) )?.price; const priceDifference = (accommodationPrice ?? 0) - currentPrice; if (priceDifference !== 0) { return `(${getPriceDifferenceText(priceDifference, currencyCode)})`; } else { return ''; } }; const getRegimePriceDifference = (regime: { regimeCode: string; regimeName: string }) => { if (option.line.regimeCode === regime.regimeCode) return ''; var currentPrice = option.line.price; var regimePrice = option.alternatives.find((x) => x.accommodationCode === option.line.accommodationCode && x.regimeCode === regime.regimeCode)?.price; const priceDifference = (regimePrice ?? 0) - currentPrice; if (priceDifference !== 0) { return `(${getPriceDifferenceText(priceDifference, currencyCode)})`; } else { return ''; } }; return ( <> {option.requirementType === 0 && ( )} {option.requirementType === 1 && ( )} {(option.requirementType === 2 || option.requirementType === 3) && ( )}
{getDateText(option.line.startDate, true)} {getDateText(option.line.endDate, true)}
{option.line.productName}
{isEmpty(option.alternatives) && ( <>
{option.line.accommodationName}
{option.line.regimeName}
)} {!isEmpty(option.alternatives) && ( <>
{regimes?.length > 1 && (
)} {regimes.length === 1 && <>{regimes.find((x) => x.regimeCode == option.line.regimeCode)?.regimeName}}
)}
{!option.isSelected && ( 0 && 'price--increase', priceDifference < 0 && 'price--decrease'])}> {getPriceDifferenceText(priceDifference, currencyCode)} )}
); }; export default OptionItem;