import React, { useContext } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { QSMRootState } from '../../store/qsm-store'; import { setAdults, setKids, setBabies, setRooms, addRoom, removeRoom, updateRoomTraveler } from '../../store/qsm-slice'; import QSMConfigurationContext from '../../qsm-configuration-context'; import { getTranslations } from '../../../shared/utils/localization-util'; import Icon from '../../../shared/components/icon'; import { PortalQsmType } from '@qite/tide-client'; const TravelInput: React.FC = () => { const dispatch = useDispatch(); const { askRooms, maxTravelers, defaultTravelers, maxChildAge, maxInfantAge, askTravelType, askTravelClass, languageCode } = useContext(QSMConfigurationContext); const { adults, kids, babies, rooms, qsmType } = useSelector((state: QSMRootState) => state.qsm); const areTravelersInRooms = qsmType !== PortalQsmType.Flight && askRooms; const translations = getTranslations(languageCode ?? 'en-GB'); const getTravelerButtonClass = (disabled: boolean) => `button button--increment ${disabled ? 'button--disabled' : ''}`; const totalTravelers = areTravelersInRooms ? rooms.reduce((sum, room) => sum + room.adults + room.kids + room.babies, 0) : adults + kids + babies; const safeMaxTravelers = maxTravelers ?? Infinity; const canAddTraveler = totalTravelers < safeMaxTravelers; const syncRoomsToRedux = (updatedRooms: typeof rooms) => { dispatch(setRooms(updatedRooms)); }; const handleTravelerChange = (roomIndex: number, type: 'adults' | 'kids' | 'babies', newValue: number) => { const updatedRooms = rooms.map((room, idx) => (idx === roomIndex ? { ...room, [type]: newValue } : room)); syncRoomsToRedux(updatedRooms); dispatch( updateRoomTraveler({ roomIndex, type, value: newValue }) ); }; const handleAddRoom = () => { const remaining = (maxTravelers ?? Infinity) - totalTravelers; const adultsForRoom = Math.min(defaultTravelers || 2, remaining); if (adultsForRoom <= 0) { return; } const newRoom = { adults: adultsForRoom, kids: 0, babies: 0 }; const updatedRooms = [...rooms.map((r) => ({ ...r })), newRoom]; dispatch(addRoom()); syncRoomsToRedux(updatedRooms); }; const handleRemoveRoom = (index: number) => { const updatedRooms = rooms.map((r) => ({ ...r })).filter((_, idx) => idx !== index); dispatch(removeRoom(index)); syncRoomsToRedux(updatedRooms); }; // Compute age labels dynamically const ageLabels = { adults: maxChildAge ? `${maxChildAge + 1}+ ${translations.PRODUCT.YEAR}` : `12+ ${translations.PRODUCT.YEAR}`, kids: maxChildAge && maxInfantAge ? `${maxInfantAge + 1}-${maxChildAge} ${translations.PRODUCT.YEAR}` : `2-11 ${translations.PRODUCT.YEAR}`, babies: maxInfantAge !== undefined ? `0-${maxInfantAge} ${translations.PRODUCT.YEAR}` : `0-1 ${translations.PRODUCT.YEAR}` }; return (
{areTravelersInRooms ? (

{translations.SHARED.ROOMS}: {rooms.length}

{rooms.length < 4 && (
{ if (canAddTraveler) { handleAddRoom(); } }}> {translations.QSM.ADD_ROOM}
)}
{rooms.map((room, idx) => (
{translations.SHARED.ROOM} {idx + 1}
{(['adults', 'kids', 'babies'] as const).map((type) => (
{type === 'adults' ? 'Volwassenen' : type === 'kids' ? 'Kinderen' : 'Baby’s'} {ageLabels[type]}
{/* - button */} {room[type]} {/* + button with max check */}
))} {rooms.length > 1 && (
)} {/* Info Message */} {!canAddTraveler && (
{translations.QSM.MAX_TRAVELERS_REACHED}
)}
))}
) : (
{/* Adults */}
{translations.QSM.ADULTS} {ageLabels.adults}
adults > 0 && dispatch(setAdults(adults - 1))}>
{adults}
canAddTraveler && dispatch(setAdults(adults + 1))}>
{/* Children */}
{translations.QSM.CHILDREN} {ageLabels.kids}
kids > 0 && dispatch(setKids(kids - 1))}>
{kids}
canAddTraveler && dispatch(setKids(kids + 1))}>
{/* Babies */}
{translations.QSM.BABIES} {ageLabels.babies}
babies > 0 && dispatch(setBabies(babies - 1))}>
{babies}
canAddTraveler && dispatch(setBabies(babies + 1))}>
{/* Info Message */} {!canAddTraveler && (
{translations.QSM.MAX_TRAVELERS_REACHED}
)}
)} {/* {type === 'flight' && askTravelClass && } {type !== 'flight' && askTravelType && } */}
); }; export default TravelInput;