"use client" import { useEffect, useRef, useState } from "react" import { ChevronDown } from "react-feather" import { useIntl } from "react-intl" import { dt } from "@/lib/dt" import { useDetailsStore } from "@/stores/details" import { ArrowRightIcon } from "@/components/Icons" import Button from "@/components/TempDesignSystem/Button" import Divider from "@/components/TempDesignSystem/Divider" import Link from "@/components/TempDesignSystem/Link" import Popover from "@/components/TempDesignSystem/Popover" import Body from "@/components/TempDesignSystem/Text/Body" import Caption from "@/components/TempDesignSystem/Text/Caption" import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" import useLang from "@/hooks/useLang" import styles from "./summary.module.css" import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType" import type { BreakfastPackage } from "@/types/components/hotelReservation/enterDetails/breakfast" import type { SummaryProps } from "@/types/components/hotelReservation/enterDetails/summary" import type { DetailsState } from "@/types/stores/details" function storeSelector(state: DetailsState) { return { fromDate: state.data.booking.fromDate, toDate: state.data.booking.toDate, bedType: state.data.bedType, breakfast: state.data.breakfast, toggleSummaryOpen: state.actions.toggleSummaryOpen, setTotalPrice: state.actions.setTotalPrice, totalPrice: state.totalPrice, join: state.data.join, membershipNo: state.data.membershipNo, } } export default function Summary({ showMemberPrice, room }: SummaryProps) { const [chosenBed, setChosenBed] = useState() const [chosenBreakfast, setChosenBreakfast] = useState< BreakfastPackage | false >() const intl = useIntl() const lang = useLang() const { bedType, breakfast, fromDate, setTotalPrice, toDate, toggleSummaryOpen, totalPrice, join, membershipNo, } = useDetailsStore(storeSelector) const diff = dt(toDate).diff(fromDate, "days") const nights = intl.formatMessage( { id: "booking.nights" }, { totalNights: diff } ) const color = useRef<"uiTextHighContrast" | "red">("uiTextHighContrast") const [price, setPrice] = useState(room.prices.public) const additionalPackageCost = room.packages?.reduce( (acc, curr) => { acc.local = acc.local + parseInt(curr.localPrice.totalPrice) acc.euro = acc.euro + parseInt(curr.requestedPrice.totalPrice) return acc }, { local: 0, euro: 0 } ) || { local: 0, euro: 0 } const roomsPriceLocal = price.local.amount + additionalPackageCost.local const roomsPriceEuro = price.euro ? price.euro.amount + additionalPackageCost.euro : undefined useEffect(() => { if (showMemberPrice || join || membershipNo) { color.current = "red" if (room.prices.member) { setPrice(room.prices.member) } } else { color.current = "uiTextHighContrast" setPrice(room.prices.public) } }, [showMemberPrice, join, membershipNo, room.prices]) useEffect(() => { setChosenBed(bedType) if (breakfast || breakfast === false) { setChosenBreakfast(breakfast) if (breakfast === false) { setTotalPrice({ local: { amount: roomsPriceLocal, currency: price.local.currency, }, euro: price.euro && roomsPriceEuro ? { amount: roomsPriceEuro, currency: price.euro.currency, } : undefined, }) } else { setTotalPrice({ local: { amount: roomsPriceLocal + parseInt(breakfast.localPrice.totalPrice), currency: price.local.currency, }, euro: price.euro && roomsPriceEuro ? { amount: roomsPriceEuro + parseInt(breakfast.requestedPrice.totalPrice), currency: price.euro.currency, } : undefined, }) } } }, [ bedType, breakfast, roomsPriceLocal, price.local.currency, price.euro, roomsPriceEuro, setTotalPrice, ]) return (
{intl.formatMessage({ id: "Summary" })} {dt(fromDate).locale(lang).format("ddd, D MMM")} {dt(toDate).locale(lang).format("ddd, D MMM")} ({nights})
{room.roomType} {intl.formatMessage( { id: "{amount} {currency}" }, { amount: intl.formatNumber(price.local.amount), currency: price.local.currency, } )}
{intl.formatMessage( { id: "booking.adults" }, { totalAdults: room.adults } )} {room.children?.length ? ( {intl.formatMessage( { id: "booking.children" }, { totalChildren: room.children.length } )} ) : null} {room.cancellationText} {intl.formatMessage({ id: "Rate details" })} } >
{room.packages ? room.packages.map((roomPackage) => (
{roomPackage.description}
{intl.formatMessage( { id: "{amount} {currency}" }, { amount: roomPackage.localPrice.price, currency: roomPackage.localPrice.currency, } )}
)) : null} {chosenBed ? (
{chosenBed.description} {intl.formatMessage({ id: "Based on availability" })}
{intl.formatMessage( { id: "{amount} {currency}" }, { amount: "0", currency: price.local.currency } )}
) : null} {chosenBreakfast === false ? (
{intl.formatMessage({ id: "No breakfast" })} {intl.formatMessage( { id: "{amount} {currency}" }, { amount: "0", currency: price.local.currency } )}
) : chosenBreakfast?.code ? (
{intl.formatMessage({ id: "Breakfast buffet" })} {intl.formatMessage( { id: "{amount} {currency}" }, { amount: chosenBreakfast.localPrice.totalPrice, currency: chosenBreakfast.localPrice.currency, } )}
) : null}
{intl.formatMessage( { id: "Total price (incl VAT)" }, { b: (str) => {str} } )} {intl.formatMessage({ id: "Price details" })}
{totalPrice.local.amount > 0 && ( {intl.formatMessage( { id: "{amount} {currency}" }, { amount: intl.formatNumber(totalPrice.local.amount), currency: totalPrice.local.currency, } )} )} {totalPrice.euro && totalPrice.euro.amount > 0 && ( {intl.formatMessage({ id: "Approx." })}{" "} {intl.formatMessage( { id: "{amount} {currency}" }, { amount: intl.formatNumber(totalPrice.euro.amount), currency: totalPrice.euro.currency, } )} )}
) }