fix(BOOK-412): Using internalCategoryName to map ancillaries and show translated categoryName only

Approved-by: Linus Flood
This commit is contained in:
Erik Tiekstra
2025-10-10 09:10:51 +00:00
parent c2096ade2e
commit 50aaa095eb
6 changed files with 51 additions and 22 deletions

View File

@@ -74,11 +74,19 @@ export function Ancillaries({
loyaltyCode: undefined, loyaltyCode: undefined,
points: undefined, points: undefined,
hotelId: Number(bookedRoom.hotelId), hotelId: Number(bookedRoom.hotelId),
categoryName: "Food", internalCategoryName: "Food",
translatedCategoryName: intl.formatMessage({
defaultMessage: "Food",
}),
} }
: undefined : undefined
const allAncillaries = mapAncillaries(ancillaries, breakfastAncillary, user) const allAncillaries = mapAncillaries(
intl,
ancillaries,
breakfastAncillary,
user
)
if (!allAncillaries.length) { if (!allAncillaries.length) {
return null return null

View File

@@ -1,4 +1,5 @@
import type { User } from "@scandic-hotels/trpc/types/user" import type { User } from "@scandic-hotels/trpc/types/user"
import type { IntlShape } from "react-intl"
import type { import type {
Ancillaries, Ancillaries,
@@ -40,12 +41,14 @@ export function generateUniqueAncillaries(
function addBreakfastPackage( function addBreakfastPackage(
ancillaries: Ancillaries, ancillaries: Ancillaries,
breakfast: SelectedAncillary | undefined, breakfast: SelectedAncillary | undefined,
categoryName: string internalCategoryName: string,
translatedCategoryName: string
): Ancillaries { ): Ancillaries {
if (!breakfast) return ancillaries if (!breakfast) return ancillaries
const category = ancillaries.find((a) => a.categoryName === categoryName) const category = ancillaries.find(
(a) => a.internalCategoryName === internalCategoryName
)
if (category) { if (category) {
const newCategory = { const newCategory = {
...category, ...category,
@@ -53,14 +56,24 @@ function addBreakfastPackage(
} }
return ancillaries.map((ancillary) => return ancillaries.map((ancillary) =>
ancillary.categoryName === categoryName ? newCategory : ancillary ancillary.internalCategoryName === internalCategoryName
? newCategory
: ancillary
) )
} }
return [{ categoryName, ancillaryContent: [breakfast] }, ...ancillaries] return [
{
internalCategoryName,
translatedCategoryName,
ancillaryContent: [breakfast],
},
...ancillaries,
]
} }
export function mapAncillaries( export function mapAncillaries(
intl: IntlShape,
ancillaries: Ancillaries | null, ancillaries: Ancillaries | null,
breakfastAncillary: SelectedAncillary | undefined, breakfastAncillary: SelectedAncillary | undefined,
user: User | null user: User | null
@@ -68,12 +81,14 @@ export function mapAncillaries(
const withBreakfastPopular = addBreakfastPackage( const withBreakfastPopular = addBreakfastPackage(
ancillaries ?? [], ancillaries ?? [],
breakfastAncillary, breakfastAncillary,
"Popular" "Popular",
intl.formatMessage({ defaultMessage: "Popular" })
) )
const withBreakfastFood = addBreakfastPackage( const withBreakfastFood = addBreakfastPackage(
withBreakfastPopular, withBreakfastPopular,
breakfastAncillary, breakfastAncillary,
"Food" "Food",
intl.formatMessage({ defaultMessage: "Food" })
) )
return filterPoints(withBreakfastFood, user) return filterPoints(withBreakfastFood, user)

View File

@@ -46,7 +46,7 @@ interface AddAncillaryState {
steps: Steps steps: Steps
booking: Room booking: Room
ancillaries: Ancillaries ancillaries: Ancillaries
categories: Ancillary["categoryName"][] categories: Ancillary["translatedCategoryName"][]
selectedCategory: string selectedCategory: string
selectCategory: (category: string) => void selectCategory: (category: string) => void
ancillariesBySelectedCategory: Ancillary["ancillaryContent"] ancillariesBySelectedCategory: Ancillary["ancillaryContent"]
@@ -70,8 +70,9 @@ function findAncillaryByCategory(
selectedCategory: string selectedCategory: string
) { ) {
return ( return (
ancillaries.find((ancillary) => ancillary.categoryName === selectedCategory) ancillaries.find(
?.ancillaryContent ?? [] (ancillary) => ancillary.translatedCategoryName === selectedCategory
)?.ancillaryContent ?? []
) )
} }
@@ -79,12 +80,14 @@ export const createAddAncillaryStore = (
booking: Room, booking: Room,
ancillaries: Ancillaries ancillaries: Ancillaries
) => { ) => {
const selectedCategory = ancillaries[0].categoryName const selectedCategory = ancillaries[0].translatedCategoryName
const ancillariesBySelectedCategory = findAncillaryByCategory( const ancillariesBySelectedCategory = findAncillaryByCategory(
ancillaries, ancillaries,
selectedCategory selectedCategory
) )
const categories = ancillaries.map((ancillary) => ancillary.categoryName) const categories = ancillaries.map(
(ancillary) => ancillary.translatedCategoryName
)
const steps = { const steps = {
[AncillaryStepEnum.selectAncillary]: { [AncillaryStepEnum.selectAncillary]: {
step: AncillaryStepEnum.selectAncillary, step: AncillaryStepEnum.selectAncillary,

View File

@@ -56,7 +56,7 @@ export function buildAncillariesTracking(
productUnits: pkg.quantity, productUnits: pkg.quantity,
productDeliveryTime: ancillaryDeliveryTime, productDeliveryTime: ancillaryDeliveryTime,
productName: selectedAncillary?.title, productName: selectedAncillary?.title,
productCategory: selectedAncillary?.categoryName, productCategory: selectedAncillary?.translatedCategoryName,
...(payedWithCard && { ...(payedWithCard && {
productPrice: (selectedAncillary?.price.total ?? 0) * pkg.quantity, productPrice: (selectedAncillary?.price.total ?? 0) * pkg.quantity,
currency: selectedAncillary?.price.currency, currency: selectedAncillary?.price.currency,
@@ -194,7 +194,7 @@ export function trackViewAncillary(
ancillary: SelectedAncillary, ancillary: SelectedAncillary,
booking: Room booking: Room
) { ) {
const { hotelId, id, title, categoryName } = ancillary const { hotelId, id, title, translatedCategoryName } = ancillary
const isBreakfast = id === BreakfastPackageEnum.ANCILLARY_REGULAR_BREAKFAST const isBreakfast = id === BreakfastPackageEnum.ANCILLARY_REGULAR_BREAKFAST
const hasPayingChildren = booking.childrenAges.some((age) => age >= 4) const hasPayingChildren = booking.childrenAges.some((age) => age >= 4)
@@ -203,7 +203,7 @@ export function trackViewAncillary(
hotelId, hotelId,
productId: id, productId: id,
productName: title, productName: title,
productCategory: categoryName, productCategory: translatedCategoryName,
}, },
] ]
@@ -212,7 +212,7 @@ export function trackViewAncillary(
hotelId, hotelId,
productId: BreakfastPackageEnum.ANCILLARY_CHILD_PAYING_BREAKFAST, productId: BreakfastPackageEnum.ANCILLARY_CHILD_PAYING_BREAKFAST,
productName: title, productName: title,
productCategory: categoryName, productCategory: translatedCategoryName,
}) })
} }
@@ -283,7 +283,7 @@ export function trackAddAncillary(
productUnits: quantityWithCard, productUnits: quantityWithCard,
productPrice: (ancillary?.price.total ?? 0) * (quantityWithCard ?? 0), productPrice: (ancillary?.price.total ?? 0) * (quantityWithCard ?? 0),
currency: ancillary?.price.currency, currency: ancillary?.price.currency,
productCategory: ancillary?.categoryName, productCategory: ancillary?.translatedCategoryName,
}) })
} }
@@ -294,7 +294,7 @@ export function trackAddAncillary(
productName: ancillary?.title, productName: ancillary?.title,
productUnits: quantityWithPoints, productUnits: quantityWithPoints,
productPoints: (ancillary?.points ?? 0) * (quantityWithPoints ?? 0), productPoints: (ancillary?.points ?? 0) * (quantityWithPoints ?? 0),
productCategory: ancillary?.categoryName, productCategory: ancillary?.translatedCategoryName,
}) })
} }
trackEvent({ trackEvent({

View File

@@ -517,7 +517,8 @@ export const ancillaryPackagesSchema = z
.transform(({ data }) => .transform(({ data }) =>
data.attributes.ancillaries data.attributes.ancillaries
.map((ancillary) => ({ .map((ancillary) => ({
categoryName: ancillary.categoryName, translatedCategoryName: ancillary.categoryName,
internalCategoryName: ancillary.internalCategoryName,
ancillaryContent: ancillary.ancillaryContent ancillaryContent: ancillary.ancillaryContent
.filter((item) => item.status === "Available") .filter((item) => item.status === "Available")
.map((item) => ({ .map((item) => ({
@@ -533,7 +534,8 @@ export const ancillaryPackagesSchema = z
points: item.variants.ancillaryLoyalty?.points, points: item.variants.ancillaryLoyalty?.points,
loyaltyCode: item.variants.ancillaryLoyalty?.code, loyaltyCode: item.variants.ancillaryLoyalty?.code,
requiresDeliveryTime: item.requiresDeliveryTime, requiresDeliveryTime: item.requiresDeliveryTime,
categoryName: ancillary.categoryName, translatedCategoryName: ancillary.categoryName,
internalCategoryName: ancillary.internalCategoryName,
})), })),
})) }))
.filter((ancillary) => ancillary.ancillaryContent.length > 0) .filter((ancillary) => ancillary.ancillaryContent.length > 0)

View File

@@ -65,5 +65,6 @@ export const breakfastPackageSchema = z.object({
export const ancillaryPackageSchema = z.object({ export const ancillaryPackageSchema = z.object({
categoryName: z.string(), categoryName: z.string(),
internalCategoryName: z.string(),
ancillaryContent: z.array(ancillaryContentSchema), ancillaryContent: z.array(ancillaryContentSchema),
}) })