Feature/select rate vertical data flow * add fix from SW-2666 * use translations for room packages * move types to it's own file * Merge branch 'master' of bitbucket.org:scandic-swap/web into feature/select-rate-vertical-data-flow * merge * feature/select-rate: double rate for campaing rates * revert NODE_ENV check in Cookiebot script * revert testing values * fix(SW-3171): fix all filter selected in price details * fix(SW-3166): multiroom anchoring when changing filter * fix(SW-3172): check hotelType, show correct breakfast message * Merge branch 'feature/select-rate-vertical-data-flow' of bitbucket.org:scandic-swap/web into feature/select-rate-vertical-data-flow * fix: show special needs icons for subsequent roomTypes SW-3167 * fix: Display strike through text when logged in SW-3168 * fix: Reinstate the scrollToView behaviour when selecting a rate SW-3169 * merge * . * PR fixes * fix: don't return notFound() * . * always include defaults for room packages * merge * merge * merge * Remove floating h1 for new select-rate Approved-by: Anton Gunnarsson
84 lines
2.4 KiB
TypeScript
84 lines
2.4 KiB
TypeScript
"use client"
|
|
|
|
import { useRouter, useSearchParams } from "next/navigation"
|
|
import { useState, useTransition } from "react"
|
|
|
|
import { ErrorBoundary } from "@/components/ErrorBoundary/ErrorBoundary"
|
|
import { useSelectRateContext } from "@/contexts/SelectRate/SelectRateContext"
|
|
|
|
import { DesktopSummary } from "./DesktopSummary"
|
|
import { MobileSummary } from "./MobileSummary"
|
|
|
|
import styles from "./rateSummary.module.css"
|
|
|
|
export function RateSummary() {
|
|
return (
|
|
// eslint-disable-next-line formatjs/no-literal-string-in-jsx
|
|
<ErrorBoundary fallback={<div>Unable to render summary</div>}>
|
|
<InnerRateSummary />
|
|
</ErrorBoundary>
|
|
)
|
|
}
|
|
|
|
function InnerRateSummary() {
|
|
const { selectedRates, input } = useSelectRateContext()
|
|
|
|
const [isSubmitting, setIsSubmitting] = useState(false)
|
|
const router = useRouter()
|
|
const params = useSearchParams()
|
|
const [_, startTransition] = useTransition()
|
|
|
|
if (selectedRates.state === "NONE_SELECTED") {
|
|
return null
|
|
}
|
|
|
|
function handleSubmit(e: React.FormEvent) {
|
|
e.preventDefault()
|
|
setIsSubmitting(true)
|
|
startTransition(() => {
|
|
router.push(`details?${params}`)
|
|
})
|
|
}
|
|
|
|
const totalPriceToShow = selectedRates.totalPrice
|
|
|
|
if (
|
|
!totalPriceToShow ||
|
|
!selectedRates.rates.some((room) => room?.isSelected ?? false)
|
|
) {
|
|
return null
|
|
}
|
|
|
|
// attribute data-footer-spacing used to add spacing
|
|
// beneath footer to be able to show entire footer upon
|
|
// scrolling down to the bottom of the page
|
|
return (
|
|
<form
|
|
data-footer-spacing
|
|
action={`details?${params}`}
|
|
method="GET"
|
|
onSubmit={handleSubmit}
|
|
>
|
|
<div className={styles.summary}>
|
|
<div className={styles.content}>
|
|
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
|
|
<ErrorBoundary fallback={<div>Unable to render desktop summary</div>}>
|
|
<DesktopSummary
|
|
isSubmitting={isSubmitting}
|
|
input={input}
|
|
selectedRates={selectedRates}
|
|
bookingCode={input.data?.booking.bookingCode || ""}
|
|
/>
|
|
</ErrorBoundary>
|
|
</div>
|
|
<div className={styles.mobileSummary}>
|
|
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
|
|
<ErrorBoundary fallback={<div>Unable to render mobile summary</div>}>
|
|
<MobileSummary />
|
|
</ErrorBoundary>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
)
|
|
}
|