From 7eeafd2a204e0d4c36582b2db6162c2024789744 Mon Sep 17 00:00:00 2001 From: Fredrik Thorsson Date: Wed, 11 Sep 2024 15:39:57 +0200 Subject: [PATCH] feat(SW-251): use response to render filters --- .../hotelreservation/select-hotel/page.tsx | 35 ++++++++++++++++--- .../HotelReservation/HotelCard/index.tsx | 19 +++++----- .../SelectHotel/HotelFilter/index.tsx | 29 ++++++++------- server/routers/hotels/input.ts | 2 +- server/routers/hotels/query.ts | 10 ++---- .../selectHotel/hotelFilters.ts | 5 +++ 6 files changed, 65 insertions(+), 35 deletions(-) create mode 100644 types/components/hotelReservation/selectHotel/hotelFilters.ts diff --git a/app/[lang]/(live)/(public)/hotelreservation/select-hotel/page.tsx b/app/[lang]/(live)/(public)/hotelreservation/select-hotel/page.tsx index 0c128c835..032ff30f0 100644 --- a/app/[lang]/(live)/(public)/hotelreservation/select-hotel/page.tsx +++ b/app/[lang]/(live)/(public)/hotelreservation/select-hotel/page.tsx @@ -33,7 +33,7 @@ async function getAvailableHotels({ const { availability } = getAvailableHotels const hotels = availability.map(async (hotel) => { - const hotelData = await serverClient().hotel.hotel.get({ + const hotelData = await serverClient().hotel.hotelData.get({ hotelId: hotel.hotelId.toString(), language: getLang(), }) @@ -53,7 +53,6 @@ export default async function SelectHotelPage({ setLang(params.lang) const tempSearchTerm = "Stockholm" - const intl = await getIntl() const hotels = await getAvailableHotels({ @@ -64,9 +63,37 @@ export default async function SelectHotelPage({ }) if (!hotels) return null - if (hotels.some((item) => item?.hotelData === undefined)) return notFound() + const filters = hotels.flatMap((data) => data.hotelData?.detailedFacilities) + + const filterId = [...new Set(filters.map((data) => data?.id))] + const filterList: { + name: string + id: number + applyToAllHotels: boolean + public: boolean + icon: string + sortOrder: number + code?: string + iconName?: string + }[] = filterId + .map((data) => filters.find((find) => find?.id === data)) + .filter( + ( + filter + ): filter is { + name: string + id: number + applyToAllHotels: boolean + public: boolean + icon: string + sortOrder: number + code?: string + iconName?: string + } => filter !== undefined + ) + return (
@@ -82,7 +109,7 @@ export default async function SelectHotelPage({ {intl.formatMessage({ id: "Show map" })} - +
diff --git a/components/HotelReservation/HotelCard/index.tsx b/components/HotelReservation/HotelCard/index.tsx index 5cd6989f0..83d830515 100644 --- a/components/HotelReservation/HotelCard/index.tsx +++ b/components/HotelReservation/HotelCard/index.tsx @@ -25,19 +25,16 @@ export default function HotelCard({ hotel }: HotelCardProps) { const { hotelData } = hotel const { price } = hotel - if (!hotelData) return null - if (!price) return null - - const sortedAmenities = hotelData.detailedFacilities - ?.sort((a, b) => b.sortOrder - a.sortOrder) + const sortedAmenities = hotelData?.detailedFacilities + .sort((a, b) => b.sortOrder - a.sortOrder) .slice(0, 5) return (
{hotelData.hotelContent.images.metaData.altText} - {hotelData.ratings?.tripAdvisor.rating} + {hotelData?.ratings?.tripAdvisor.rating}
- {hotelData.name} + {hotelData?.name} - {`${hotelData.address?.streetAddress}, ${hotelData.address?.city}`} + {`${hotelData?.address?.streetAddress}, ${hotelData?.address?.city}`} - {`${hotelData.location.distanceToCentre} ${intl.formatMessage({ id: "km to city center" })}`} + {`${hotelData?.location.distanceToCentre} ${intl.formatMessage({ id: "km to city center" })}`}
diff --git a/components/HotelReservation/SelectHotel/HotelFilter/index.tsx b/components/HotelReservation/SelectHotel/HotelFilter/index.tsx index cc171f654..a3a993aee 100644 --- a/components/HotelReservation/SelectHotel/HotelFilter/index.tsx +++ b/components/HotelReservation/SelectHotel/HotelFilter/index.tsx @@ -1,23 +1,28 @@ -import { getIntl } from "@/i18n" +"use client" + +import { useIntl } from "react-intl" import styles from "./hotelFilter.module.css" -export default async function HotelFilter() { - const intl = await getIntl() +import { HotelFiltersProps } from "@/types/components/hotelReservation/selectHotel/hotelFilters" + +export default function HotelFilter({ filters }: HotelFiltersProps) { + const intl = useIntl() return ( ) diff --git a/server/routers/hotels/input.ts b/server/routers/hotels/input.ts index a89c55dc2..416d41eee 100644 --- a/server/routers/hotels/input.ts +++ b/server/routers/hotels/input.ts @@ -21,7 +21,7 @@ export const getRatesInputSchema = z.object({ hotelId: z.string(), }) -export const getPlaceholderInputSchema = z.object({ +export const getlHotelDataInputSchema = z.object({ hotelId: z.string(), language: z.string(), include: z diff --git a/server/routers/hotels/query.ts b/server/routers/hotels/query.ts index 1532d1690..5f8ae5dd9 100644 --- a/server/routers/hotels/query.ts +++ b/server/routers/hotels/query.ts @@ -28,7 +28,7 @@ import { import { getAvailabilityInputSchema, getHotelInputSchema, - getPlaceholderInputSchema, + getlHotelDataInputSchema, getRatesInputSchema, } from "./input" import { @@ -55,10 +55,6 @@ const availabilityFailCounter = meter.createCounter( "trpc.hotel.availability-fail" ) -const filterCounter = meter.createCounter("trcp.hotel.filter") -const filterSuccessCounter = meter.createCounter("trcp.hotel.filter-success") -const filterFailCounter = meter.createCounter("trcp.hotel.filter-fail") - async function getContentstackData( locale: string, uid: string | null | undefined @@ -421,9 +417,9 @@ export const hotelQueryRouter = router({ return validatedHotelData.data }), }), - hotel: router({ + hotelData: router({ get: serviceProcedure - .input(getPlaceholderInputSchema) + .input(getlHotelDataInputSchema) .query(async ({ ctx, input }) => { const { hotelId, language, include } = input diff --git a/types/components/hotelReservation/selectHotel/hotelFilters.ts b/types/components/hotelReservation/selectHotel/hotelFilters.ts new file mode 100644 index 000000000..1be84f63d --- /dev/null +++ b/types/components/hotelReservation/selectHotel/hotelFilters.ts @@ -0,0 +1,5 @@ +import { Hotel } from "@/types/hotel" + +export type HotelFiltersProps = { + filters: Hotel["detailedFacilities"] +}