feat(SW-1534): Added booking code functionality from either searchParams or pageSettings

Approved-by: Christian Andolf
This commit is contained in:
Erik Tiekstra
2025-03-25 07:36:43 +00:00
parent bb0478033f
commit 2c08b141b2
7 changed files with 35 additions and 5 deletions

View File

@@ -33,8 +33,9 @@ export default async function BookingWidgetPage({
} }
const hotelPageParams = { const hotelPageParams = {
hotel: hotelData?.hotel.id || "", bookingCode: searchParams.bookingCode ?? "",
city: hotelData?.hotel.cityName || "", hotel: hotelData?.hotel.id ?? "",
city: hotelData?.hotel.cityName ?? "",
} }
return <BookingWidget bookingWidgetSearchParams={hotelPageParams} /> return <BookingWidget bookingWidgetSearchParams={hotelPageParams} />

View File

@@ -1,7 +1,7 @@
"use client" "use client"
import { zodResolver } from "@hookform/resolvers/zod" import { zodResolver } from "@hookform/resolvers/zod"
import { useEffect, useRef, useState } from "react" import { use, useEffect, useRef, useState } from "react"
import { FormProvider, useForm } from "react-hook-form" import { FormProvider, useForm } from "react-hook-form"
import { REDEMPTION } from "@/constants/booking" import { REDEMPTION } from "@/constants/booking"
@@ -37,6 +37,7 @@ import type { Location } from "@/types/trpc/routers/hotel/locations"
export default function BookingWidgetClient({ export default function BookingWidgetClient({
type, type,
bookingWidgetSearchParams, bookingWidgetSearchParams,
pageSettingsBookingCodePromise,
}: BookingWidgetClientProps) { }: BookingWidgetClientProps) {
const [isOpen, setIsOpen] = useState(false) const [isOpen, setIsOpen] = useState(false)
const bookingWidgetRef = useRef(null) const bookingWidgetRef = useRef(null)
@@ -83,7 +84,13 @@ export default function BookingWidgetClient({
selectedLocation = getLocationObj(locations ?? [], params.city) selectedLocation = getLocationObj(locations ?? [], params.city)
} }
const selectedBookingCode = params.bookingCode ?? "" // if bookingCode is not provided in the search params,
// we will fetch it from the page settings stored in Contentstack.
const selectedBookingCode =
params.bookingCode ||
(pageSettingsBookingCodePromise !== null
? use(pageSettingsBookingCodePromise)
: "")
const defaultRoomsData: BookingWidgetSchema["rooms"] = params.rooms?.map( const defaultRoomsData: BookingWidgetSchema["rooms"] = params.rooms?.map(
(room) => ({ (room) => ({

View File

@@ -1,4 +1,7 @@
import { isBookingWidgetHidden } from "@/lib/trpc/memoizedRequests" import {
getPageSettingsBookingCode,
isBookingWidgetHidden,
} from "@/lib/trpc/memoizedRequests"
import BookingWidgetClient from "./Client" import BookingWidgetClient from "./Client"
@@ -14,10 +17,16 @@ export default async function BookingWidget({
return null return null
} }
let pageSettingsBookingCodePromise: Promise<string> | null = null
if (!bookingWidgetSearchParams.bookingCode) {
pageSettingsBookingCodePromise = getPageSettingsBookingCode()
}
return ( return (
<BookingWidgetClient <BookingWidgetClient
type={type} type={type}
bookingWidgetSearchParams={bookingWidgetSearchParams} bookingWidgetSearchParams={bookingWidgetSearchParams}
pageSettingsBookingCodePromise={pageSettingsBookingCodePromise}
/> />
) )
} }

View File

@@ -1,3 +1,4 @@
fragment PageSettings on PageSettings { fragment PageSettings on PageSettings {
hide_booking_widget hide_booking_widget
booking_code
} }

View File

@@ -258,6 +258,14 @@ export const isBookingWidgetHidden = cache(
} }
) )
export const getPageSettingsBookingCode = cache(
async function getMemoizedPageSettingsBookingCode() {
const lang = getLang()
const pageSettings = await getPageSettings(lang)
return pageSettings?.page.settings.booking_code ?? ""
}
)
export const getJobylonFeed = cache(async function getMemoizedJobylonFeed() { export const getJobylonFeed = cache(async function getMemoizedJobylonFeed() {
return serverClient().partner.jobylon.feed.get() return serverClient().partner.jobylon.feed.get()
}) })

View File

@@ -1,7 +1,10 @@
import { z } from "zod" import { z } from "zod"
import { nullableStringValidator } from "@/utils/zod/stringValidator"
export const pageSettingsSchema = z.object({ export const pageSettingsSchema = z.object({
hide_booking_widget: z.boolean(), hide_booking_widget: z.boolean(),
booking_code: nullableStringValidator,
}) })
export type PageSettingsSchema = z.output<typeof pageSettingsSchema> export type PageSettingsSchema = z.output<typeof pageSettingsSchema>

View File

@@ -34,6 +34,7 @@ export interface BookingWidgetProps {
export interface BookingWidgetClientProps { export interface BookingWidgetClientProps {
type?: BookingWidgetType type?: BookingWidgetType
bookingWidgetSearchParams: SearchParams<BookingWidgetSearchData>["searchParams"] bookingWidgetSearchParams: SearchParams<BookingWidgetSearchData>["searchParams"]
pageSettingsBookingCodePromise: Promise<string> | null
} }
export interface BookingWidgetToggleButtonProps { export interface BookingWidgetToggleButtonProps {