@roomstay/frontend 2.6.80 → 2.6.82

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.
Files changed (101) hide show
  1. package/dist/370.bundle.js +1 -1
  2. package/dist/375.bundle.js +1 -0
  3. package/dist/430.bundle.js +1 -1
  4. package/dist/537.bundle.js +1 -1
  5. package/dist/978.bundle.js +1 -1
  6. package/dist/main.bundle.js +1 -1
  7. package/dist/src/api/AvailabilityAPI.d.ts +5 -1
  8. package/dist/src/api/AvailabilityAPI.js +23 -12
  9. package/dist/src/api/AvailabilityAPI.js.map +1 -1
  10. package/dist/src/api/ReservationAPI.d.ts +1 -1
  11. package/dist/src/api/ReservationAPI.js +14 -10
  12. package/dist/src/api/ReservationAPI.js.map +1 -1
  13. package/dist/src/components/User/Forms/SignInForm.js.map +1 -1
  14. package/dist/src/components/generic/PaymentCard/InlinePaymentOption.js +2 -2
  15. package/dist/src/components/generic/PaymentCard/InlinePaymentOption.js.map +1 -1
  16. package/dist/src/components/reservation/ReservationItem.d.ts +1 -0
  17. package/dist/src/components/reservation/ReservationItem.js +2 -2
  18. package/dist/src/components/reservation/ReservationItem.js.map +1 -1
  19. package/dist/src/components/reservation/ReservationList.d.ts +1 -0
  20. package/dist/src/components/reservation/ReservationList.js +2 -2
  21. package/dist/src/components/reservation/ReservationList.js.map +1 -1
  22. package/dist/src/components/steps/addons/AddonCard.js +8 -0
  23. package/dist/src/components/steps/addons/AddonCard.js.map +1 -1
  24. package/dist/src/components/steps/confirmation/StepConfirmationPolicyBlock.js +5 -4
  25. package/dist/src/components/steps/confirmation/StepConfirmationPolicyBlock.js.map +1 -1
  26. package/dist/src/components/steps/confirmation/TrueRewardsPaymentOption/TrueRewardsLabel.js +9 -6
  27. package/dist/src/components/steps/confirmation/TrueRewardsPaymentOption/TrueRewardsLabel.js.map +1 -1
  28. package/dist/src/components/steps/confirmation/TrueRewardsPaymentOption/TrueRewardsModal.d.ts +1 -0
  29. package/dist/src/components/steps/confirmation/TrueRewardsPaymentOption/TrueRewardsModal.js +80 -0
  30. package/dist/src/components/steps/confirmation/TrueRewardsPaymentOption/TrueRewardsModal.js.map +1 -0
  31. package/dist/src/components/steps/confirmation/TrueRewardsPaymentOption/TrueRewardsPaymentMethod.d.ts +5 -1
  32. package/dist/src/components/steps/confirmation/TrueRewardsPaymentOption/TrueRewardsPaymentMethod.js +15 -6
  33. package/dist/src/components/steps/confirmation/TrueRewardsPaymentOption/TrueRewardsPaymentMethod.js.map +1 -1
  34. package/dist/src/components/steps/room/AvailableUpgradesModal.js +0 -5
  35. package/dist/src/components/steps/room/AvailableUpgradesModal.js.map +1 -1
  36. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateDescriptionTab.js +2 -2
  37. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateDescriptionTab.js.map +1 -1
  38. package/dist/src/components/steps/room/roomDetails/unavailableRoom/UnavailableRoom.js +6 -2
  39. package/dist/src/components/steps/room/roomDetails/unavailableRoom/UnavailableRoom.js.map +1 -1
  40. package/dist/src/components/summary/BEMobileSummaryModal.js +11 -10
  41. package/dist/src/components/summary/BEMobileSummaryModal.js.map +1 -1
  42. package/dist/src/components/summary/BESummary.js +4 -4
  43. package/dist/src/components/summary/BESummary.js.map +1 -1
  44. package/dist/src/contexts/BasketContext/BasketContextType.d.ts +5 -3
  45. package/dist/src/contexts/BasketContext/BasketContextType.js.map +1 -1
  46. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +163 -73
  47. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  48. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +1 -2
  49. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
  50. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextTypes.d.ts +2 -1
  51. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextTypes.js.map +1 -1
  52. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +20 -8
  53. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
  54. package/dist/src/contexts/Members/AuthenticationContext/AuthenticationContextProvider.js +23 -7
  55. package/dist/src/contexts/Members/AuthenticationContext/AuthenticationContextProvider.js.map +1 -1
  56. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js +0 -1
  57. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js.map +1 -1
  58. package/dist/src/handlers/payment/TrueRewardsPaymentHandler.js +8 -5
  59. package/dist/src/handlers/payment/TrueRewardsPaymentHandler.js.map +1 -1
  60. package/dist/src/hooks/ConfirmationQuery.d.ts +1 -0
  61. package/dist/src/hooks/ConfirmationQuery.js +2 -1
  62. package/dist/src/hooks/ConfirmationQuery.js.map +1 -1
  63. package/dist/src/models/Api/HotelDTO.d.ts +1 -1
  64. package/dist/src/models/Api/HotelDTO.js.map +1 -1
  65. package/dist/src/models/Client/Hotel/Hotel.d.ts +1 -1
  66. package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
  67. package/dist/src/models/Room/RoomRate.d.ts +8 -1
  68. package/dist/src/models/Room/RoomRate.js +24 -0
  69. package/dist/src/models/Room/RoomRate.js.map +1 -1
  70. package/dist/src/pages/account/AccountHome/AccountHomePage.js +1 -1
  71. package/dist/src/pages/account/AccountHome/AccountHomePage.js.map +1 -1
  72. package/dist/src/pages/account/AccountRoutes.d.ts +5 -0
  73. package/dist/src/pages/account/AccountRoutes.js +8 -2
  74. package/dist/src/pages/account/AccountRoutes.js.map +1 -1
  75. package/dist/src/pages/account/Reservations/AccountReservationSinglePage.js +21 -6
  76. package/dist/src/pages/account/Reservations/AccountReservationSinglePage.js.map +1 -1
  77. package/dist/src/pages/account/Reservations/AccountReservationsPage.js +7 -7
  78. package/dist/src/pages/account/Reservations/AccountReservationsPage.js.map +1 -1
  79. package/dist/src/translations/Translation.d.ts +6 -0
  80. package/dist/src/translations/Translation.js +7 -1
  81. package/dist/src/translations/Translation.js.map +1 -1
  82. package/dist/src/translations/languages/en-gb.js +6 -0
  83. package/dist/src/translations/languages/en-gb.js.map +1 -1
  84. package/dist/src/util/Analytics/Analytics.d.ts +33 -9
  85. package/dist/src/util/Analytics/Analytics.js +26 -0
  86. package/dist/src/util/Analytics/Analytics.js.map +1 -1
  87. package/dist/src/util/Analytics/GoogleAnalytics4.d.ts +2 -1
  88. package/dist/src/util/Analytics/GoogleAnalytics4.js +9 -0
  89. package/dist/src/util/Analytics/GoogleAnalytics4.js.map +1 -1
  90. package/dist/src/util/Analytics/UniversalAnalytics.d.ts +4 -22
  91. package/dist/src/util/Analytics/UniversalAnalytics.js +23 -4
  92. package/dist/src/util/Analytics/UniversalAnalytics.js.map +1 -1
  93. package/dist/src/util/DataLayer.d.ts +7 -2
  94. package/dist/src/util/DataLayer.js +47 -18
  95. package/dist/src/util/DataLayer.js.map +1 -1
  96. package/dist/test.bundle.js +1 -1
  97. package/dist/tests/offline/entry/config/hotelSpecDefault.js +1 -1
  98. package/dist/tests/offline/entry/config/hotelSpecDefault.js.map +1 -1
  99. package/dist/vendors.bundle.js +1 -1
  100. package/package.json +2 -2
  101. package/dist/380.bundle.js +0 -1
