feat(SW-2863): Move contentstack router to trpc package * Add exports to packages and lint rule to prevent relative imports * Add env to trpc package * Add eslint to trpc package * Apply lint rules * Use direct imports from trpc package * Add lint-staged config to trpc * Move lang enum to common * Restructure trpc package folder structure * WIP first step * update internal imports in trpc * Fix most errors in scandic-web Just 100 left... * Move Props type out of trpc * Fix CategorizedFilters types * Move more schemas in hotel router * Fix deps * fix getNonContentstackUrls * Fix import error * Fix entry error handling * Fix generateMetadata metrics * Fix alertType enum * Fix duplicated types * lint:fix * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package * Fix broken imports * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package Approved-by: Linus Flood
68 lines
1.9 KiB
TypeScript
68 lines
1.9 KiB
TypeScript
import type {
|
|
CategorizedFilters,
|
|
Filter,
|
|
} from "../../../types/destinationFilterAndSort"
|
|
import type { DestinationPagesHotelData } from "../../../types/hotel"
|
|
|
|
const HOTEL_SURROUNDINGS_FILTER_TYPE_NAMES = [
|
|
"Hotel surroundings",
|
|
"Hotel omgivelser",
|
|
"Hotelumgebung",
|
|
"Hotellia lähellä",
|
|
"Hotellomgivelser",
|
|
"Omgivningar",
|
|
]
|
|
|
|
const HOTEL_FACILITIES_FILTER_TYPE_NAMES = [
|
|
"Hotel facilities",
|
|
"Hotellfaciliteter",
|
|
"Hotelfaciliteter",
|
|
"Hotel faciliteter",
|
|
"Hotel-Infos",
|
|
"Hotellin palvelut",
|
|
]
|
|
|
|
export function getFiltersFromHotels(
|
|
hotels: DestinationPagesHotelData[]
|
|
): CategorizedFilters {
|
|
if (hotels.length === 0) {
|
|
return { facilityFilters: [], surroundingsFilters: [] }
|
|
}
|
|
|
|
const filters = hotels.flatMap(({ hotel }) => hotel.detailedFacilities)
|
|
const uniqueFilterNames = [...new Set(filters.map((filter) => filter.name))]
|
|
const filterList = uniqueFilterNames
|
|
.map((filterName) => {
|
|
const filter = filters.find((filter) => filter.name === filterName)
|
|
return filter
|
|
? {
|
|
name: filter.name,
|
|
slug: filter.slug,
|
|
filterType: filter.filter,
|
|
sortOrder: filter.sortOrder,
|
|
}
|
|
: null
|
|
})
|
|
.filter((filter): filter is Filter => !!filter)
|
|
|
|
const facilityFilters = filterList.filter((filter) =>
|
|
HOTEL_FACILITIES_FILTER_TYPE_NAMES.includes(filter.filterType)
|
|
)
|
|
const surroundingsFilters = filterList.filter((filter) =>
|
|
HOTEL_SURROUNDINGS_FILTER_TYPE_NAMES.includes(filter.filterType)
|
|
)
|
|
return {
|
|
facilityFilters: sortFilters(facilityFilters),
|
|
surroundingsFilters: sortFilters(surroundingsFilters),
|
|
}
|
|
}
|
|
|
|
function sortFilters(filters: Filter[]): Filter[] {
|
|
return [...filters].sort((a, b) => {
|
|
// First sort by sortOrder
|
|
const orderDiff = a.sortOrder - b.sortOrder
|
|
// If sortOrder is the same, sort by name as secondary criterion
|
|
return orderDiff === 0 ? a.name.localeCompare(b.name) : orderDiff
|
|
})
|
|
}
|