import { type PropsWithChildren, useEffect, useState } from "react"; import { Checkbox } from "@/components/ui/checkbox/checkbox"; import { useLocale } from "@/hooks/useLocale"; import { PriceManager } from "@/libs/price-manager/price-manager"; import { cn } from "@/libs/utils"; import type { IOptionalAddOns } from "@/services/eva-display/hotel/hotel-add-to-cart/hotel-add-to-card-services.types"; import type { Room, RoomCollectionResult, } from "@/services/eva-display/hotel/hotel-detail/hotel-detail-services.types"; export type AttendeesChecboxValue = Array>; export interface AttendeesChecboxProps extends PropsWithChildren { rooms: { room: Room; roomCollection: RoomCollectionResult; }[]; addOn: IOptionalAddOns; /** * @default Array> */ values?: AttendeesChecboxValue; onChange?: (value: AttendeesChecboxValue) => void; } // @Note: This separator choosen by BE team const passengerKeySeperator = ";"; export const generatePassengerValue = ( passengerKey: string, addOnKey: string, ) => `${passengerKey}${passengerKeySeperator}${addOnKey}`; const AttendeesChecbox = ({ rooms, addOn, values, onChange, }: AttendeesChecboxProps) => { const { t } = useLocale(); const [selectedList, setSelectedList] = useState( values || rooms.map(() => []), ); const handleCheckboxRoomChange = (roomIndex: number) => { const isAllRoomSelected = (selectedList[roomIndex]?.length || 0) > 0; if (isAllRoomSelected) { setSelectedList((prev) => { const newValues = [...prev]; newValues[roomIndex] = []; onChange?.(newValues); return newValues; }); } else { setSelectedList((prev) => { const newValues = [...prev]; newValues[roomIndex] = rooms[roomIndex]?.room.passengerKeys.map((item) => generatePassengerValue(item, addOn.key), ) || []; onChange?.(newValues); return newValues; }); } }; const handleChangeCheckboxPassenger = ( roomIndex: number, passengerValue: string, ) => { setSelectedList((prev) => { const newValues = [...prev]; const passengerIndex = newValues[roomIndex]?.indexOf(passengerValue) ?? -1; if (passengerIndex > -1) { newValues[roomIndex]?.splice(passengerIndex, 1); } else { newValues[roomIndex]?.push(passengerValue); } onChange?.(newValues); return newValues; }); }; useEffect(() => { if (values) setSelectedList(values); }, [values]); return rooms.map(({ room }, roomIndex) => { const isLeastOneRoomSelected = (selectedList[roomIndex]?.length || 0) > 0; const isMultipleRoom = rooms.length > 1; return ( <> {roomIndex === 0 && (
{t("Participants")}
)}
{isMultipleRoom && (
handleCheckboxRoomChange(roomIndex)} />
{PriceManager({ currency: addOn.totalExchangePrice.slice(0, 3), value: +addOn.totalExchangePrice.slice(3) * room.passengerKeys.length, })}
)}
{room.passengerKeys.map((passengerKey, passengerIndex) => { const passengerValue = generatePassengerValue( passengerKey, addOn.key, ); const isRoomSelected = selectedList[roomIndex]?.includes(passengerValue); return (
item.key === passengerKey) ?.description || `${passengerIndex + 1}. ${t("Adult")}` } checked={isRoomSelected} onCheckedChange={() => handleChangeCheckboxPassenger(roomIndex, passengerValue) } labelClassname="!text-sm text-gray-800" />
{PriceManager({ currency: addOn.totalExchangePrice.slice(0, 3), value: +addOn.totalExchangePrice.slice(3), })}
); })}
); }); }; export { AttendeesChecbox };