@@ -18,6 +18,10 @@ class DataLayer {
18
18
  this.enableLogging = true;
19
19
  this.currentCurrencyCode = '';
20
20
  this.impressions = [];
21
+ this.setUserId = (id) => {
22
+ analytics.setUserId(id);
23
+ return this;
24
+ };
21
25
  }
22
26
  initialiseGTM(company, hotel) {
23
27
  var _a, _b, _c;
@@ -36,6 +40,7 @@ class DataLayer {
36
40
  // We set the analytics mode as it will also initilaise it.
37
41
  analytics.initialise(this.company, this.hotel);
38
42
  }
43
+ // Use for testing change analytics type only
39
44
  setAnalyticsMode(mode) {
40
45
  analytics = mode;
41
46
  analytics.initialise(this.company, this.hotel);
@@ -68,7 +73,7 @@ class DataLayer {
68
73
  sendRoomImpressions() {
69
74
  this.log('sending ' + this.impressions.length + ' impressions');
70
75
  if (this.impressions.length > 0) {
71
- const eventObject = analytics.generateRoomImpressionMessageObject(this.impressions);
76
+ const eventObject = analytics.withUserData(analytics.generateRoomImpressionMessageObject(this.impressions));
72
77
  react_gtm_module_1.default.dataLayer({
73
78
  dataLayer: eventObject,
74
79
  });
@@ -76,7 +81,7 @@ class DataLayer {
76
81
  }
77
82
  }
78
83
  sendRoomClick(room, startDate, endDate, promoCode) {
79
- const eventObject = analytics.generateProductClickMessageObject({ room, dateRange: { from: startDate, to: endDate }, promoCode });
84
+ const eventObject = analytics.withUserData(analytics.generateProductClickMessageObject({ room, dateRange: { from: startDate, to: endDate }, promoCode }));
80
85
  this.log('sending room click', eventObject);
81
86
  react_gtm_module_1.default.dataLayer({
82
87
  dataLayer: eventObject,
@@ -93,14 +98,24 @@ class DataLayer {
93
98
  sendRoomRateAddToCart(rate, quantity, startDate, endDate, originalRoomRate) {
94
99
  this.log('sending room rate add to cart');
95
100
  react_gtm_module_1.default.dataLayer({
96
- dataLayer: analytics.generateAddToCartMessageObject({
101
+ dataLayer: analytics.withUserData(analytics.generateAddToCartMessageObject({
97
102
  room: rate.getRoom(),
98
103
  rate,
99
104
  dateRange: { from: startDate, to: endDate },
100
105
  quantity,
101
106
  promoCode: rate.promoCode,
102
107
  originalRoomRate,
103
- }),
108
+ })),
109
+ });
110
+ }
111
+ sendRoomAddonAddToCart(basketAddonRow, quantity, startDate, endDate) {
112
+ this.log('sending room addons add to cart');
113
+ react_gtm_module_1.default.dataLayer({
114
+ dataLayer: analytics.withUserData(analytics.generateAddonsAddToCartMessageObject({
115
+ dateRange: { from: startDate, to: endDate },
116
+ basketAddonRow,
117
+ quantity,
118
+ })),
104
119
  });
105
120
  }
106
121
  sendUpsellConfirmed(dateRange, oldRate, newRate) {
@@ -108,14 +123,15 @@ class DataLayer {
108
123
  const event = analytics.generateUpsellConfirmedMessageObject({ dateRange, room: oldRate.getRoom(), rate: oldRate, promoCode: oldRate.promoCode }, { dateRange, room: newRate.getRoom(), rate: newRate, promoCode: newRate.promoCode });
109
124
  if (!event) {
110
125
  console.error('Failed sending upsell confirmation event');
126
+ return;
111
127
  }
112
128
  react_gtm_module_1.default.dataLayer({
113
- dataLayer: event,
129
+ dataLayer: analytics.withUserData(event),
114
130
  });
115
131
  }
116
132
  sendUpsellCancelled(dateRange, rate) {
117
133
  this.log('sending room upgrade cancellation event');
118
- const event = analytics.generateUpsellCancelledMessageObject({ dateRange, room: rate.getRoom(), rate, promoCode: rate.promoCode });
134
+ const event = analytics.withUserData(analytics.generateUpsellCancelledMessageObject({ dateRange, room: rate.getRoom(), rate, promoCode: rate.promoCode }));
119
135
  react_gtm_module_1.default.dataLayer({
120
136
  dataLayer: event,
121
137
  });
@@ -123,7 +139,7 @@ class DataLayer {
123
139
  sendRoomView(startDate, endDate) {
124
140
  this.log('sending room view');
125
141
  react_gtm_module_1.default.dataLayer({
126
- dataLayer: {
142
+ dataLayer: analytics.withUserData({
127
143
  event: 'room',
128
144
  ecommerce: {
129
145
  currencyCode: this.originalCurrencyCode,
@@ -131,12 +147,12 @@ class DataLayer {
131
147
  EndDate: endDate === null || endDate === void 0 ? void 0 : endDate.format(DATALAYER_DATE_FORMAT),
132
148
  PageType: 'offerdetail',
133
149
  },
134
- },
150
+ }),
135
151
  });
136
152
  }
137
153
  sendCheckoutView(basketRows, addonRows) {
138
154
  this.log('sending checkout view');
139
- const event = analytics.generateCheckoutViewMessageObject(basketRows, addonRows);
155
+ const event = analytics.withUserData(analytics.generateCheckoutViewMessageObject(basketRows, addonRows));
140
156
  react_gtm_module_1.default.dataLayer({
141
157
  dataLayer: event,
142
158
  });
@@ -146,21 +162,20 @@ class DataLayer {
146
162
  for (const element of event) {
147
163
  this.log('sending reservation confirmation', element);
148
164
  react_gtm_module_1.default.dataLayer({
149
- dataLayer: element,
165
+ dataLayer: analytics.withUserData(element),
150
166
  });
151
167
  }
152
168
  }
153
- sendCancellation(reservationNumber) {
154
- this.log('sending cancellation for reservation ' + reservationNumber);
169
+ sendCancellation(reservation) {
170
+ this.log('sending cancellation for reservation ' + reservation);
155
171
  react_gtm_module_1.default.dataLayer({
156
- dataLayer: analytics.generateRefundMessageObject(reservationNumber),
172
+ dataLayer: analytics.withUserData(analytics.generateRefundMessageObject(reservation)),
157
173
  });
158
174
  }
159
- sendMemberSignUp() {
175
+ sendCancellationByReservationNumber(reservationNumber) {
176
+ this.log('sending cancellation for reservation number ' + reservationNumber);
160
177
  react_gtm_module_1.default.dataLayer({
161
- dataLayer: {
162
- event: 'Email Sign up',
163
- },
178
+ dataLayer: analytics.withUserData(analytics.generateRefundMessageObjectByReservationNumber(reservationNumber)),
164
179
  });
165
180
  }
166
181
  sendInteraction(name, type, step) {
@@ -180,7 +195,21 @@ class DataLayer {
180
195
  }
181
196
  this.log('sending date selection ', startDate, endDate);
182
197
  react_gtm_module_1.default.dataLayer({
183
- dataLayer: analytics.generateDateSelectionMessageObject({ from: startDate, to: endDate }, adult || 0, children || 0, infant || 0),
198
+ dataLayer: analytics.withUserData(analytics.generateDateSelectionMessageObject({ from: startDate, to: endDate }, adult || 0, children || 0, infant || 0)),
199
+ });
200
+ }
201
+ sendMemberSignUp() {
202
+ react_gtm_module_1.default.dataLayer({
203
+ dataLayer: {
204
+ event: 'Email Sign up',
205
+ },
206
+ });
207
+ }
208
+ sendMemberSignedIn() {
209
+ react_gtm_module_1.default.dataLayer({
210
+ dataLayer: analytics.withUserData({
211
+ event: 'login',
212
+ }),
184
213
  });
185
214
  }
186
215
  log(...output) {
@@ -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};\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 gtmIds: string[] | undefined = [];\n\n if (hotel?.datalayer?.gtmIds?.length) {\n gtmIds = hotel.datalayer.gtmIds;\n } else if (company) {\n gtmIds = company.datalayer?.gtmIds;\n }\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 }\n\n public setAnalyticsMode(mode: Analytics) {\n analytics = mode;\n analytics.initialise(this.company, this.hotel);\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 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.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.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.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 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 }\n\n TagManager.dataLayer({\n dataLayer: event,\n });\n }\n\n sendUpsellCancelled(dateRange: DateRange, rate: RoomRate) {\n this.log('sending room upgrade cancellation event');\n\n const event = 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: {\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.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: element,\n });\n }\n }\n\n sendCancellation(reservationNumber: ReservationDTO) {\n this.log('sending cancellation for reservation ' + reservationNumber);\n\n TagManager.dataLayer({\n dataLayer: analytics.generateRefundMessageObject(reservationNumber),\n });\n }\n\n sendMemberSignUp() {\n TagManager.dataLayer({\n dataLayer: {\n event: 'Email Sign up',\n },\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.generateDateSelectionMessageObject({ from: startDate, to: endDate }, adult || 0, children || 0, infant || 0),\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 gtmIds: string[] | undefined = [];\n\n if (hotel?.datalayer?.gtmIds?.length) {\n gtmIds = hotel.datalayer.gtmIds;\n } else if (company) {\n gtmIds = company.datalayer?.gtmIds;\n }\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 }\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 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"]}