From 82ba219e2b9a094e68f635f206a2190698af4c1e Mon Sep 17 00:00:00 2001 From: Michael Zetterberg Date: Mon, 17 Feb 2025 06:15:21 +0100 Subject: [PATCH] feat(SW-1389): refactor page settings --- app/[lang]/(live)/@bookingwidget/page.tsx | 9 -- app/api/web/revalidate/route.ts | 12 +-- components/BookingWidget/index.tsx | 19 ++-- lib/graphql/Fragments/PageSettings.graphql | 3 + lib/graphql/Query/BookingWidgetToggle.graphql | 68 -------------- lib/graphql/Query/PageSettings.graphql | 81 +++++++++++++++++ lib/trpc/memoizedRequests/index.ts | 34 +++++++ server/routers/contentstack/base/input.ts | 5 -- server/routers/contentstack/base/query.ts | 4 +- .../contentstack/bookingwidget/index.ts | 5 -- .../contentstack/bookingwidget/output.ts | 26 ------ .../contentstack/bookingwidget/utils.ts | 1 - server/routers/contentstack/index.ts | 4 +- .../contentstack/pageSettings/index.ts | 5 ++ .../contentstack/pageSettings/output.ts | 15 ++++ .../{bookingwidget => pageSettings}/query.ts | 90 +++++++++---------- .../contentstack/pageSettings/utils.ts | 1 + server/routers/contentstack/reward/query.ts | 2 +- 18 files changed, 203 insertions(+), 181 deletions(-) create mode 100644 lib/graphql/Fragments/PageSettings.graphql delete mode 100644 lib/graphql/Query/BookingWidgetToggle.graphql create mode 100644 lib/graphql/Query/PageSettings.graphql delete mode 100644 server/routers/contentstack/base/input.ts delete mode 100644 server/routers/contentstack/bookingwidget/index.ts delete mode 100644 server/routers/contentstack/bookingwidget/output.ts delete mode 100644 server/routers/contentstack/bookingwidget/utils.ts create mode 100644 server/routers/contentstack/pageSettings/index.ts create mode 100644 server/routers/contentstack/pageSettings/output.ts rename server/routers/contentstack/{bookingwidget => pageSettings}/query.ts (60%) create mode 100644 server/routers/contentstack/pageSettings/utils.ts diff --git a/app/[lang]/(live)/@bookingwidget/page.tsx b/app/[lang]/(live)/@bookingwidget/page.tsx index 224ffe7d0..b2e10734a 100644 --- a/app/[lang]/(live)/@bookingwidget/page.tsx +++ b/app/[lang]/(live)/@bookingwidget/page.tsx @@ -1,5 +1,4 @@ import { env } from "@/env/server" -import { serverClient } from "@/lib/trpc/server" import BookingWidget, { preload } from "@/components/BookingWidget" @@ -15,13 +14,5 @@ export default async function BookingWidgetPage({ preload() - // Get the booking widget show/hide status based on page specific settings - const bookingWidgetToggle = - await serverClient().contentstack.bookingwidget.toggle.get() - - if (bookingWidgetToggle.hideBookingWidget) { - return null - } - return } diff --git a/app/api/web/revalidate/route.ts b/app/api/web/revalidate/route.ts index 3e5038b7d..05847a6f1 100644 --- a/app/api/web/revalidate/route.ts +++ b/app/api/web/revalidate/route.ts @@ -5,10 +5,10 @@ import { z } from "zod" import { Lang } from "@/constants/languages" import { env } from "@/env/server" import { badRequest, internalServerError } from "@/server/errors/next" -import { affix as bookingwidgetAffix } from "@/server/routers/contentstack/bookingwidget/utils" import { affix as breadcrumbsAffix } from "@/server/routers/contentstack/breadcrumbs/utils" import { languageSwitcherAffix } from "@/server/routers/contentstack/languageSwitcher/utils" import { affix as metadataAffix } from "@/server/routers/contentstack/metadata/utils" +import { affix as pageSettingsAffix } from "@/server/routers/contentstack/pageSettings/utils" import { generateRefsResponseTag, @@ -124,15 +124,15 @@ export async function POST(request: NextRequest) { revalidateTag(breadcrumbsTag) } - if (entry.page_settings?.hide_booking_widget) { - const bookingwidgetTag = generateTag( + if (entry.page_settings) { + const pageSettingsTag = generateTag( entryLocale, entry.uid, - bookingwidgetAffix + pageSettingsAffix ) - console.info(`Revalidating breadcrumbsTag: ${bookingwidgetTag}`) - revalidateTag(bookingwidgetTag) + console.info(`Revalidating pageSettingsTag: ${pageSettingsTag}`) + revalidateTag(pageSettingsTag) } return Response.json({ revalidated: true, now: Date.now() }) diff --git a/components/BookingWidget/index.tsx b/components/BookingWidget/index.tsx index bf021f25e..70616bd50 100644 --- a/components/BookingWidget/index.tsx +++ b/components/BookingWidget/index.tsx @@ -1,6 +1,7 @@ -import { getLocations, getSiteConfig } from "@/lib/trpc/memoizedRequests" - -import { getLang } from "@/i18n/serverContext" +import { + getLocations, + isBookingWidgetHidden, +} from "@/lib/trpc/memoizedRequests" import BookingWidgetClient from "./Client" @@ -14,11 +15,15 @@ export default async function BookingWidget({ type, bookingWidgetSearchParams, }: BookingWidgetProps) { - const lang = await getLang() - const locations = await getLocations() - const siteConfig = await getSiteConfig(lang) + const isHidden = await isBookingWidgetHidden() - if (!locations || "error" in locations || siteConfig?.bookingWidgetDisabled) { + if (isHidden) { + return null + } + + const locations = await getLocations() + + if (!locations || "error" in locations) { return null } diff --git a/lib/graphql/Fragments/PageSettings.graphql b/lib/graphql/Fragments/PageSettings.graphql new file mode 100644 index 000000000..2b5786598 --- /dev/null +++ b/lib/graphql/Fragments/PageSettings.graphql @@ -0,0 +1,3 @@ +fragment PageSettings on PageSettings { + hide_booking_widget +} diff --git a/lib/graphql/Query/BookingWidgetToggle.graphql b/lib/graphql/Query/BookingWidgetToggle.graphql deleted file mode 100644 index d42cf7463..000000000 --- a/lib/graphql/Query/BookingWidgetToggle.graphql +++ /dev/null @@ -1,68 +0,0 @@ -query GetAccountPageSettings($uid: String!, $locale: String!) { - account_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} - -query GetLoyaltyPageSettings($uid: String!, $locale: String!) { - loyalty_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} - -query GetCollectionPageSettings($uid: String!, $locale: String!) { - collection_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} - -query GetContentPageSettings($uid: String!, $locale: String!) { - content_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} -query GetDestinationOverviewPageSettings($uid: String!, $locale: String!) { - destination_overview_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} -query GetDestinationCountryPageSettings($uid: String!, $locale: String!) { - destination_country_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} -query GetDestinationCityPageSettings($uid: String!, $locale: String!) { - destination_city_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} - -query GetHotelPageSettings($uid: String!, $locale: String!) { - hotel_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} - -query GetCurrentBlocksPageSettings($uid: String!, $locale: String!) { - current_blocks_page(uid: $uid, locale: $locale) { - page_settings { - hide_booking_widget - } - } -} diff --git a/lib/graphql/Query/PageSettings.graphql b/lib/graphql/Query/PageSettings.graphql new file mode 100644 index 000000000..cd396de8f --- /dev/null +++ b/lib/graphql/Query/PageSettings.graphql @@ -0,0 +1,81 @@ +#import "../Fragments/PageSettings.graphql" + +query GetAccountPageSettings($uid: String!, $locale: String!) { + page: account_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetCollectionPageSettings($uid: String!, $locale: String!) { + page: collection_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetContentPageSettings($uid: String!, $locale: String!) { + page: content_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetCurrentBlocksPageSettings($uid: String!, $locale: String!) { + page: current_blocks_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetDestinationCityPageSettings($uid: String!, $locale: String!) { + page: destination_city_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetDestinationCountryPageSettings($uid: String!, $locale: String!) { + page: destination_country_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetDestinationOverviewPageSettings($uid: String!, $locale: String!) { + page: destination_overview_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetHotelPageSettings($uid: String!, $locale: String!) { + page: hotel_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetLoyaltyPageSettings($uid: String!, $locale: String!) { + page: loyalty_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} + +query GetStartPageSettings($uid: String!, $locale: String!) { + page: start_page(uid: $uid, locale: $locale) { + settings: page_settings { + ...PageSettings + } + } +} diff --git a/lib/trpc/memoizedRequests/index.ts b/lib/trpc/memoizedRequests/index.ts index c4fdaa547..7127aa4cd 100644 --- a/lib/trpc/memoizedRequests/index.ts +++ b/lib/trpc/memoizedRequests/index.ts @@ -1,3 +1,4 @@ +import { getLang } from "@/i18n/serverContext" import { cache } from "@/utils/cache" import { serverClient } from "../server" @@ -228,3 +229,36 @@ export const getDestinationCityPage = cache( export const getStartPage = cache(async function getMemoizedStartPage() { return serverClient().contentstack.startPage.get() }) + +export const getPageSettings = cache(async function getMemoizedPageSettings( + lang: Lang +) { + return serverClient().contentstack.pageSettings.get({ lang }) +}) + +export const isBookingWidgetHidden = cache( + async function isMemoizedBookingWidgetHidden() { + const lang = getLang() + const [pageSettingsResult, siteConfigResults] = await Promise.allSettled([ + getPageSettings(lang), + getSiteConfig(lang), + ]) + + const pageSettings = + pageSettingsResult.status === "fulfilled" + ? pageSettingsResult.value + : null + const siteConfig = + siteConfigResults.status === "fulfilled" ? siteConfigResults.value : null + + if (pageSettings) { + return pageSettings.page.settings.hide_booking_widget + } + + if (siteConfig) { + return siteConfig.bookingWidgetDisabled + } + + return false + } +) diff --git a/server/routers/contentstack/base/input.ts b/server/routers/contentstack/base/input.ts deleted file mode 100644 index 60866cb3e..000000000 --- a/server/routers/contentstack/base/input.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { z } from "zod" - -import { Lang } from "@/constants/languages" - -export const langInput = z.object({ lang: z.nativeEnum(Lang) }) diff --git a/server/routers/contentstack/base/query.ts b/server/routers/contentstack/base/query.ts index acb35ef08..0482f4462 100644 --- a/server/routers/contentstack/base/query.ts +++ b/server/routers/contentstack/base/query.ts @@ -18,6 +18,7 @@ import { import { request } from "@/lib/graphql/request" import { notFound } from "@/server/errors/trpc" import { contentstackBaseProcedure, router } from "@/server/trpc" +import { langInput } from "@/server/utils" import { generateRefsResponseTag, @@ -26,7 +27,6 @@ import { generateTagsFromSystem, } from "@/utils/generateTag" -import { langInput } from "./input" import { type ContactConfigData, type CurrentFooterDataRaw, @@ -619,7 +619,7 @@ export const baseQueryRouter = router({ siteConfig: contentstackBaseProcedure .input(langInput) .query(async ({ input, ctx }) => { - const lang = input?.lang ?? ctx.lang + const lang = input.lang ?? ctx.lang getSiteConfigRefCounter.add(1, { lang }) console.info( diff --git a/server/routers/contentstack/bookingwidget/index.ts b/server/routers/contentstack/bookingwidget/index.ts deleted file mode 100644 index 8aeebe7ae..000000000 --- a/server/routers/contentstack/bookingwidget/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { mergeRouters } from "@/server/trpc" - -import { bookingwidgetQueryRouter } from "./query" - -export const bookingwidgetRouter = mergeRouters(bookingwidgetQueryRouter) diff --git a/server/routers/contentstack/bookingwidget/output.ts b/server/routers/contentstack/bookingwidget/output.ts deleted file mode 100644 index 6a74712b6..000000000 --- a/server/routers/contentstack/bookingwidget/output.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { z } from "zod" - -const bookingWidgetToggleSchema = z - .object({ - page_settings: z.object({ - hide_booking_widget: z.boolean(), - }), - }) - .optional() - -export const validateBookingWidgetToggleSchema = z.object({ - account_page: bookingWidgetToggleSchema, - collection_page: bookingWidgetToggleSchema, - content_page: bookingWidgetToggleSchema, - current_blocks_page: bookingWidgetToggleSchema, - destination_overview_page: bookingWidgetToggleSchema, - destination_country_page: bookingWidgetToggleSchema, - destination_city_page: bookingWidgetToggleSchema, - hotel_page: bookingWidgetToggleSchema, - loyalty_page: bookingWidgetToggleSchema, - start_page: bookingWidgetToggleSchema, -}) - -export type ValidateBookingWidgetToggleType = z.infer< - typeof validateBookingWidgetToggleSchema -> diff --git a/server/routers/contentstack/bookingwidget/utils.ts b/server/routers/contentstack/bookingwidget/utils.ts deleted file mode 100644 index af79363f0..000000000 --- a/server/routers/contentstack/bookingwidget/utils.ts +++ /dev/null @@ -1 +0,0 @@ -export const affix = "bookingwidget" diff --git a/server/routers/contentstack/index.ts b/server/routers/contentstack/index.ts index d671d0686..54f2daa32 100644 --- a/server/routers/contentstack/index.ts +++ b/server/routers/contentstack/index.ts @@ -2,7 +2,6 @@ import { router } from "@/server/trpc" import { accountPageRouter } from "./accountPage" import { baseRouter } from "./base" -import { bookingwidgetRouter } from "./bookingwidget" import { breadcrumbsRouter } from "./breadcrumbs" import { collectionPageRouter } from "./collectionPage" import { contentPageRouter } from "./contentPage" @@ -14,6 +13,7 @@ import { languageSwitcherRouter } from "./languageSwitcher" import { loyaltyLevelRouter } from "./loyaltyLevel" import { loyaltyPageRouter } from "./loyaltyPage" import { metadataRouter } from "./metadata" +import { pageSettingsRouter } from "./pageSettings" import { partnerRouter } from "./partner" import { rewardRouter } from "./reward" import { startPageRouter } from "./startPage" @@ -21,7 +21,6 @@ import { startPageRouter } from "./startPage" export const contentstackRouter = router({ accountPage: accountPageRouter, base: baseRouter, - bookingwidget: bookingwidgetRouter, breadcrumbs: breadcrumbsRouter, hotelPage: hotelPageRouter, languageSwitcher: languageSwitcherRouter, @@ -32,6 +31,7 @@ export const contentstackRouter = router({ destinationCountryPage: destinationCountryPageRouter, destinationCityPage: destinationCityPageRouter, metadata: metadataRouter, + pageSettings: pageSettingsRouter, rewards: rewardRouter, loyaltyLevels: loyaltyLevelRouter, startPage: startPageRouter, diff --git a/server/routers/contentstack/pageSettings/index.ts b/server/routers/contentstack/pageSettings/index.ts new file mode 100644 index 000000000..a6d9ecdd2 --- /dev/null +++ b/server/routers/contentstack/pageSettings/index.ts @@ -0,0 +1,5 @@ +import { mergeRouters } from "@/server/trpc" + +import { pageSettingsQueryRouter } from "./query" + +export const pageSettingsRouter = mergeRouters(pageSettingsQueryRouter) diff --git a/server/routers/contentstack/pageSettings/output.ts b/server/routers/contentstack/pageSettings/output.ts new file mode 100644 index 000000000..c53e6c96b --- /dev/null +++ b/server/routers/contentstack/pageSettings/output.ts @@ -0,0 +1,15 @@ +import { z } from "zod" + +export const pageSettingsSchema = z.object({ + hide_booking_widget: z.boolean(), +}) + +export type PageSettingsSchema = z.output + +export const getPageSettingsSchema = z.object({ + page: z.object({ + settings: pageSettingsSchema, + }), +}) + +export type GetPageSettingsSchema = z.output diff --git a/server/routers/contentstack/bookingwidget/query.ts b/server/routers/contentstack/pageSettings/query.ts similarity index 60% rename from server/routers/contentstack/bookingwidget/query.ts rename to server/routers/contentstack/pageSettings/query.ts index 3a138c7f5..6580b1945 100644 --- a/server/routers/contentstack/bookingwidget/query.ts +++ b/server/routers/contentstack/pageSettings/query.ts @@ -8,74 +8,76 @@ import { GetDestinationOverviewPageSettings, GetHotelPageSettings, GetLoyaltyPageSettings, -} from "@/lib/graphql/Query/BookingWidgetToggle.graphql" + GetStartPageSettings, +} from "@/lib/graphql/Query/PageSettings.graphql" import { request } from "@/lib/graphql/request" import { contentstackBaseProcedure, router } from "@/server/trpc" +import { langInput } from "@/server/utils" import { generateTag } from "@/utils/generateTag" -import { - validateBookingWidgetToggleSchema, - type ValidateBookingWidgetToggleType, -} from "./output" -import { affix as bookingwidgetAffix } from "./utils" - -import type { ValueOf } from "next/dist/shared/lib/constants" +import { type GetPageSettingsSchema, getPageSettingsSchema } from "./output" +import { affix } from "./utils" import { PageContentTypeEnum } from "@/types/requests/contentType" -export const bookingwidgetQueryRouter = router({ - toggle: router({ - get: contentstackBaseProcedure.query(async ({ ctx }) => { - const failedResponse = { hideBookingWidget: false } - const { contentType, uid, lang } = ctx +export const pageSettingsQueryRouter = router({ + get: contentstackBaseProcedure + .input(langInput) + .query(async ({ input, ctx }) => { + const { contentType, uid } = ctx + const lang = input.lang ?? ctx.lang // This condition is to handle 404 page case and booking flow if (!contentType || !uid) { console.log("No proper params defined: ", contentType, uid) - return failedResponse + return null } - let GetPageSettings = "" - const contentTypeCMS = >( - contentType.replaceAll("-", "_") - ) - switch (contentTypeCMS) { + let GetPageSettings = "" + + switch (contentType) { case PageContentTypeEnum.accountPage: GetPageSettings = GetAccountPageSettings break - case PageContentTypeEnum.loyaltyPage: - GetPageSettings = GetLoyaltyPageSettings - break case PageContentTypeEnum.collectionPage: GetPageSettings = GetCollectionPageSettings break case PageContentTypeEnum.contentPage: GetPageSettings = GetContentPageSettings break - case PageContentTypeEnum.destinationOverviewPage: - GetPageSettings = GetDestinationOverviewPageSettings - break - case PageContentTypeEnum.destinationCountryPage: - GetPageSettings = GetDestinationCountryPageSettings + case PageContentTypeEnum.currentBlocksPage: + GetPageSettings = GetCurrentBlocksPageSettings break case PageContentTypeEnum.destinationCityPage: GetPageSettings = GetDestinationCityPageSettings break + case PageContentTypeEnum.destinationCountryPage: + GetPageSettings = GetDestinationCountryPageSettings + break + case PageContentTypeEnum.destinationOverviewPage: + GetPageSettings = GetDestinationOverviewPageSettings + break case PageContentTypeEnum.hotelPage: GetPageSettings = GetHotelPageSettings break - case PageContentTypeEnum.currentBlocksPage: - GetPageSettings = GetCurrentBlocksPageSettings + case PageContentTypeEnum.loyaltyPage: + GetPageSettings = GetLoyaltyPageSettings + break + case PageContentTypeEnum.startPage: + GetPageSettings = GetStartPageSettings break } if (!GetPageSettings) { - console.error("No proper Content type defined: ", contentType) - return failedResponse + console.error( + "[pageSettings] No proper Content type defined: ", + contentType + ) + return null } - const response = await request( + const response = await request( GetPageSettings, { uid: uid, @@ -84,28 +86,18 @@ export const bookingwidgetQueryRouter = router({ { cache: "force-cache", next: { - tags: [generateTag(lang, uid, bookingwidgetAffix)], + tags: [generateTag(lang, uid, affix)], }, } ) - const bookingWidgetToggleData = - validateBookingWidgetToggleSchema.safeParse(response.data) - if (!bookingWidgetToggleData.success) { - console.error( - "Flag hide_booking_widget fetch error: ", - bookingWidgetToggleData.error - ) - return failedResponse + const result = getPageSettingsSchema.safeParse(response.data) + + if (!result.success) { + console.error("Page settings fetch error: ", result.error) + return null } - const hideBookingWidget = - !!bookingWidgetToggleData.data[contentTypeCMS]?.page_settings - ?.hide_booking_widget - - return { - hideBookingWidget, - } + return result.data }), - }), }) diff --git a/server/routers/contentstack/pageSettings/utils.ts b/server/routers/contentstack/pageSettings/utils.ts new file mode 100644 index 000000000..79ec27b7f --- /dev/null +++ b/server/routers/contentstack/pageSettings/utils.ts @@ -0,0 +1 @@ +export const affix = "pageSettings" diff --git a/server/routers/contentstack/reward/query.ts b/server/routers/contentstack/reward/query.ts index 8b3fef759..b8f8b9a5f 100644 --- a/server/routers/contentstack/reward/query.ts +++ b/server/routers/contentstack/reward/query.ts @@ -8,8 +8,8 @@ import { protectedProcedure, router, } from "@/server/trpc" +import { langInput } from "@/server/utils" -import { langInput } from "../base/input" import { getAllLoyaltyLevels, getLoyaltyLevel } from "../loyaltyLevel/query" import { rewardsAllInput,