@roomstay/frontend 2.6.102-2 → 2.6.102-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.bundle.js +1 -1
- package/dist/src/util/Analytics/Analytics.d.ts +7 -0
- package/dist/src/util/Analytics/Analytics.js +8 -1
- package/dist/src/util/Analytics/Analytics.js.map +1 -1
- package/dist/src/util/DataLayer.js +4 -4
- package/dist/src/util/DataLayer.js.map +1 -1
- package/dist/test.bundle.js +1 -1
- package/package.json +1 -1
|
@@ -32,6 +32,13 @@ export declare abstract class Analytics {
|
|
|
32
32
|
withUserData: <T extends IAnalyticMessageEvent>(input: T) => T & Partial<{
|
|
33
33
|
user_id: string;
|
|
34
34
|
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Merges the current company name/property name into the provided input object.
|
|
37
|
+
*/
|
|
38
|
+
withClientDetailsData: <T extends IAnalyticMessageEvent>(input: T) => T & {
|
|
39
|
+
company?: string;
|
|
40
|
+
property?: string;
|
|
41
|
+
};
|
|
35
42
|
updateCurrency(current: string, original: string): void;
|
|
36
43
|
/** Assemble the message for a room impression post based on impressions added */
|
|
37
44
|
abstract generateRoomImpressionMessageObject(impressions: GenericAnalyticsAccommodation[]): IAnalyticMessageEvent;
|
|
@@ -15,7 +15,14 @@ class Analytics {
|
|
|
15
15
|
* Ensures the resulting object always includes user_id when available.
|
|
16
16
|
*/
|
|
17
17
|
this.withUserData = (input) => {
|
|
18
|
-
return Object.assign(Object.assign({}, input), (('ecommerce' in input || input.event === 'login') && Object.assign({}, this.getUserData())));
|
|
18
|
+
return this.withClientDetailsData(Object.assign(Object.assign({}, input), (('ecommerce' in input || input.event === 'login') && Object.assign({}, this.getUserData()))));
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Merges the current company name/property name into the provided input object.
|
|
22
|
+
*/
|
|
23
|
+
this.withClientDetailsData = (input) => {
|
|
24
|
+
var _a, _b;
|
|
25
|
+
return Object.assign(Object.assign({}, input), { company: (_a = this.company) === null || _a === void 0 ? void 0 : _a.name, property: (_b = this.hotel) === null || _b === void 0 ? void 0 : _b.name });
|
|
19
26
|
};
|
|
20
27
|
}
|
|
21
28
|
initialise(company, hotel) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Analytics.js","sourceRoot":"/","sources":["src/util/Analytics/Analytics.ts"],"names":[],"mappings":";;;AAWA;;;;GAIG;AACH,MAAsB,SAAS;IAA/B;QAKc,aAAQ,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzC,iBAAY,GAAG,EAAE,CAAC;QAoB5B;;;WAGG;QACI,iBAAY,GAAG,CAAkC,KAAQ,EAAoC,EAAE;YAClG,
|
|
1
|
+
{"version":3,"file":"Analytics.js","sourceRoot":"/","sources":["src/util/Analytics/Analytics.ts"],"names":[],"mappings":";;;AAWA;;;;GAIG;AACH,MAAsB,SAAS;IAA/B;QAKc,aAAQ,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzC,iBAAY,GAAG,EAAE,CAAC;QAoB5B;;;WAGG;QACI,iBAAY,GAAG,CAAkC,KAAQ,EAAoC,EAAE;YAClG,OAAO,IAAI,CAAC,qBAAqB,iCAC1B,KAAK,GACL,CAAC,CAAC,WAAW,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,sBAC9C,IAAI,CAAC,WAAW,EAAE,CACxB,CAAC,EACJ,CAAC;QACP,CAAC,CAAC;QAEF;;WAEG;QACI,0BAAqB,GAAG,CAAkC,KAAQ,EAA+C,EAAE;;YACtH,uCACO,KAAK,KACR,OAAO,EAAE,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,EAC3B,QAAQ,EAAE,MAAA,IAAI,CAAC,KAAK,0CAAE,IAAI,IAC5B;QACN,CAAC,CAAC;IAoCN,CAAC;IA5EU,UAAU,CAAC,OAAuB,EAAE,KAAa;QACpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAEM,SAAS,CAAC,EAAW;QACxB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IAEM,eAAe,CAAC,YAAqB;QACxC,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,iEAAiE;IACzD,WAAW;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;IA0BM,cAAc,CAAC,OAAe,EAAE,QAAgB;QACnD,IAAI,CAAC,QAAQ,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAoBM,8CAA8C,CAAC,iBAAyB;QAC3E,OAAO;YACH,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE;gBACP,MAAM,EAAE;oBACJ,WAAW,EAAE;wBACT,EAAE,EAAE,iBAAiB;qBACxB;iBACJ;aACJ;SACJ,CAAC;IACN,CAAC;CACJ;AApFD,8BAoFC","sourcesContent":["import { ReservationDTO, ReservationsDTO } from '@roomstay/core';\n\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport BasketRow from '@/models/BasketRow';\nimport { ConfigCompany } from '@/models/Client/Hotel/Company';\nimport { Hotel } from '@/models/Client/Hotel/Hotel';\n\nimport { DateRange, GenericAnalyticsAccommodation } from '../DataLayer';\nexport interface IAnalyticMessageEvent extends Record<string, any> {\n event: string;\n}\n/**\n * Abstract class used to transform roomstay data into either GA4 or UA analytics events\n *\n * All logging still happens from the {@link DataLayer} class.\n */\nexport abstract class Analytics {\n protected hotel?: Hotel;\n protected company?: ConfigCompany;\n protected userId?: string; // logged user id\n\n protected currency = { original: '', current: '' };\n protected itemListName = '';\n\n public initialise(company?: ConfigCompany, hotel?: Hotel) {\n this.company = company;\n this.hotel = hotel;\n }\n\n public setUserId(id?: string) {\n this.userId = id;\n }\n\n public setItemListName(itemListName?: string) {\n this.itemListName = itemListName || '';\n }\n\n // Returns an object containing the current user_id if available.\n private getUserData(): Partial<{ user_id: string }> {\n return this.userId ? { user_id: this.userId } : {};\n }\n\n /**\n * Merges the current user's data (user_id) into the provided input object.\n * Ensures the resulting object always includes user_id when available.\n */\n public withUserData = <T extends IAnalyticMessageEvent>(input: T): T & Partial<{ user_id: string }> => {\n return this.withClientDetailsData({\n ...input,\n ...(('ecommerce' in input || input.event === 'login') && {\n ...this.getUserData(),\n }),\n });\n };\n\n /**\n * Merges the current company name/property name into the provided input object.\n */\n public withClientDetailsData = <T extends IAnalyticMessageEvent>(input: T): T & { company?: string; property?: string } => {\n return {\n ...input,\n company: this.company?.name,\n property: this.hotel?.name,\n };\n };\n\n public updateCurrency(current: string, original: string) {\n this.currency = { current, original };\n }\n\n /** Assemble the message for a room impression post based on impressions added */\n public abstract generateRoomImpressionMessageObject(impressions: GenericAnalyticsAccommodation[]): IAnalyticMessageEvent;\n\n public abstract generateProductClickMessageObject(product: GenericAnalyticsAccommodation): IAnalyticMessageEvent;\n public abstract generateDateSelectionMessageObject(dateRange: DateRange, adults: number, children: number, infants?: number): IAnalyticMessageEvent;\n\n public abstract generateAddToCartMessageObject(product: GenericAnalyticsAccommodation): IAnalyticMessageEvent;\n public abstract generateAddonsAddToCartMessageObject(\n product: Required<Pick<GenericAnalyticsAccommodation, 'quantity' | 'dateRange' | 'basketAddonRow'>>\n ): IAnalyticMessageEvent;\n public abstract generateUpsellConfirmedMessageObject(oldProduct: GenericAnalyticsAccommodation, newProduct: GenericAnalyticsAccommodation): IAnalyticMessageEvent | null;\n\n public abstract generateUpsellCancelledMessageObject(product: GenericAnalyticsAccommodation): IAnalyticMessageEvent;\n\n public abstract generateCheckoutViewMessageObject(basketRows: BasketRow[], addonRows: BasketAddonRow[]): IAnalyticMessageEvent;\n public abstract generateRoomPurchaseMessageObject(basketRows: BasketRow[], addonRows: BasketAddonRow[], reservations: ReservationsDTO): IAnalyticMessageEvent[];\n public abstract generateRefundMessageObject(reservation: ReservationDTO): IAnalyticMessageEvent;\n\n public generateRefundMessageObjectByReservationNumber(reservationNumber: string) {\n return {\n event: 'refund',\n ecommerce: {\n refund: {\n actionField: {\n id: reservationNumber,\n },\n },\n },\n };\n }\n}\n"]}
|
|
@@ -96,9 +96,9 @@ class DataLayer {
|
|
|
96
96
|
sendAwayWindowOpen() {
|
|
97
97
|
this.log('away window triggered');
|
|
98
98
|
react_gtm_module_1.default.dataLayer({
|
|
99
|
-
dataLayer: {
|
|
99
|
+
dataLayer: analytics.withClientDetailsData({
|
|
100
100
|
event: 'awayWindow',
|
|
101
|
-
},
|
|
101
|
+
}),
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
104
|
sendRoomRateAddToCart(rate, quantity, startDate, endDate, originalRoomRate) {
|
|
@@ -206,9 +206,9 @@ class DataLayer {
|
|
|
206
206
|
}
|
|
207
207
|
sendMemberSignUp() {
|
|
208
208
|
react_gtm_module_1.default.dataLayer({
|
|
209
|
-
dataLayer: {
|
|
209
|
+
dataLayer: analytics.withClientDetailsData({
|
|
210
210
|
event: 'Email Sign up',
|
|
211
|
-
},
|
|
211
|
+
}),
|
|
212
212
|
});
|
|
213
213
|
}
|
|
214
214
|
sendMemberSignedIn() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataLayer.js","sourceRoot":"/","sources":["src/util/DataLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReservationDTO, ReservationsDTO } from '@roomstay/core';\nimport { Dayjs } from 'dayjs';\nimport TagManager from 'react-gtm-module';\n\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport BasketRow from '@/models/BasketRow';\nimport { ConfigCompany } from '@/models/Client/Hotel/Company';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate } from '@/models/Room/RoomRate';\n\nimport { Hotel } from '..';\nimport { Analytics } from './Analytics/Analytics';\nimport { UniversalAnalytics } from './Analytics/UniversalAnalytics';\n\nconst DATALAYER_DATE_FORMAT = 'YYYY-M-D';\n\nexport enum DatalayerAnalyticsMode {\n UniversalAnaltics = 'UniversalAnalytics',\n GoogleAnalytics4 = 'GoogleAnalytics4',\n}\n\nexport type GenericAnalyticsAccommodation = {\n room: Room;\n dateRange: { from: Dayjs; to: Dayjs };\n\n rate?: RoomRate;\n quantity?: number;\n promoCode?: string;\n /**\n * What the original room rate was before the upsell\n */\n originalRoomRate?: RoomRate;\n basketAddonRow?: BasketAddonRow;\n};\n\nlet analytics: Analytics = UniversalAnalytics;\n\nexport interface DateRange {\n from: Dayjs;\n to: Dayjs;\n}\n\nexport default class DataLayer {\n static instance = new DataLayer();\n\n private enableLogging = true;\n\n private originalCurrencyCode?: string;\n private currentCurrencyCode = '';\n\n private impressions: GenericAnalyticsAccommodation[] = [];\n\n private hotel?: Hotel;\n private company?: ConfigCompany;\n\n public initialiseGTM(company: ConfigCompany, hotel?: Hotel) {\n let datalayer;\n if (hotel?.datalayer?.gtmIds?.length) {\n datalayer = hotel.datalayer;\n } else if (company) {\n datalayer = company.datalayer;\n }\n const gtmIds = datalayer?.gtmIds ?? [];\n const itemListName = datalayer?.itemListName || 'BE List';\n\n gtmIds.forEach((gtmId) => {\n TagManager.initialize({ gtmId });\n });\n\n this.hotel = hotel;\n this.company = company;\n\n // We set the analytics mode as it will also initilaise it.\n analytics.initialise(this.company, this.hotel);\n analytics.setItemListName(itemListName);\n }\n\n // Use for testing change analytics type only\n public setAnalyticsMode(mode: Analytics) {\n analytics = mode;\n analytics.initialise(this.company, this.hotel);\n }\n\n public setItemListName(itemListName?: string) {\n analytics.setItemListName(itemListName);\n }\n\n public setCurrencyCodes(currentCurrencyCode: string, originalCurrencyCode?: string) {\n this.currentCurrencyCode = currentCurrencyCode;\n\n if (originalCurrencyCode) {\n this.originalCurrencyCode = originalCurrencyCode;\n }\n\n if (analytics) {\n analytics.updateCurrency(this.currentCurrencyCode, this.originalCurrencyCode ?? '');\n }\n }\n\n public setUserId = (id?: string): this => {\n analytics.setUserId(id);\n return this;\n };\n\n addRoomImpression(room: Room, dateRange: DateRange, promoCode: string) {\n this.impressions.push({\n room: room,\n promoCode,\n dateRange,\n });\n }\n\n addRoomRateImpression(room: Room, rate: RoomRate, dateRange: DateRange, promoCode: string) {\n this.impressions.push({\n room: room,\n rate: rate,\n promoCode,\n dateRange,\n });\n }\n\n sendRoomImpressions() {\n this.log('sending ' + this.impressions.length + ' impressions');\n\n if (this.impressions.length > 0) {\n const eventObject = analytics.withUserData(analytics.generateRoomImpressionMessageObject(this.impressions));\n\n TagManager.dataLayer({\n dataLayer: eventObject,\n });\n\n this.impressions = [];\n }\n }\n\n sendRoomClick(room: Room, startDate: Dayjs, endDate: Dayjs, promoCode?: string) {\n const eventObject = analytics.withUserData(analytics.generateProductClickMessageObject({ room, dateRange: { from: startDate, to: endDate }, promoCode }));\n this.log('sending room click', eventObject);\n\n TagManager.dataLayer({\n dataLayer: eventObject,\n });\n }\n\n sendAwayWindowOpen() {\n this.log('away window triggered');\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'awayWindow',\n },\n });\n }\n\n sendRoomRateAddToCart(rate: RoomRate, quantity: number, startDate: Dayjs, endDate: Dayjs, originalRoomRate?: RoomRate) {\n this.log('sending room rate add to cart');\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(\n analytics.generateAddToCartMessageObject({\n room: rate.getRoom(),\n rate,\n dateRange: { from: startDate, to: endDate },\n quantity,\n promoCode: rate.promoCode,\n originalRoomRate,\n })\n ),\n });\n }\n\n sendRoomAddonAddToCart(basketAddonRow: BasketAddonRow, quantity: number, startDate: Dayjs, endDate: Dayjs) {\n this.log('sending room addons add to cart');\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(\n analytics.generateAddonsAddToCartMessageObject({\n dateRange: { from: startDate, to: endDate },\n basketAddonRow,\n quantity,\n })\n ),\n });\n }\n\n sendUpsellConfirmed(dateRange: DateRange, oldRate: RoomRate, newRate: RoomRate) {\n this.log('sending room upgrade notification');\n\n const event = analytics.generateUpsellConfirmedMessageObject(\n { dateRange, room: oldRate.getRoom(), rate: oldRate, promoCode: oldRate.promoCode },\n { dateRange, room: newRate.getRoom(), rate: newRate, promoCode: newRate.promoCode }\n );\n\n if (!event) {\n console.error('Failed sending upsell confirmation event');\n return;\n }\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(event),\n });\n }\n\n sendUpsellCancelled(dateRange: DateRange, rate: RoomRate) {\n this.log('sending room upgrade cancellation event');\n\n const event = analytics.withUserData(analytics.generateUpsellCancelledMessageObject({ dateRange, room: rate.getRoom(), rate, promoCode: rate.promoCode }));\n\n TagManager.dataLayer({\n dataLayer: event,\n });\n }\n\n sendRoomView(startDate: Dayjs, endDate: Dayjs) {\n this.log('sending room view');\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData({\n event: 'room',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n StartDate: startDate?.format(DATALAYER_DATE_FORMAT),\n EndDate: endDate?.format(DATALAYER_DATE_FORMAT),\n PageType: 'offerdetail',\n },\n }),\n });\n }\n\n sendCheckoutView(basketRows: BasketRow[], addonRows: BasketAddonRow[]) {\n this.log('sending checkout view');\n\n const event = analytics.withUserData(analytics.generateCheckoutViewMessageObject(basketRows, addonRows));\n\n TagManager.dataLayer({\n dataLayer: event,\n });\n }\n\n sendReservationConfirmed(basketRows: BasketRow[], addonRows: BasketAddonRow[], reservations: ReservationsDTO) {\n const event = analytics.generateRoomPurchaseMessageObject(basketRows, addonRows, reservations);\n\n for (const element of event) {\n this.log('sending reservation confirmation', element);\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(element),\n });\n }\n }\n\n sendCancellation(reservation: ReservationDTO) {\n this.log('sending cancellation for reservation ' + reservation);\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(analytics.generateRefundMessageObject(reservation)),\n });\n }\n\n sendCancellationByReservationNumber(reservationNumber: string) {\n this.log('sending cancellation for reservation number ' + reservationNumber);\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(analytics.generateRefundMessageObjectByReservationNumber(reservationNumber)),\n });\n }\n\n sendInteraction(name: string, type: InteractionType, step: InteractionStep) {\n const interaction = {\n 'Interaction Name': name,\n 'Interaction Type': type,\n 'Interaction Step': step,\n };\n\n this.log('sending interaction', interaction);\n\n TagManager.dataLayer({\n dataLayer: interaction,\n });\n }\n\n sendDateSelection({ startDate, endDate, adult, children, infant }: { startDate: Dayjs; endDate: Dayjs; adult?: number; children?: number; infant?: number }) {\n if (!startDate || !endDate) {\n return;\n }\n\n this.log('sending date selection ', startDate, endDate);\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(analytics.generateDateSelectionMessageObject({ from: startDate, to: endDate }, adult || 0, children || 0, infant || 0)),\n });\n }\n\n sendMemberSignUp() {\n TagManager.dataLayer({\n dataLayer: {\n event: 'Email Sign up',\n },\n });\n }\n sendMemberSignedIn() {\n TagManager.dataLayer({\n dataLayer: analytics.withUserData({\n event: 'login',\n }),\n });\n }\n\n protected log(...output: any) {\n if (!this.enableLogging) {\n return;\n }\n\n console.log(\n '[DATALAYER]: ' +\n output\n .map((it: any) => {\n if (typeof it === 'object') {\n return JSON.stringify(it);\n }\n return it;\n })\n .join('; ')\n );\n }\n}\n\nexport enum InteractionType {\n NUMBER_INPUT = '+-widget',\n CALENDAR = 'Calendar',\n BUTTON = 'Button',\n DROPDOWN = 'Dropdown',\n LINK_DROPDOWN = 'Link dropdown',\n LINK = 'Link',\n FORM_FIELD = 'Form field',\n CHECKBOX = 'Checkbox',\n}\n\nexport enum InteractionStep {\n DATES = 'Dates',\n ROOMS = 'Rooms',\n GUEST_DETAILS = 'Guest Details',\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DataLayer.js","sourceRoot":"/","sources":["src/util/DataLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReservationDTO, ReservationsDTO } from '@roomstay/core';\nimport { Dayjs } from 'dayjs';\nimport TagManager from 'react-gtm-module';\n\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport BasketRow from '@/models/BasketRow';\nimport { ConfigCompany } from '@/models/Client/Hotel/Company';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate } from '@/models/Room/RoomRate';\n\nimport { Hotel } from '..';\nimport { Analytics } from './Analytics/Analytics';\nimport { UniversalAnalytics } from './Analytics/UniversalAnalytics';\n\nconst DATALAYER_DATE_FORMAT = 'YYYY-M-D';\n\nexport enum DatalayerAnalyticsMode {\n UniversalAnaltics = 'UniversalAnalytics',\n GoogleAnalytics4 = 'GoogleAnalytics4',\n}\n\nexport type GenericAnalyticsAccommodation = {\n room: Room;\n dateRange: { from: Dayjs; to: Dayjs };\n\n rate?: RoomRate;\n quantity?: number;\n promoCode?: string;\n /**\n * What the original room rate was before the upsell\n */\n originalRoomRate?: RoomRate;\n basketAddonRow?: BasketAddonRow;\n};\n\nlet analytics: Analytics = UniversalAnalytics;\n\nexport interface DateRange {\n from: Dayjs;\n to: Dayjs;\n}\n\nexport default class DataLayer {\n static instance = new DataLayer();\n\n private enableLogging = true;\n\n private originalCurrencyCode?: string;\n private currentCurrencyCode = '';\n\n private impressions: GenericAnalyticsAccommodation[] = [];\n\n private hotel?: Hotel;\n private company?: ConfigCompany;\n\n public initialiseGTM(company: ConfigCompany, hotel?: Hotel) {\n let datalayer;\n if (hotel?.datalayer?.gtmIds?.length) {\n datalayer = hotel.datalayer;\n } else if (company) {\n datalayer = company.datalayer;\n }\n const gtmIds = datalayer?.gtmIds ?? [];\n const itemListName = datalayer?.itemListName || 'BE List';\n\n gtmIds.forEach((gtmId) => {\n TagManager.initialize({ gtmId });\n });\n\n this.hotel = hotel;\n this.company = company;\n\n // We set the analytics mode as it will also initilaise it.\n analytics.initialise(this.company, this.hotel);\n analytics.setItemListName(itemListName);\n }\n\n // Use for testing change analytics type only\n public setAnalyticsMode(mode: Analytics) {\n analytics = mode;\n analytics.initialise(this.company, this.hotel);\n }\n\n public setItemListName(itemListName?: string) {\n analytics.setItemListName(itemListName);\n }\n\n public setCurrencyCodes(currentCurrencyCode: string, originalCurrencyCode?: string) {\n this.currentCurrencyCode = currentCurrencyCode;\n\n if (originalCurrencyCode) {\n this.originalCurrencyCode = originalCurrencyCode;\n }\n\n if (analytics) {\n analytics.updateCurrency(this.currentCurrencyCode, this.originalCurrencyCode ?? '');\n }\n }\n\n public setUserId = (id?: string): this => {\n analytics.setUserId(id);\n return this;\n };\n\n addRoomImpression(room: Room, dateRange: DateRange, promoCode: string) {\n this.impressions.push({\n room: room,\n promoCode,\n dateRange,\n });\n }\n\n addRoomRateImpression(room: Room, rate: RoomRate, dateRange: DateRange, promoCode: string) {\n this.impressions.push({\n room: room,\n rate: rate,\n promoCode,\n dateRange,\n });\n }\n\n sendRoomImpressions() {\n this.log('sending ' + this.impressions.length + ' impressions');\n\n if (this.impressions.length > 0) {\n const eventObject = analytics.withUserData(analytics.generateRoomImpressionMessageObject(this.impressions));\n\n TagManager.dataLayer({\n dataLayer: eventObject,\n });\n\n this.impressions = [];\n }\n }\n\n sendRoomClick(room: Room, startDate: Dayjs, endDate: Dayjs, promoCode?: string) {\n const eventObject = analytics.withUserData(analytics.generateProductClickMessageObject({ room, dateRange: { from: startDate, to: endDate }, promoCode }));\n this.log('sending room click', eventObject);\n\n TagManager.dataLayer({\n dataLayer: eventObject,\n });\n }\n\n sendAwayWindowOpen() {\n this.log('away window triggered');\n\n TagManager.dataLayer({\n dataLayer: analytics.withClientDetailsData({\n event: 'awayWindow',\n }),\n });\n }\n\n sendRoomRateAddToCart(rate: RoomRate, quantity: number, startDate: Dayjs, endDate: Dayjs, originalRoomRate?: RoomRate) {\n this.log('sending room rate add to cart');\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(\n analytics.generateAddToCartMessageObject({\n room: rate.getRoom(),\n rate,\n dateRange: { from: startDate, to: endDate },\n quantity,\n promoCode: rate.promoCode,\n originalRoomRate,\n })\n ),\n });\n }\n\n sendRoomAddonAddToCart(basketAddonRow: BasketAddonRow, quantity: number, startDate: Dayjs, endDate: Dayjs) {\n this.log('sending room addons add to cart');\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(\n analytics.generateAddonsAddToCartMessageObject({\n dateRange: { from: startDate, to: endDate },\n basketAddonRow,\n quantity,\n })\n ),\n });\n }\n\n sendUpsellConfirmed(dateRange: DateRange, oldRate: RoomRate, newRate: RoomRate) {\n this.log('sending room upgrade notification');\n\n const event = analytics.generateUpsellConfirmedMessageObject(\n { dateRange, room: oldRate.getRoom(), rate: oldRate, promoCode: oldRate.promoCode },\n { dateRange, room: newRate.getRoom(), rate: newRate, promoCode: newRate.promoCode }\n );\n\n if (!event) {\n console.error('Failed sending upsell confirmation event');\n return;\n }\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(event),\n });\n }\n\n sendUpsellCancelled(dateRange: DateRange, rate: RoomRate) {\n this.log('sending room upgrade cancellation event');\n\n const event = analytics.withUserData(analytics.generateUpsellCancelledMessageObject({ dateRange, room: rate.getRoom(), rate, promoCode: rate.promoCode }));\n\n TagManager.dataLayer({\n dataLayer: event,\n });\n }\n\n sendRoomView(startDate: Dayjs, endDate: Dayjs) {\n this.log('sending room view');\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData({\n event: 'room',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n StartDate: startDate?.format(DATALAYER_DATE_FORMAT),\n EndDate: endDate?.format(DATALAYER_DATE_FORMAT),\n PageType: 'offerdetail',\n },\n }),\n });\n }\n\n sendCheckoutView(basketRows: BasketRow[], addonRows: BasketAddonRow[]) {\n this.log('sending checkout view');\n\n const event = analytics.withUserData(analytics.generateCheckoutViewMessageObject(basketRows, addonRows));\n\n TagManager.dataLayer({\n dataLayer: event,\n });\n }\n\n sendReservationConfirmed(basketRows: BasketRow[], addonRows: BasketAddonRow[], reservations: ReservationsDTO) {\n const event = analytics.generateRoomPurchaseMessageObject(basketRows, addonRows, reservations);\n\n for (const element of event) {\n this.log('sending reservation confirmation', element);\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(element),\n });\n }\n }\n\n sendCancellation(reservation: ReservationDTO) {\n this.log('sending cancellation for reservation ' + reservation);\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(analytics.generateRefundMessageObject(reservation)),\n });\n }\n\n sendCancellationByReservationNumber(reservationNumber: string) {\n this.log('sending cancellation for reservation number ' + reservationNumber);\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(analytics.generateRefundMessageObjectByReservationNumber(reservationNumber)),\n });\n }\n\n sendInteraction(name: string, type: InteractionType, step: InteractionStep) {\n const interaction = {\n 'Interaction Name': name,\n 'Interaction Type': type,\n 'Interaction Step': step,\n };\n\n this.log('sending interaction', interaction);\n\n TagManager.dataLayer({\n dataLayer: interaction,\n });\n }\n\n sendDateSelection({ startDate, endDate, adult, children, infant }: { startDate: Dayjs; endDate: Dayjs; adult?: number; children?: number; infant?: number }) {\n if (!startDate || !endDate) {\n return;\n }\n\n this.log('sending date selection ', startDate, endDate);\n\n TagManager.dataLayer({\n dataLayer: analytics.withUserData(analytics.generateDateSelectionMessageObject({ from: startDate, to: endDate }, adult || 0, children || 0, infant || 0)),\n });\n }\n\n sendMemberSignUp() {\n TagManager.dataLayer({\n dataLayer: analytics.withClientDetailsData({\n event: 'Email Sign up',\n }),\n });\n }\n sendMemberSignedIn() {\n TagManager.dataLayer({\n dataLayer: analytics.withUserData({\n event: 'login',\n }),\n });\n }\n\n protected log(...output: any) {\n if (!this.enableLogging) {\n return;\n }\n\n console.log(\n '[DATALAYER]: ' +\n output\n .map((it: any) => {\n if (typeof it === 'object') {\n return JSON.stringify(it);\n }\n return it;\n })\n .join('; ')\n );\n }\n}\n\nexport enum InteractionType {\n NUMBER_INPUT = '+-widget',\n CALENDAR = 'Calendar',\n BUTTON = 'Button',\n DROPDOWN = 'Dropdown',\n LINK_DROPDOWN = 'Link dropdown',\n LINK = 'Link',\n FORM_FIELD = 'Form field',\n CHECKBOX = 'Checkbox',\n}\n\nexport enum InteractionStep {\n DATES = 'Dates',\n ROOMS = 'Rooms',\n GUEST_DETAILS = 'Guest Details',\n}\n"]}
|