From 2c08b141b2423dba5c330dae53421c8edd95d632 Mon Sep 17 00:00:00 2001 From: Erik Tiekstra Date: Tue, 25 Mar 2025 07:36:43 +0000 Subject: [PATCH] feat(SW-1534): Added booking code functionality from either searchParams or pageSettings Approved-by: Christian Andolf --- .../@bookingwidget/[contentType]/[uid]/page.tsx | 5 +++-- apps/scandic-web/components/BookingWidget/Client.tsx | 11 +++++++++-- apps/scandic-web/components/BookingWidget/index.tsx | 11 ++++++++++- .../lib/graphql/Fragments/PageSettings.graphql | 1 + apps/scandic-web/lib/trpc/memoizedRequests/index.ts | 8 ++++++++ .../routers/contentstack/pageSettings/output.ts | 3 +++ .../types/components/bookingWidget/index.ts | 1 + 7 files changed, 35 insertions(+), 5 deletions(-) diff --git a/apps/scandic-web/app/[lang]/(live)/@bookingwidget/[contentType]/[uid]/page.tsx b/apps/scandic-web/app/[lang]/(live)/@bookingwidget/[contentType]/[uid]/page.tsx index ebf6596e4..d34d7e826 100644 --- a/apps/scandic-web/app/[lang]/(live)/@bookingwidget/[contentType]/[uid]/page.tsx +++ b/apps/scandic-web/app/[lang]/(live)/@bookingwidget/[contentType]/[uid]/page.tsx @@ -33,8 +33,9 @@ export default async function BookingWidgetPage({ } const hotelPageParams = { - hotel: hotelData?.hotel.id || "", - city: hotelData?.hotel.cityName || "", + bookingCode: searchParams.bookingCode ?? "", + hotel: hotelData?.hotel.id ?? "", + city: hotelData?.hotel.cityName ?? "", } return diff --git a/apps/scandic-web/components/BookingWidget/Client.tsx b/apps/scandic-web/components/BookingWidget/Client.tsx index 9d40efbe8..ed2c258a0 100644 --- a/apps/scandic-web/components/BookingWidget/Client.tsx +++ b/apps/scandic-web/components/BookingWidget/Client.tsx @@ -1,7 +1,7 @@ "use client" 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 { REDEMPTION } from "@/constants/booking" @@ -37,6 +37,7 @@ import type { Location } from "@/types/trpc/routers/hotel/locations" export default function BookingWidgetClient({ type, bookingWidgetSearchParams, + pageSettingsBookingCodePromise, }: BookingWidgetClientProps) { const [isOpen, setIsOpen] = useState(false) const bookingWidgetRef = useRef(null) @@ -83,7 +84,13 @@ export default function BookingWidgetClient({ 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( (room) => ({ diff --git a/apps/scandic-web/components/BookingWidget/index.tsx b/apps/scandic-web/components/BookingWidget/index.tsx index e6e7aa415..e9001c3c4 100644 --- a/apps/scandic-web/components/BookingWidget/index.tsx +++ b/apps/scandic-web/components/BookingWidget/index.tsx @@ -1,4 +1,7 @@ -import { isBookingWidgetHidden } from "@/lib/trpc/memoizedRequests" +import { + getPageSettingsBookingCode, + isBookingWidgetHidden, +} from "@/lib/trpc/memoizedRequests" import BookingWidgetClient from "./Client" @@ -14,10 +17,16 @@ export default async function BookingWidget({ return null } + let pageSettingsBookingCodePromise: Promise | null = null + if (!bookingWidgetSearchParams.bookingCode) { + pageSettingsBookingCodePromise = getPageSettingsBookingCode() + } + return ( ) } diff --git a/apps/scandic-web/lib/graphql/Fragments/PageSettings.graphql b/apps/scandic-web/lib/graphql/Fragments/PageSettings.graphql index 2b5786598..9f8c06df8 100644 --- a/apps/scandic-web/lib/graphql/Fragments/PageSettings.graphql +++ b/apps/scandic-web/lib/graphql/Fragments/PageSettings.graphql @@ -1,3 +1,4 @@ fragment PageSettings on PageSettings { hide_booking_widget + booking_code } diff --git a/apps/scandic-web/lib/trpc/memoizedRequests/index.ts b/apps/scandic-web/lib/trpc/memoizedRequests/index.ts index 0c6f051c2..a6f84a573 100644 --- a/apps/scandic-web/lib/trpc/memoizedRequests/index.ts +++ b/apps/scandic-web/lib/trpc/memoizedRequests/index.ts @@ -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() { return serverClient().partner.jobylon.feed.get() }) diff --git a/apps/scandic-web/server/routers/contentstack/pageSettings/output.ts b/apps/scandic-web/server/routers/contentstack/pageSettings/output.ts index c53e6c96b..16f3a8322 100644 --- a/apps/scandic-web/server/routers/contentstack/pageSettings/output.ts +++ b/apps/scandic-web/server/routers/contentstack/pageSettings/output.ts @@ -1,7 +1,10 @@ import { z } from "zod" +import { nullableStringValidator } from "@/utils/zod/stringValidator" + export const pageSettingsSchema = z.object({ hide_booking_widget: z.boolean(), + booking_code: nullableStringValidator, }) export type PageSettingsSchema = z.output diff --git a/apps/scandic-web/types/components/bookingWidget/index.ts b/apps/scandic-web/types/components/bookingWidget/index.ts index 4daeb163e..8ecb70620 100644 --- a/apps/scandic-web/types/components/bookingWidget/index.ts +++ b/apps/scandic-web/types/components/bookingWidget/index.ts @@ -34,6 +34,7 @@ export interface BookingWidgetProps { export interface BookingWidgetClientProps { type?: BookingWidgetType bookingWidgetSearchParams: SearchParams["searchParams"] + pageSettingsBookingCodePromise: Promise | null } export interface BookingWidgetToggleButtonProps {