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 (