"use client" import { useCallback, useEffect } from "react" import { useFormContext, useWatch } from "react-hook-form" import { useIntl } from "react-intl" import { env } from "@/env/client" import { CloseLargeIcon, ErrorCircleIcon, PlusCircleIcon, PlusIcon, } from "../Icons" import Button from "../TempDesignSystem/Button" import Caption from "../TempDesignSystem/Text/Caption" import { Tooltip } from "../TempDesignSystem/Tooltip" import { GuestsRoom } from "./GuestsRoom" import styles from "./guests-rooms-picker.module.css" import type { BookingWidgetSchema } from "@/types/components/bookingWidget" import type { TGuestsRoom } from "@/types/components/bookingWidget/guestsRoomsPicker" const MAX_ROOMS = 4 interface GuestsRoomsPickerDialogProps { rooms: TGuestsRoom[] onClose: () => void } export default function GuestsRoomsPickerDialog({ rooms, onClose, }: GuestsRoomsPickerDialogProps) { const intl = useIntl() const { getFieldState, trigger, setValue, getValues } = useFormContext() const roomsValue = useWatch({ name: "rooms" }) const addRoomLabel = intl.formatMessage({ id: "Add room" }) const doneLabel = intl.formatMessage({ id: "Done" }) // Disable add room if booking code is voucher or reward night is enebaled const addRoomDisabledText = getValues("redemption") ? intl.formatMessage({ id: "Multi-room booking is not available with reward night.", }) : getValues("bookingCode.value")?.toLowerCase().startsWith("vo") && intl.formatMessage({ id: "Multi-room booking is not available with this booking code.", }) const handleClose = useCallback(async () => { const isValid = await trigger("rooms") if (isValid) onClose() }, [trigger, onClose]) const handleAddRoom = useCallback(() => { setValue("rooms", [...roomsValue, { adults: 1, childrenInRoom: [] }], { shouldValidate: true, }) }, [roomsValue, setValue]) const handleRemoveRoom = useCallback( (index: number) => { setValue( "rooms", roomsValue.filter((_, i) => i !== index), { shouldValidate: true } ) }, [roomsValue, setValue] ) // Validate rooms when they change useEffect(() => { const fieldState = getFieldState("rooms") if (fieldState.invalid) trigger("rooms") }, [roomsValue, getFieldState, trigger]) const isInvalid = getFieldState("rooms").invalid || roomsValue.some((room) => room.childrenInRoom.some((child) => child.age === undefined) ) const canAddRooms = rooms.length < MAX_ROOMS return ( <>
{rooms.map((room, index) => ( ))} {canAddRooms && (
{addRoomDisabledText ? ( {addRoomDisabledText} ) : null}
)}
) }