import { range } from 'lodash'; import React, { useContext, useEffect, useState } from 'react'; import { buildClassName } from '../../shared/utils/class-util'; import { getTranslations } from '../../shared/utils/localization-util'; import SettingsContext from '../settings-context'; import { ProductRoom } from '../types'; import AgeSelect from './age-select'; import AmountInput from './amount-input'; import Icon from '../../shared/components/icon'; interface RoomsProps { rooms: ProductRoom[]; isDisabled: boolean; setIsDisabled: (isOpen: boolean) => void; onChange: (rooms: ProductRoom[]) => void; } const Rooms: React.FC = ({ rooms, isDisabled, setIsDisabled, onChange }) => { const [isTouched, setIsTouched] = useState(false); const [currentRooms, setRoomState] = useState(rooms); useEffect(() => { setRoomState(rooms); }, [rooms]); const { language, customTranslations, disableRooms } = useContext(SettingsContext); const translations = getTranslations(language, customTranslations); // When `disableRooms` is set, the adults/children inputs are always editable // (no edit/apply gate) and changes are propagated immediately. const effectiveIsDisabled = disableRooms ? false : isDisabled; // Notify parent that the form is always "applied" when rooms editing is // disabled — otherwise the Book button would never enable (it watches // `roomsIsDisabled`). useEffect(() => { if (disableRooms && !isDisabled) { setIsDisabled(true); } }, [disableRooms]); const commitIfDisabledMode = (nextRooms: ProductRoom[]) => { if (disableRooms) { onChange(nextRooms); } else { setIsTouched(true); } }; const handleCloseClick = () => { setIsDisabled(true); if (isTouched) onChange(currentRooms); }; return (
{translations.PRODUCT.WHO_YOU_TRAVELING_WITH}
{!disableRooms && (
{translations.SHARED.ROOMS}
{ setRoomState( range(0, value).map( (roomIndex) => currentRooms[roomIndex] ?? { adults: 2, children: 0, childAges: [] } ) ); setIsTouched(true); }} />
)}
{currentRooms.map((room, roomIndex) => (
{!disableRooms &&

{translations.SHARED.ROOM + ' ' + (roomIndex + 1)}

}
{ const next = currentRooms.map((room, i) => (i === roomIndex ? { ...room, adults: value } : room)); setRoomState(next); commitIfDisabledMode(next); }} /> { const next = currentRooms.map((room, i) => i === roomIndex ? { ...room, children: value, childAges: range(0, value).map((childIndex) => room.childAges[childIndex] ?? 0) } : room ); setRoomState(next); commitIfDisabledMode(next); }} />
{room.children > 0 && (
{range(0, room.children).map((childIndex) => ( { const next = currentRooms.map((room, selectorRoomIndex) => roomIndex === selectorRoomIndex ? { ...room, childAges: room.childAges.map((age, i) => (childIndex === i ? value : age)).sort((a, b) => b - a) } : room ); setRoomState(next); commitIfDisabledMode(next); }} /> ))}
)}
))}
{!disableRooms && (
{isDisabled ? ( ) : ( )}
)}
); }; export default Rooms;