feat(BOOK-463): Fetching hotel filters from CMS and using these inside the destination pages and select hotel page

* feat(BOOK-463): Fetching hotel filters from CMS and using these inside the destination pages

* fix(BOOK-698): fetch hotel filters from CMS on select hotel page

Approved-by: Bianca Widstam
This commit is contained in:
Erik Tiekstra
2026-01-12 12:02:25 +00:00
parent b2ca2c2612
commit 0c6a4cf186
40 changed files with 732 additions and 399 deletions

View File

@@ -1,16 +1,13 @@
import { ApiCountry } from "../../../types/country"
import { HotelSortOption } from "../../../types/hotel"
import {
getFiltersFromHotels,
mergeHotelFiltersAndSeoFilters,
} from "../../../utils/getFiltersFromHotels"
import { getSortedCities } from "../../../utils/getSortedCities"
import { mergeHotelFiltersAndSeoFilters } from "../../../utils/mergeHotelFiltersAndSeoFilters"
import { getHotelFilters } from "../../hotels/filters/utils"
import {
getCityByCityIdentifier,
getHotelIdsByCityIdentifier,
} from "../../hotels/services/getCityByCityIdentifier"
import { getHotelIdsByCountry } from "../../hotels/services/getHotelIdsByCountry"
import { getHotelsByHotelIds } from "../../hotels/services/getHotelsByHotelIds"
import { getCityPages } from "../destinationCountryPage/utils"
import { transformDestinationFiltersResponse } from "../schemas/destinationFilters"
@@ -62,11 +59,9 @@ export async function getCityData(
serviceToken
)
const hotels = await getHotelsByHotelIds({ hotelIds, lang, serviceToken })
let filterType
if (filter) {
const hotelFilters = getFiltersFromHotels(hotels, lang)
const hotelFilters = await getHotelFilters(lang)
const allFilters = mergeHotelFiltersAndSeoFilters(
hotelFilters,
seoFilters
@@ -104,6 +99,7 @@ export async function getCountryData(
lang: Lang
) {
const country = data.destination_settings?.country
const seoFilters = transformDestinationFiltersResponse(data.seo_filters)
const filter = input.filterFromUrl
if (country) {
@@ -117,10 +113,13 @@ export async function getCountryData(
serviceToken,
})
const hotels = await getHotelsByHotelIds({ hotelIds, lang, serviceToken })
if (filter) {
const allFilters = getFiltersFromHotels(hotels, lang)
const hotelFilters = await getHotelFilters(lang)
const allFilters = mergeHotelFiltersAndSeoFilters(
hotelFilters,
seoFilters
)
const facilityFilter = allFilters.facilityFilters.find(
(f) => f.slug === filter
)

View File

@@ -1,10 +1,10 @@
import { z } from "zod"
import { FacilityEnum } from "@scandic-hotels/common/constants/facilities"
import { isDefined } from "@scandic-hotels/common/utils/isDefined"
import { DestinationFilterBlocksEnum } from "../../../types/destinationsData"
import { discriminatedUnionArray } from "../../../utils/discriminatedUnion"
import { hotelFilterSchema } from "../../hotels/filters/output"
import { accordionSchema } from "./blocks/accordion"
import { contentSchema } from "./blocks/content"
import { systemSchema } from "./system"
@@ -37,12 +37,7 @@ export const destinationFilterSchema = z.object({
filterConnection: z.object({
edges: z.array(
z.object({
node: z.object({
title: z.string(),
facility_id: z.nativeEnum(FacilityEnum).catch(FacilityEnum.UNKNOWN),
category: z.string(),
slug: z.string(),
}),
node: hotelFilterSchema,
})
),
}),
@@ -84,13 +79,7 @@ export function transformDestinationFiltersResponse(
heading,
preamble,
blocks,
filter: {
id: filter.facility_id,
name: filter.title,
filterType: filter.category,
slug: filter.slug,
sortOrder: 0,
},
filter,
}
})
.filter(isDefined)