diff --git a/apps/scandic-web/components/Blocks/HotelListing/HotelListingItem/index.tsx b/apps/scandic-web/components/Blocks/HotelListing/HotelListingItem/index.tsx index 5686a649a..b7524347f 100644 --- a/apps/scandic-web/components/Blocks/HotelListing/HotelListingItem/index.tsx +++ b/apps/scandic-web/components/Blocks/HotelListing/HotelListingItem/index.tsx @@ -18,20 +18,24 @@ import type { HotelListingItemProps } from "@/types/components/contentPage/hotel export default async function HotelListingItem({ hotel, + additionalData, contentType = "hotel", url, }: HotelListingItemProps) { const intl = await getIntl() - const { description, imageSrc, altText } = getTypeSpecificInformation( + const { description, image, cta } = getTypeSpecificInformation( + intl, contentType, - hotel + hotel.hotelContent, + additionalData, + url ) return (
{altText} {description} - {url && ( + + {cta.url && ( )} diff --git a/apps/scandic-web/components/Blocks/HotelListing/HotelListingItem/utils.ts b/apps/scandic-web/components/Blocks/HotelListing/HotelListingItem/utils.ts index 9b07381a2..178471abb 100644 --- a/apps/scandic-web/components/Blocks/HotelListing/HotelListingItem/utils.ts +++ b/apps/scandic-web/components/Blocks/HotelListing/HotelListingItem/utils.ts @@ -1,36 +1,67 @@ -import type { Hotel } from "@/types/hotel" +import type { IntlShape } from "react-intl" + +import type { AdditionalData, Hotel } from "@/types/hotel" import type { HotelListing } from "@/types/trpc/routers/contentstack/blocks" export function getTypeSpecificInformation( + intl: IntlShape, contentType: HotelListing["contentType"], - hotel: Hotel + hotelContent: Hotel["hotelContent"], + additionalData: AdditionalData, + url: string | null ) { - const { images } = hotel.hotelContent - const { descriptions, meetingDescription } = hotel.hotelContent.texts - const hotelData = { + const { images, texts } = hotelContent + const { descriptions, meetingDescription } = texts + const { conferencesAndMeetings, restaurantsOverviewPage, restaurantImages } = + additionalData + const data = { description: descriptions?.short, - imageSrc: images.imageSizes.small, - altText: images.metaData.altText, + image: { + src: images.imageSizes.small, + alt: images.metaData.altText, + }, + cta: { + text: intl.formatMessage({ id: "See hotel details" }), + url, + openInNewTab: false, + }, } switch (contentType) { case "meeting": - const meetingImage = hotel.conferencesAndMeetings?.heroImages[0] - return { - description: meetingDescription?.short || hotelData.description, - imageSrc: meetingImage?.imageSizes.small || hotelData.imageSrc, - altText: meetingImage?.metaData.altText || hotelData.altText, + const meetingImage = conferencesAndMeetings?.heroImages[0] + const meetingUrl = additionalData.meetingRooms.meetingOnlineLink + if (meetingDescription?.short) { + data.description = meetingDescription.short } + if (meetingImage) { + data.image = { + src: meetingImage.imageSizes.small, + alt: meetingImage.metaData.altText, + } + } + if (meetingUrl) { + data.cta = { + text: intl.formatMessage({ id: "Book a meeting" }), + url: meetingUrl, + openInNewTab: true, + } + } + return data case "restaurant": - const restaurantImage = hotel.restaurantImages?.heroImages[0] - return { - description: - hotel.hotelContent.restaurantsOverviewPage - .restaurantsContentDescriptionShort || hotelData.description, - imageSrc: restaurantImage?.imageSizes.small || hotelData.imageSrc, - altText: restaurantImage?.metaData.altText || hotelData.altText, + const restaurantImage = restaurantImages?.heroImages[0] + if (restaurantsOverviewPage.restaurantsContentDescriptionShort) { + data.description = + restaurantsOverviewPage.restaurantsContentDescriptionShort } + if (restaurantImage) { + data.image = { + src: restaurantImage.imageSizes.small, + alt: restaurantImage.metaData.altText, + } + } + return data case "hotel": default: - return hotelData + return data } } diff --git a/apps/scandic-web/components/Blocks/HotelListing/index.tsx b/apps/scandic-web/components/Blocks/HotelListing/index.tsx index 1c4694149..31d79d61d 100644 --- a/apps/scandic-web/components/Blocks/HotelListing/index.tsx +++ b/apps/scandic-web/components/Blocks/HotelListing/index.tsx @@ -15,7 +15,7 @@ export default async function HotelListing({ }: HotelListingProps) { const hotels = await getHotelsByCSFilter({ locationFilter, - hotelsToInclude: hotelsToInclude, + hotelsToInclude, }) if (!hotels.length) { @@ -27,10 +27,11 @@ export default async function HotelListing({ {heading} - {hotels.map(({ url, ...data }) => ( + {hotels.map(({ url, hotel, additionalData }) => ( diff --git a/apps/scandic-web/i18n/dictionaries/da.json b/apps/scandic-web/i18n/dictionaries/da.json index 20a6e3bb6..9411d4285 100644 --- a/apps/scandic-web/i18n/dictionaries/da.json +++ b/apps/scandic-web/i18n/dictionaries/da.json @@ -93,6 +93,7 @@ "Boardroom": "Boardroom", "Book": "Book", "Book Reward Night": "Book bonusnat", + "Book a meeting": "Book et møde", "Book a table online": "Book et bord online", "Book another stay": "Book another stay", "Book parking": "Book parkering", diff --git a/apps/scandic-web/i18n/dictionaries/de.json b/apps/scandic-web/i18n/dictionaries/de.json index b7a76e970..7da8535bf 100644 --- a/apps/scandic-web/i18n/dictionaries/de.json +++ b/apps/scandic-web/i18n/dictionaries/de.json @@ -94,6 +94,7 @@ "Boardroom": "Boardroom", "Book": "Buchen", "Book Reward Night": "Bonusnacht buchen", + "Book a meeting": "Buchen Sie ein Meeting", "Book a table online": "Tisch online buchen", "Book another stay": "Book another stay", "Book parking": "Parkplatz buchen", diff --git a/apps/scandic-web/i18n/dictionaries/en.json b/apps/scandic-web/i18n/dictionaries/en.json index c406592a3..4a6b847f2 100644 --- a/apps/scandic-web/i18n/dictionaries/en.json +++ b/apps/scandic-web/i18n/dictionaries/en.json @@ -92,6 +92,7 @@ "Boardroom": "Boardroom", "Book": "Book", "Book Reward Night": "Book Reward Night", + "Book a meeting": "Book a meeting", "Book a table online": "Book a table online", "Book another stay": "Book another stay", "Book parking": "Book parking", diff --git a/apps/scandic-web/i18n/dictionaries/fi.json b/apps/scandic-web/i18n/dictionaries/fi.json index e0bbafede..d056219d6 100644 --- a/apps/scandic-web/i18n/dictionaries/fi.json +++ b/apps/scandic-web/i18n/dictionaries/fi.json @@ -92,6 +92,7 @@ "Boardroom": "Boardroom", "Book": "Varaa", "Book Reward Night": "Kirjapalkinto-ilta", + "Book a meeting": "Varaa kokous", "Book a table online": "Varaa pöytä verkossa", "Book another stay": "Book another stay", "Book parking": "Varaa pysäköinti", diff --git a/apps/scandic-web/i18n/dictionaries/no.json b/apps/scandic-web/i18n/dictionaries/no.json index 74b6025fb..544fa61a6 100644 --- a/apps/scandic-web/i18n/dictionaries/no.json +++ b/apps/scandic-web/i18n/dictionaries/no.json @@ -92,6 +92,7 @@ "Boardroom": "Boardroom", "Book": "Bestill", "Book Reward Night": "Bestill belønningskveld", + "Book a meeting": "Bestill et møte", "Book a table online": "Bestill bord online", "Book another stay": "Book another stay", "Book parking": "Bestill parkering", diff --git a/apps/scandic-web/i18n/dictionaries/sv.json b/apps/scandic-web/i18n/dictionaries/sv.json index 82727eba2..f17d98f0d 100644 --- a/apps/scandic-web/i18n/dictionaries/sv.json +++ b/apps/scandic-web/i18n/dictionaries/sv.json @@ -92,6 +92,7 @@ "Boardroom": "Boardroom", "Book": "Boka", "Book Reward Night": "Boka frinatt", + "Book a meeting": "Boka ett möte", "Book a table online": "Boka ett bord online", "Book another stay": "Book another stay", "Book parking": "Boka parkering", diff --git a/apps/scandic-web/server/routers/hotels/schemas/hotel/include/additionalData.ts b/apps/scandic-web/server/routers/hotels/schemas/hotel/include/additionalData.ts index a5870434a..d7eb31f5f 100644 --- a/apps/scandic-web/server/routers/hotels/schemas/hotel/include/additionalData.ts +++ b/apps/scandic-web/server/routers/hotels/schemas/hotel/include/additionalData.ts @@ -27,7 +27,11 @@ export const additionalDataSchema = z.object({ hotelRoomElevatorPitchText: nullableStringValidator, hotelSpecialNeeds: extraPageSchema, id: nullableStringValidator, - meetingRooms: extraPageSchema, + meetingRooms: extraPageSchema.merge( + z.object({ + meetingOnlineLink: z.string().nullish(), + }) + ), name: nullableStringValidator, parkingImages: facilitySchema.nullish(), restaurantImages: facilitySchema.nullish(), diff --git a/apps/scandic-web/types/components/contentPage/hotelListingItem.ts b/apps/scandic-web/types/components/contentPage/hotelListingItem.ts index d6bf0283b..baeaa2ed0 100644 --- a/apps/scandic-web/types/components/contentPage/hotelListingItem.ts +++ b/apps/scandic-web/types/components/contentPage/hotelListingItem.ts @@ -1,8 +1,9 @@ -import type { Hotel } from "@/types/hotel" +import type { AdditionalData, Hotel } from "@/types/hotel" import type { HotelListing } from "@/types/trpc/routers/contentstack/blocks" export interface HotelListingItemProps { hotel: Hotel + additionalData: AdditionalData contentType: HotelListing["contentType"] url: string | null }