148 lines
4.0 KiB
TypeScript
148 lines
4.0 KiB
TypeScript
import { getIntl } from "@/i18n"
|
|
|
|
import type { RawMetadataSchema } from "@scandic-hotels/trpc/routers/contentstack/metadata/output"
|
|
|
|
async function getSubpageTitle(
|
|
subpageUrl: string,
|
|
additionalHotelData: RawMetadataSchema["additionalHotelData"],
|
|
hotelRestaurants: RawMetadataSchema["hotelRestaurants"],
|
|
hotelName: string,
|
|
destination: string
|
|
) {
|
|
const intl = await getIntl()
|
|
const restaurantSubPage = hotelRestaurants?.find(
|
|
(restaurant) => restaurant.nameInUrl === subpageUrl
|
|
)
|
|
if (restaurantSubPage) {
|
|
const restaurantTitleLong = intl.formatMessage(
|
|
{
|
|
defaultMessage:
|
|
"Explore {restaurantName} at {hotelName} in {destination}",
|
|
},
|
|
{
|
|
restaurantName: restaurantSubPage.name,
|
|
hotelName,
|
|
destination,
|
|
}
|
|
)
|
|
const restaurantTitleShort = intl.formatMessage(
|
|
{
|
|
defaultMessage: "Explore {restaurantName} at {hotelName}",
|
|
},
|
|
{
|
|
restaurantName: restaurantSubPage.name,
|
|
hotelName,
|
|
}
|
|
)
|
|
|
|
if (restaurantTitleLong.length > 60) {
|
|
return restaurantTitleShort
|
|
}
|
|
return restaurantTitleLong
|
|
}
|
|
|
|
if (!additionalHotelData) {
|
|
return null
|
|
}
|
|
|
|
switch (subpageUrl) {
|
|
case additionalHotelData.hotelParking?.nameInUrl:
|
|
const parkingTitleLong = intl.formatMessage(
|
|
{
|
|
defaultMessage:
|
|
"Parking information for {hotelName} in {destination}",
|
|
},
|
|
{ hotelName, destination }
|
|
)
|
|
const parkingTitleShort = intl.formatMessage(
|
|
{ defaultMessage: "Parking information for {hotelName}" },
|
|
{ hotelName }
|
|
)
|
|
|
|
if (parkingTitleLong.length > 60) {
|
|
return parkingTitleShort
|
|
}
|
|
return parkingTitleLong
|
|
case additionalHotelData.healthAndFitness?.nameInUrl:
|
|
const wellnessTitleLong = intl.formatMessage(
|
|
{
|
|
defaultMessage:
|
|
"Gym & health facilities at {hotelName} in {destination}",
|
|
},
|
|
{ hotelName, destination }
|
|
)
|
|
const wellnessTitleShort = intl.formatMessage(
|
|
{ defaultMessage: "Gym & health facilities at {hotelName}" },
|
|
{ hotelName }
|
|
)
|
|
|
|
if (wellnessTitleLong.length > 60) {
|
|
return wellnessTitleShort
|
|
}
|
|
return wellnessTitleLong
|
|
case additionalHotelData.hotelSpecialNeeds?.nameInUrl:
|
|
const accessibilityTitleLong = intl.formatMessage(
|
|
{
|
|
defaultMessage: "Accessibility at {hotelName} in {destination}",
|
|
},
|
|
{ hotelName, destination }
|
|
)
|
|
const accessibilityTitleShort = intl.formatMessage(
|
|
{ defaultMessage: "Accessibility at {hotelName}" },
|
|
{ hotelName }
|
|
)
|
|
|
|
if (accessibilityTitleLong.length > 60) {
|
|
return accessibilityTitleShort
|
|
}
|
|
return accessibilityTitleLong
|
|
case additionalHotelData.meetingRooms?.nameInUrl:
|
|
const meetingsTitleLong = intl.formatMessage(
|
|
{
|
|
defaultMessage:
|
|
"Meetings & conferences at {hotelName} in {destination}",
|
|
},
|
|
{ hotelName, destination }
|
|
)
|
|
const meetingsTitleShort = intl.formatMessage(
|
|
{ defaultMessage: "Meetings & conferences at {hotelName}" },
|
|
{ hotelName }
|
|
)
|
|
|
|
if (meetingsTitleLong.length > 60) {
|
|
return meetingsTitleShort
|
|
}
|
|
return meetingsTitleLong
|
|
default:
|
|
return null
|
|
}
|
|
}
|
|
|
|
export async function getHotelPageTitle(data: RawMetadataSchema) {
|
|
const intl = await getIntl()
|
|
const { subpageUrl, hotelData, additionalHotelData, hotelRestaurants } = data
|
|
if (!hotelData) {
|
|
return null
|
|
}
|
|
|
|
const hotelName = hotelData.name
|
|
const destination = hotelData.translatedCityName
|
|
|
|
if (subpageUrl) {
|
|
const subpageTitle = await getSubpageTitle(
|
|
subpageUrl,
|
|
additionalHotelData,
|
|
hotelRestaurants,
|
|
hotelName,
|
|
destination
|
|
)
|
|
|
|
return subpageTitle
|
|
}
|
|
|
|
return intl.formatMessage(
|
|
{ defaultMessage: "Stay at {hotelName} | Hotel in {destination}" },
|
|
{ hotelName, destination }
|
|
)
|
|
}
|