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"
|
"use client"
|
||||||
import { useRouter, useSearchParams } from "next/navigation"
|
import { useRouter, useSearchParams } from "next/navigation"
|
||||||
import { useState } from "react"
|
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 RoomCard from "./RoomCard"
|
||||||
|
|
||||||
import styles from "./roomSelection.module.css"
|
import styles from "./roomSelection.module.css"
|
||||||
@@ -23,7 +19,6 @@ export default function RoomSelection({
|
|||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const searchParams = useSearchParams()
|
const searchParams = useSearchParams()
|
||||||
const intl = useIntl()
|
|
||||||
|
|
||||||
function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
|
function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@@ -52,46 +47,7 @@ export default function RoomSelection({
|
|||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
{rateSummary && (
|
{rateSummary && <RateSummary rateSummary={rateSummary} user={user} />}
|
||||||
<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>
|
|
||||||
)}
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -20,24 +20,6 @@
|
|||||||
width: 0;
|
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) {
|
@media (min-width: 767px) {
|
||||||
.roomList {
|
.roomList {
|
||||||
grid-template-columns: repeat(3, minmax(240px, 1fr));
|
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"]
|
public: Product["productType"]["public"]
|
||||||
member: Product["productType"]["member"]
|
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