From 57bc08aae2fd7322c147fcccc7ef464a001a41c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20Landstr=C3=B6m?= Date: Fri, 10 Jan 2025 15:18:21 +0000 Subject: [PATCH] Merged in feat/SW-1090-amenities-meetings-sidepeeks (pull request #1114) Feat/SW-1090: Sidepeek amenities and meetings Approved-by: Erik Tiekstra Approved-by: Fredrik Thorsson --- .../AccordionAmenities/Breakfast/index.tsx | 15 +++- .../HotelPage/SidePeeks/Amenities/index.tsx | 20 ++++- .../MeetingsAndConferences/index.tsx | 20 ++++- .../SidePeeks/MeetingsAndConferences/util.ts | 70 ++++++++++++++++ .../OpeningHours/index.tsx | 14 ++-- .../OpeningHours/openingHours.module.css | 0 .../RestaurantBar/RestaurantBarItem/index.tsx | 4 +- .../WellnessAndExercise/Facility/index.tsx | 2 +- components/ContentType/HotelPage/index.tsx | 7 +- i18n/dictionaries/da.json | 8 +- i18n/dictionaries/de.json | 8 +- i18n/dictionaries/en.json | 8 +- i18n/dictionaries/fi.json | 8 +- i18n/dictionaries/no.json | 8 +- i18n/dictionaries/sv.json | 8 +- lib/trpc/memoizedRequests/index.ts | 9 ++ server/routers/hotels/input.ts | 5 ++ server/routers/hotels/output.ts | 46 ++++++++++ server/routers/hotels/query.ts | 83 +++++++++++++++++++ server/routers/hotels/telemetry.ts | 10 +++ types/components/hotelPage/meetingRooms.ts | 6 ++ .../hotelPage/sidepeek/amenities.ts | 12 ++- .../sidepeek/meetingsAndConferences.ts | 1 + .../hotelPage/sidepeek/openingHours.ts | 6 ++ .../hotelPage/sidepeek/restaurantBar.ts | 7 +- utils/facilityCards.ts | 2 +- 26 files changed, 350 insertions(+), 37 deletions(-) create mode 100644 components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/util.ts rename components/ContentType/HotelPage/SidePeeks/{RestaurantBar => }/OpeningHours/index.tsx (85%) rename components/ContentType/HotelPage/SidePeeks/{RestaurantBar => }/OpeningHours/openingHours.module.css (100%) create mode 100644 types/components/hotelPage/meetingRooms.ts create mode 100644 types/components/hotelPage/sidepeek/openingHours.ts diff --git a/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Breakfast/index.tsx b/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Breakfast/index.tsx index d19dc93c9..8e7c7c479 100644 --- a/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Breakfast/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Breakfast/index.tsx @@ -1,9 +1,15 @@ import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem" import { getIntl } from "@/i18n" +import OpeningHours from "../../../OpeningHours" + +import type { BreakfastAmenityProps } from "@/types/components/hotelPage/sidepeek/amenities" import { IconName } from "@/types/components/icon" -export default async function BreakfastAmenity() { +export default async function BreakfastAmenity({ + openingHours, + alternateOpeningHours, +}: BreakfastAmenityProps) { const intl = await getIntl() return ( - {/* TODO: breakfast to be implemented */} + ) } diff --git a/components/ContentType/HotelPage/SidePeeks/Amenities/index.tsx b/components/ContentType/HotelPage/SidePeeks/Amenities/index.tsx index 4026621b1..d5cbbfc37 100644 --- a/components/ContentType/HotelPage/SidePeeks/Amenities/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/Amenities/index.tsx @@ -21,6 +21,7 @@ export default async function AmenitiesSidePeek({ parking, checkInInformation, accessibility, + restaurants, }: AmenitiesSidePeekProps) { const lang = getLang() const intl = await getIntl() @@ -40,6 +41,17 @@ export default async function AmenitiesSidePeek({ (amenity) => !amenitiesToRemove.includes(amenity.id) ) + const breakfastOpeningHours = restaurants + ?.map((restaurant) => { + const breakfastDetail = restaurant.openingDetails.find( + (details) => + details.openingHours.name === "Breakfast" || + details.openingHours.name === intl.formatMessage({ id: "Breakfast" }) + ) + return breakfastDetail + }) + .filter(Boolean)[0] + return ( {parking.length ? : null} - + + {breakfastOpeningHours && ( + + )} {accessibility && ( diff --git a/components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/index.tsx b/components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/index.tsx index f1a1c5101..733c1953b 100644 --- a/components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/index.tsx @@ -1,4 +1,5 @@ import { meetingsAndConferences } from "@/constants/routes/hotelPageParams" +import { getMeetingRooms } from "@/lib/trpc/memoizedRequests" import Image from "@/components/Image" import Button from "@/components/TempDesignSystem/Button" @@ -10,6 +11,8 @@ import Title from "@/components/TempDesignSystem/Text/Title" import { getIntl } from "@/i18n" import { getLang } from "@/i18n/serverContext" +import { getConferenceRoomTexts } from "./util" + import styles from "./meetingsAndConferences.module.css" import type { MeetingsAndConferencesSidePeekProps } from "@/types/components/hotelPage/sidepeek/meetingsAndConferences" @@ -17,10 +20,17 @@ import type { MeetingsAndConferencesSidePeekProps } from "@/types/components/hot export default async function MeetingsAndConferencesSidePeek({ meetingFacilities, descriptions, + hotelId, link, }: MeetingsAndConferencesSidePeekProps) { const lang = getLang() - const intl = await getIntl() + const [intl, meetingRooms] = await Promise.all([ + getIntl(), + getMeetingRooms({ hotelId, language: lang }), + ]) + + const { seatingText, roomText } = await getConferenceRoomTexts(meetingRooms) + const fallbackAlt = intl.formatMessage({ id: "Creative spaces for meetings" }) const primaryImage = meetingFacilities?.heroImages[0]?.imageSizes.medium @@ -65,6 +75,14 @@ export default async function MeetingsAndConferencesSidePeek({ {descriptions?.medium && ( {descriptions.medium} )} + {roomText || seatingText ? ( + + {roomText} + {roomText && seatingText &&
} + {seatingText} + + ) : null} + {link && (