{isComplete ? (
@@ -73,29 +74,33 @@ export default function SectionAccordion({
) : null}
-
-
-
-
- {header}
-
-
- {title}
-
+
+
+
+ {header}
+
+
+ {title}
+
- {isComplete && !isOpen && (
-
- )}
-
-
- {children}
+ {isComplete && !isOpen && (
+
+ )}
+
+
+
-
+
)
}
diff --git a/components/HotelReservation/EnterDetails/SectionAccordion/sectionAccordion.module.css b/components/HotelReservation/EnterDetails/SectionAccordion/sectionAccordion.module.css
index fc3de1764..125905317 100644
--- a/components/HotelReservation/EnterDetails/SectionAccordion/sectionAccordion.module.css
+++ b/components/HotelReservation/EnterDetails/SectionAccordion/sectionAccordion.module.css
@@ -1,15 +1,28 @@
-.wrapper {
- position: relative;
- display: flex;
- flex-direction: row;
- gap: var(--Spacing-x-one-and-half);
+.accordion {
+ --header-height: 2.4em;
+ --circle-height: 24px;
+
+ gap: var(--Spacing-x3);
+ width: 100%;
padding-top: var(--Spacing-x3);
+ transition: 0.4s ease-out;
+
+ display: grid;
+ grid-template-areas: "circle header" "content content";
+ grid-template-columns: auto 1fr;
+ grid-template-rows: var(--header-height) 0fr;
+
+ column-gap: var(--Spacing-x-one-and-half);
}
-.wrapper:last-child .main {
+.accordion:last-child {
border-bottom: none;
}
+.header {
+ grid-area: header;
+}
+
.modifyButton {
display: grid;
grid-template-areas: "title button" "selection button";
@@ -17,6 +30,11 @@
background-color: transparent;
border: none;
width: 100%;
+ padding: 0;
+}
+
+.modifyButton:disabled {
+ cursor: default;
}
.title {
@@ -29,16 +47,6 @@
justify-self: flex-end;
}
-.main {
- display: grid;
- gap: var(--Spacing-x3);
- width: 100%;
- border-bottom: 1px solid var(--Primary-Light-On-Surface-Divider-subtle);
- padding-bottom: var(--Spacing-x3);
- transition: 0.4s ease-out;
- grid-template-rows: 2em 0fr;
-}
-
.selection {
font-weight: 450;
font-size: var(--typography-Title-4-fontSize);
@@ -47,11 +55,12 @@
.iconWrapper {
position: relative;
+ grid-area: circle;
}
.circle {
- width: 24px;
- height: 24px;
+ width: var(--circle-height);
+ height: var(--circle-height);
border-radius: 100px;
transition: background-color 0.4s;
border: 2px solid var(--Base-Border-Inverted);
@@ -64,37 +73,44 @@
background-color: var(--UI-Input-Controls-Fill-Selected);
}
-.wrapper[data-open="true"] .circle[data-checked="false"] {
+.accordion[data-open="true"] .circle[data-checked="false"] {
background-color: var(--UI-Text-Placeholder);
}
-.wrapper[data-open="false"] .circle[data-checked="false"] {
+.accordion[data-open="false"] .circle[data-checked="false"] {
background-color: var(--Base-Surface-Subtle-Hover);
}
-.wrapper[data-open="true"] .main {
- grid-template-rows: 2em 1fr;
+.accordion[data-open="true"] {
+ grid-template-rows: var(--header-height) 1fr;
+}
+
+.contentWrapper {
+ padding-bottom: var(--Spacing-x3);
}
.content {
overflow: hidden;
+ grid-area: content;
+ border-bottom: 1px solid var(--Primary-Light-On-Surface-Divider-subtle);
}
-@media screen and (min-width: 1367px) {
- .wrapper {
- gap: var(--Spacing-x3);
+@media screen and (min-width: 768px) {
+ .accordion {
+ column-gap: var(--Spacing-x3);
+ grid-template-areas: "circle header" "circle content";
}
.iconWrapper {
top: var(--Spacing-x1);
}
- .wrapper:not(:last-child)::after {
+ .accordion:not(:last-child) .iconWrapper::after {
position: absolute;
left: 12px;
- bottom: 0;
- top: var(--Spacing-x7);
- height: 100%;
+ bottom: calc(0px - var(--Spacing-x7));
+ top: var(--circle-height);
+
content: "";
border-left: 1px solid var(--Primary-Light-On-Surface-Divider-subtle);
}
diff --git a/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx b/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx
index 64e9e0960..9d373f871 100644
--- a/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx
+++ b/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx
@@ -2,12 +2,13 @@
import { useIntl } from "react-intl"
-import { useEnterDetailsStore } from "@/stores/enter-details"
+import { selectRate } from "@/constants/routes/hotelReservation"
import { CheckIcon, EditIcon } from "@/components/Icons"
import Link from "@/components/TempDesignSystem/Link"
import Footnote from "@/components/TempDesignSystem/Text/Footnote"
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
+import useLang from "@/hooks/useLang"
import ToggleSidePeek from "./ToggleSidePeek"
@@ -21,8 +22,7 @@ export default function SelectedRoom({
rateDescription,
}: SelectedRoomProps) {
const intl = useIntl()
-
- const selectRateUrl = useEnterDetailsStore((state) => state.selectRateUrl)
+ const lang = useLang()
return (
@@ -53,7 +53,8 @@ export default function SelectedRoom({
diff --git a/components/HotelReservation/EnterDetails/SelectedRoom/selectedRoom.module.css b/components/HotelReservation/EnterDetails/SelectedRoom/selectedRoom.module.css
index 3149cf709..e979c1ee2 100644
--- a/components/HotelReservation/EnterDetails/SelectedRoom/selectedRoom.module.css
+++ b/components/HotelReservation/EnterDetails/SelectedRoom/selectedRoom.module.css
@@ -63,7 +63,7 @@
justify-content: flex-start;
}
-@media screen and (min-width: 1367px) {
+@media screen and (min-width: 768px) {
.wrapper {
gap: var(--Spacing-x3);
padding-top: var(--Spacing-x3);
diff --git a/components/HotelReservation/EnterDetails/Summary/BottomSheet/index.tsx b/components/HotelReservation/EnterDetails/Summary/BottomSheet/index.tsx
index ac7921aec..9f99a56c0 100644
--- a/components/HotelReservation/EnterDetails/Summary/BottomSheet/index.tsx
+++ b/components/HotelReservation/EnterDetails/Summary/BottomSheet/index.tsx
@@ -3,7 +3,7 @@
import { PropsWithChildren } from "react"
import { useIntl } from "react-intl"
-import { useEnterDetailsStore } from "@/stores/enter-details"
+import { useDetailsStore } from "@/stores/details"
import Button from "@/components/TempDesignSystem/Button"
import Caption from "@/components/TempDesignSystem/Text/Caption"
@@ -17,9 +17,9 @@ export function SummaryBottomSheet({ children }: PropsWithChildren) {
const intl = useIntl()
const { isSummaryOpen, toggleSummaryOpen, totalPrice, isSubmittingDisabled } =
- useEnterDetailsStore((state) => ({
+ useDetailsStore((state) => ({
isSummaryOpen: state.isSummaryOpen,
- toggleSummaryOpen: state.toggleSummaryOpen,
+ toggleSummaryOpen: state.actions.toggleSummaryOpen,
totalPrice: state.totalPrice,
isSubmittingDisabled: state.isSubmittingDisabled,
}))
diff --git a/components/HotelReservation/EnterDetails/Summary/index.tsx b/components/HotelReservation/EnterDetails/Summary/index.tsx
index fe297a55e..5b0a6a420 100644
--- a/components/HotelReservation/EnterDetails/Summary/index.tsx
+++ b/components/HotelReservation/EnterDetails/Summary/index.tsx
@@ -5,12 +5,13 @@ import { ChevronDown } from "react-feather"
import { useIntl } from "react-intl"
import { dt } from "@/lib/dt"
-import { EnterDetailsState, useEnterDetailsStore } from "@/stores/enter-details"
+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"
@@ -18,45 +19,39 @@ import useLang from "@/hooks/useLang"
import styles from "./summary.module.css"
-import { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType"
-import { RoomsData } from "@/types/components/hotelReservation/enterDetails/bookingData"
-import { BreakfastPackage } from "@/types/components/hotelReservation/enterDetails/breakfast"
-import { BreakfastPackageEnum } from "@/types/enums/breakfast"
+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: EnterDetailsState) {
+function storeSelector(state: DetailsState) {
return {
- fromDate: state.roomData.fromDate,
- toDate: state.roomData.toDate,
- bedType: state.userData.bedType,
- breakfast: state.userData.breakfast,
- toggleSummaryOpen: state.toggleSummaryOpen,
- setTotalPrice: state.setTotalPrice,
+ 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,
}
}
-export default function Summary({
- showMemberPrice,
- room,
-}: {
- showMemberPrice: boolean
- room: RoomsData
-}) {
+export default function Summary({ showMemberPrice, room }: SummaryProps) {
const [chosenBed, setChosenBed] = useState
()
const [chosenBreakfast, setChosenBreakfast] = useState<
- BreakfastPackage | BreakfastPackageEnum.NO_BREAKFAST
+ BreakfastPackage | false
>()
const intl = useIntl()
const lang = useLang()
const {
- fromDate,
- toDate,
bedType,
breakfast,
+ fromDate,
setTotalPrice,
- totalPrice,
+ toDate,
toggleSummaryOpen,
- } = useEnterDetailsStore(storeSelector)
+ totalPrice,
+ } = useDetailsStore(storeSelector)
const diff = dt(toDate).diff(fromDate, "days")
@@ -80,41 +75,53 @@ export default function Summary({
) || { local: 0, euro: 0 }
const roomsPriceLocal = room.localPrice.price + additionalPackageCost.local
- const roomsPriceEuro = room.euroPrice.price + additionalPackageCost.euro
+ const roomsPriceEuro = room.euroPrice
+ ? room.euroPrice.price + additionalPackageCost.euro
+ : undefined
useEffect(() => {
setChosenBed(bedType)
- setChosenBreakfast(breakfast)
- if (breakfast && breakfast !== BreakfastPackageEnum.NO_BREAKFAST) {
- setTotalPrice({
- local: {
- price: roomsPriceLocal + parseInt(breakfast.localPrice.totalPrice),
- currency: room.localPrice.currency,
- },
- euro: {
- price: roomsPriceEuro + parseInt(breakfast.requestedPrice.totalPrice),
- currency: room.euroPrice.currency,
- },
- })
- } else {
- setTotalPrice({
- local: {
- price: roomsPriceLocal,
- currency: room.localPrice.currency,
- },
- euro: {
- price: roomsPriceEuro,
- currency: room.euroPrice.currency,
- },
- })
+ if (breakfast || breakfast === false) {
+ setChosenBreakfast(breakfast)
+ if (breakfast === false) {
+ setTotalPrice({
+ local: {
+ price: roomsPriceLocal,
+ currency: room.localPrice.currency,
+ },
+ euro:
+ room.euroPrice && roomsPriceEuro
+ ? {
+ price: roomsPriceEuro,
+ currency: room.euroPrice.currency,
+ }
+ : undefined,
+ })
+ } else {
+ setTotalPrice({
+ local: {
+ price: roomsPriceLocal + parseInt(breakfast.localPrice.totalPrice),
+ currency: room.localPrice.currency,
+ },
+ euro:
+ room.euroPrice && roomsPriceEuro
+ ? {
+ price:
+ roomsPriceEuro +
+ parseInt(breakfast.requestedPrice.totalPrice),
+ currency: room.euroPrice.currency,
+ }
+ : undefined,
+ })
+ }
}
}, [
bedType,
breakfast,
roomsPriceLocal,
room.localPrice.currency,
- room.euroPrice.currency,
+ room.euroPrice,
roomsPriceEuro,
setTotalPrice,
])
@@ -171,9 +178,23 @@ export default function Summary({
{room.cancellationText}
-
- {intl.formatMessage({ id: "Rate details" })}
-
+
+ {intl.formatMessage({ id: "Rate details" })}
+
+ }
+ >
+
+
+ {room.cancellationText}
+
+ {room.rateDetails?.map((detail, idx) => (
+ {detail}
+ ))}
+
+
{room.packages
? room.packages.map((roomPackage) => (
@@ -214,35 +235,33 @@ export default function Summary({
) : null}
- {chosenBreakfast ? (
- chosenBreakfast === BreakfastPackageEnum.NO_BREAKFAST ? (
-
-
- {intl.formatMessage({ id: "No breakfast" })}
-
-
- {intl.formatMessage(
- { id: "{amount} {currency}" },
- { amount: "0", currency: room.localPrice.currency }
- )}
-
-
- ) : (
-
-
- {intl.formatMessage({ id: "Breakfast buffet" })}
-
-
- {intl.formatMessage(
- { id: "{amount} {currency}" },
- {
- amount: chosenBreakfast.localPrice.totalPrice,
- currency: chosenBreakfast.localPrice.currency,
- }
- )}
-
-
- )
+ {chosenBreakfast === false ? (
+
+
+ {intl.formatMessage({ id: "No breakfast" })}
+
+
+ {intl.formatMessage(
+ { id: "{amount} {currency}" },
+ { amount: "0", currency: room.localPrice.currency }
+ )}
+
+
+ ) : chosenBreakfast?.code ? (
+
+
+ {intl.formatMessage({ id: "Breakfast buffet" })}
+
+
+ {intl.formatMessage(
+ { id: "{amount} {currency}" },
+ {
+ amount: chosenBreakfast.localPrice.totalPrice,
+ currency: chosenBreakfast.localPrice.currency,
+ }
+ )}
+
+
) : null}