feat(SW-589): break out RateSummary
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
import { useIntl } from "react-intl"
|
||||
|
||||
import Button from "@/components/TempDesignSystem/Button"
|
||||
import Body from "@/components/TempDesignSystem/Text/Body"
|
||||
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
|
||||
|
||||
import styles from "./rateSummary.module.css"
|
||||
|
||||
import { RateSummaryProps } from "@/types/components/hotelReservation/selectRate/rateSummary"
|
||||
|
||||
export default function RateSummary({ rateSummary, user }: RateSummaryProps) {
|
||||
const intl = useIntl()
|
||||
return (
|
||||
<div className={styles.summary}>
|
||||
<div className={styles.summaryText}>
|
||||
<Subtitle>{rateSummary.roomType}</Subtitle>
|
||||
<Body>{rateSummary.priceName}</Body>
|
||||
</div>
|
||||
<div className={styles.summaryPrice}>
|
||||
<div className={styles.summaryPriceText}>
|
||||
{user ? (
|
||||
<>
|
||||
<Subtitle color="red">
|
||||
{rateSummary.member?.localPrice.pricePerStay}{" "}
|
||||
{rateSummary.member?.localPrice.currency}
|
||||
</Subtitle>
|
||||
<Body>
|
||||
{intl.formatMessage({ id: "Approx." })}{" "}
|
||||
{rateSummary.member?.requestedPrice?.pricePerStay}{" "}
|
||||
{rateSummary.member?.requestedPrice?.currency}
|
||||
</Body>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Subtitle>
|
||||
{rateSummary.public?.localPrice.pricePerStay}{" "}
|
||||
{rateSummary.public?.localPrice.currency}
|
||||
</Subtitle>
|
||||
<Body>
|
||||
{intl.formatMessage({ id: "Approx." })}{" "}
|
||||
{rateSummary.public?.requestedPrice?.pricePerStay}{" "}
|
||||
{rateSummary.public?.requestedPrice?.currency}
|
||||
</Body>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<Button type="submit" theme="base">
|
||||
{intl.formatMessage({ id: "Continue" })}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
.summary {
|
||||
position: fixed;
|
||||
z-index: 10;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background-color: var(--Base-Surface-Primary-light-Normal);
|
||||
padding: var(--Spacing-x3) var(--Spacing-x7) var(--Spacing-x5);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.summaryPrice {
|
||||
display: flex;
|
||||
gap: var(--Spacing-x4);
|
||||
}
|
||||
@@ -1,12 +1,8 @@
|
||||
"use client"
|
||||
import { useRouter, useSearchParams } from "next/navigation"
|
||||
import { useState } from "react"
|
||||
import { useIntl } from "react-intl"
|
||||
|
||||
import Button from "@/components/TempDesignSystem/Button"
|
||||
import Body from "@/components/TempDesignSystem/Text/Body"
|
||||
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
|
||||
|
||||
import RateSummary from "./RateSummary"
|
||||
import RoomCard from "./RoomCard"
|
||||
|
||||
import styles from "./roomSelection.module.css"
|
||||
@@ -23,7 +19,6 @@ export default function RoomSelection({
|
||||
|
||||
const router = useRouter()
|
||||
const searchParams = useSearchParams()
|
||||
const intl = useIntl()
|
||||
|
||||
function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
|
||||
e.preventDefault()
|
||||
@@ -52,46 +47,7 @@ export default function RoomSelection({
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
{rateSummary && (
|
||||
<div className={styles.summary}>
|
||||
<div className={styles.summaryText}>
|
||||
<Subtitle>{rateSummary.roomType}</Subtitle>
|
||||
<Body>{rateSummary.priceName}</Body>
|
||||
</div>
|
||||
<div className={styles.summaryPrice}>
|
||||
<div className={styles.summaryPriceText}>
|
||||
{user ? (
|
||||
<>
|
||||
<Subtitle color="red">
|
||||
{rateSummary.member?.localPrice.pricePerStay}{" "}
|
||||
{rateSummary.member?.localPrice.currency}
|
||||
</Subtitle>
|
||||
<Body>
|
||||
{intl.formatMessage({ id: "Approx." })}{" "}
|
||||
{rateSummary.member?.requestedPrice?.pricePerStay}{" "}
|
||||
{rateSummary.member?.requestedPrice?.currency}
|
||||
</Body>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Subtitle>
|
||||
{rateSummary.public?.localPrice.pricePerStay}{" "}
|
||||
{rateSummary.public?.localPrice.currency}
|
||||
</Subtitle>
|
||||
<Body>
|
||||
{intl.formatMessage({ id: "Approx." })}{" "}
|
||||
{rateSummary.public?.requestedPrice?.pricePerStay}{" "}
|
||||
{rateSummary.public?.requestedPrice?.currency}
|
||||
</Body>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<Button type="submit" theme="base">
|
||||
{intl.formatMessage({ id: "Continue" })}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{rateSummary && <RateSummary rateSummary={rateSummary} user={user} />}
|
||||
</form>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -20,24 +20,6 @@
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.summary {
|
||||
position: fixed;
|
||||
z-index: 10;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background-color: var(--Base-Surface-Primary-light-Normal);
|
||||
padding: var(--Spacing-x3) var(--Spacing-x7) var(--Spacing-x5);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.summaryPrice {
|
||||
display: flex;
|
||||
gap: var(--Spacing-x4);
|
||||
}
|
||||
|
||||
@media (min-width: 767px) {
|
||||
.roomList {
|
||||
grid-template-columns: repeat(3, minmax(240px, 1fr));
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
import { Rate } from "./selectRate"
|
||||
|
||||
import { User } from "@/types/user"
|
||||
|
||||
export interface RateSummaryProps {
|
||||
rateSummary: Rate
|
||||
user: User | null
|
||||
}
|
||||
@@ -12,12 +12,3 @@ export interface Rate {
|
||||
public: Product["productType"]["public"]
|
||||
member: Product["productType"]["member"]
|
||||
}
|
||||
|
||||
export interface State {
|
||||
selectedRate: Rate | null
|
||||
}
|
||||
|
||||
export type SetSelectedRateAction = {
|
||||
type: "SET_SELECTED_RATE"
|
||||
payload: Rate
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user