@simplybusiness/services 0.21.5 → 0.22.0

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 (108) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/index.js +1198 -17
  3. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  4. package/dist/esm/index.js +1193 -4
  5. package/package.json +7 -6
  6. package/src/snowplow/event-definitions/intervention.ts +2 -2
  7. package/dist/cjs/address-lookup/index.js +0 -98
  8. package/dist/cjs/address-lookup/index.js.map +0 -1
  9. package/dist/cjs/address-lookup/types.js +0 -7
  10. package/dist/cjs/address-lookup/types.js.map +0 -1
  11. package/dist/cjs/airbrake/index.js +0 -45
  12. package/dist/cjs/airbrake/index.js.map +0 -1
  13. package/dist/cjs/index.js.map +0 -1
  14. package/dist/cjs/mocks/eventDefinitions.js +0 -90
  15. package/dist/cjs/mocks/eventDefinitions.js.map +0 -1
  16. package/dist/cjs/mocks/scripts-mock.js +0 -59
  17. package/dist/cjs/mocks/scripts-mock.js.map +0 -1
  18. package/dist/cjs/mocks/snowplowBrowserTrackerMock.js +0 -7
  19. package/dist/cjs/mocks/snowplowBrowserTrackerMock.js.map +0 -1
  20. package/dist/cjs/snowplow/Snowplow.js +0 -174
  21. package/dist/cjs/snowplow/Snowplow.js.map +0 -1
  22. package/dist/cjs/snowplow/SnowplowContext.js +0 -61
  23. package/dist/cjs/snowplow/SnowplowContext.js.map +0 -1
  24. package/dist/cjs/snowplow/constants.js +0 -13
  25. package/dist/cjs/snowplow/constants.js.map +0 -1
  26. package/dist/cjs/snowplow/contexts.js +0 -68
  27. package/dist/cjs/snowplow/contexts.js.map +0 -1
  28. package/dist/cjs/snowplow/event-definitions/base.js +0 -56
  29. package/dist/cjs/snowplow/event-definitions/base.js.map +0 -1
  30. package/dist/cjs/snowplow/event-definitions/index.js +0 -65
  31. package/dist/cjs/snowplow/event-definitions/index.js.map +0 -1
  32. package/dist/cjs/snowplow/event-definitions/intervention.js +0 -33
  33. package/dist/cjs/snowplow/event-definitions/intervention.js.map +0 -1
  34. package/dist/cjs/snowplow/event-definitions/personalised_cover.js +0 -122
  35. package/dist/cjs/snowplow/event-definitions/personalised_cover.js.map +0 -1
  36. package/dist/cjs/snowplow/event-definitions/qcp.js +0 -348
  37. package/dist/cjs/snowplow/event-definitions/qcp.js.map +0 -1
  38. package/dist/cjs/snowplow/event-definitions/questionnaire.js +0 -115
  39. package/dist/cjs/snowplow/event-definitions/questionnaire.js.map +0 -1
  40. package/dist/cjs/snowplow/event-definitions/redaction.js +0 -154
  41. package/dist/cjs/snowplow/event-definitions/redaction.js.map +0 -1
  42. package/dist/cjs/snowplow/event-definitions/referral.js +0 -37
  43. package/dist/cjs/snowplow/event-definitions/referral.js.map +0 -1
  44. package/dist/cjs/snowplow/getSnowplowConfig.js +0 -16
  45. package/dist/cjs/snowplow/getSnowplowConfig.js.map +0 -1
  46. package/dist/cjs/snowplow/index.js +0 -25
  47. package/dist/cjs/snowplow/index.js.map +0 -1
  48. package/dist/cjs/snowplow/types.js +0 -6
  49. package/dist/cjs/snowplow/types.js.map +0 -1
  50. package/dist/cjs/utils/index.js +0 -21
  51. package/dist/cjs/utils/index.js.map +0 -1
  52. package/dist/cjs/utils/isObject.js +0 -15
  53. package/dist/cjs/utils/isObject.js.map +0 -1
  54. package/dist/cjs/utils/testUtils.js +0 -43
  55. package/dist/cjs/utils/testUtils.js.map +0 -1
  56. package/dist/cjs/utils/text.js +0 -45
  57. package/dist/cjs/utils/text.js.map +0 -1
  58. package/dist/esm/address-lookup/index.js +0 -88
  59. package/dist/esm/address-lookup/index.js.map +0 -1
  60. package/dist/esm/address-lookup/types.js +0 -5
  61. package/dist/esm/address-lookup/types.js.map +0 -1
  62. package/dist/esm/airbrake/index.js +0 -35
  63. package/dist/esm/airbrake/index.js.map +0 -1
  64. package/dist/esm/index.js.map +0 -1
  65. package/dist/esm/mocks/eventDefinitions.js +0 -80
  66. package/dist/esm/mocks/eventDefinitions.js.map +0 -1
  67. package/dist/esm/mocks/scripts-mock.js +0 -49
  68. package/dist/esm/mocks/scripts-mock.js.map +0 -1
  69. package/dist/esm/mocks/snowplowBrowserTrackerMock.js +0 -6
  70. package/dist/esm/mocks/snowplowBrowserTrackerMock.js.map +0 -1
  71. package/dist/esm/snowplow/Snowplow.js +0 -169
  72. package/dist/esm/snowplow/Snowplow.js.map +0 -1
  73. package/dist/esm/snowplow/SnowplowContext.js +0 -43
  74. package/dist/esm/snowplow/SnowplowContext.js.map +0 -1
  75. package/dist/esm/snowplow/constants.js +0 -3
  76. package/dist/esm/snowplow/constants.js.map +0 -1
  77. package/dist/esm/snowplow/contexts.js +0 -47
  78. package/dist/esm/snowplow/contexts.js.map +0 -1
  79. package/dist/esm/snowplow/event-definitions/base.js +0 -66
  80. package/dist/esm/snowplow/event-definitions/base.js.map +0 -1
  81. package/dist/esm/snowplow/event-definitions/index.js +0 -36
  82. package/dist/esm/snowplow/event-definitions/index.js.map +0 -1
  83. package/dist/esm/snowplow/event-definitions/intervention.js +0 -23
  84. package/dist/esm/snowplow/event-definitions/intervention.js.map +0 -1
  85. package/dist/esm/snowplow/event-definitions/personalised_cover.js +0 -131
  86. package/dist/esm/snowplow/event-definitions/personalised_cover.js.map +0 -1
  87. package/dist/esm/snowplow/event-definitions/qcp.js +0 -339
  88. package/dist/esm/snowplow/event-definitions/qcp.js.map +0 -1
  89. package/dist/esm/snowplow/event-definitions/questionnaire.js +0 -106
  90. package/dist/esm/snowplow/event-definitions/questionnaire.js.map +0 -1
  91. package/dist/esm/snowplow/event-definitions/redaction.js +0 -144
  92. package/dist/esm/snowplow/event-definitions/redaction.js.map +0 -1
  93. package/dist/esm/snowplow/event-definitions/referral.js +0 -28
  94. package/dist/esm/snowplow/event-definitions/referral.js.map +0 -1
  95. package/dist/esm/snowplow/getSnowplowConfig.js +0 -7
  96. package/dist/esm/snowplow/getSnowplowConfig.js.map +0 -1
  97. package/dist/esm/snowplow/index.js +0 -8
  98. package/dist/esm/snowplow/index.js.map +0 -1
  99. package/dist/esm/snowplow/types.js +0 -3
  100. package/dist/esm/snowplow/types.js.map +0 -1
  101. package/dist/esm/utils/index.js +0 -4
  102. package/dist/esm/utils/index.js.map +0 -1
  103. package/dist/esm/utils/isObject.js +0 -5
  104. package/dist/esm/utils/isObject.js.map +0 -1
  105. package/dist/esm/utils/testUtils.js +0 -26
  106. package/dist/esm/utils/testUtils.js.map +0 -1
  107. package/dist/esm/utils/text.js +0 -25
  108. package/dist/esm/utils/text.js.map +0 -1
package/dist/cjs/index.js CHANGED
@@ -1,22 +1,1203 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // index.tsx
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AddressLookup: () => AddressLookup,
24
+ Snowplow: () => Snowplow,
25
+ SnowplowProvider: () => SnowplowProvider,
26
+ eventDefinitions: () => eventDefinitions,
27
+ getAirbrake: () => getAirbrake,
28
+ getContexts: () => getContexts,
29
+ getSnowplowConfig: () => getSnowplowConfig,
30
+ interventionPageEvents: () => interventionPageEvents,
31
+ makeContexts: () => makeContexts,
32
+ personalisedCoverPageEvents: () => personalisedCoverPageEvents,
33
+ qcpPageEvents: () => qcpPageEvents,
34
+ questionnairePageEvents: () => questionnairePageEvents,
35
+ referralPageEvents: () => referralPageEvents,
36
+ updateIdentityContext: () => updateIdentityContext,
37
+ useSnowplowContext: () => useSnowplowContext
4
38
  });
5
- _export_star(require("./address-lookup"), exports);
6
- _export_star(require("./airbrake"), exports);
7
- _export_star(require("./snowplow"), exports);
8
- function _export_star(from, to) {
9
- Object.keys(from).forEach(function(k) {
10
- if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
11
- Object.defineProperty(to, k, {
12
- enumerable: true,
13
- get: function() {
14
- return from[k];
15
- }
16
- });
17
- }
39
+ module.exports = __toCommonJS(index_exports);
40
+
41
+ // src/address-lookup/index.ts
42
+ var BASE_URL = "https://api.addressy.com/Capture/Interactive";
43
+ var FIND_URL = `${BASE_URL}/Find/v1.00/json3.ws`;
44
+ var RETRIEVE_URL = `${BASE_URL}/Retrieve/v1.2/json3.ws`;
45
+ var COUNTRIES = ["GB"];
46
+ var LIMIT = 20;
47
+ var AddressLookup = class _AddressLookup {
48
+ constructor({ apiKey, limit, countries }) {
49
+ this.apiKey = apiKey;
50
+ this.limit = limit || LIMIT;
51
+ this.countries = countries || COUNTRIES;
52
+ this.findUrl = `${FIND_URL}?Key=${this.apiKey}&Limit=${this.limit}&Countries=${this.countries}`;
53
+ this.retrieveUrl = `${RETRIEVE_URL}?Key=${this.apiKey}`;
54
+ }
55
+ static async fetchFromApi(url, handleResponse) {
56
+ return new Promise((resolve, reject) => {
57
+ fetch(url).then((response) => response.json()).then((data) => resolve(handleResponse(data))).catch((error) => reject(Error(error)));
58
+ });
59
+ }
60
+ find(partialAddress) {
61
+ return new Promise((resolve, reject) => {
62
+ fetch(`${this.findUrl}&Text=${partialAddress}`).then((response) => response.json()).then((data) => resolve(this.formatItems(data))).catch((error) => reject(Error(error)));
63
+ });
64
+ }
65
+ findById(id) {
66
+ return new Promise((resolve, reject) => {
67
+ fetch(`${this.findUrl}&Container=${id}`).then((response) => response.json()).then((data) => resolve(this.formatItems(data))).catch((error) => reject(Error(error)));
18
68
  });
19
- return from;
69
+ }
70
+ get(id) {
71
+ return new Promise((resolve, reject) => {
72
+ fetch(`${this.retrieveUrl}&Id=${id}`).then((response) => response.json()).then((data) => resolve(_AddressLookup.formatUkAddress(data))).catch((error) => reject(Error(error)));
73
+ });
74
+ }
75
+ formatItems({ Items }) {
76
+ if (!Items || !Array.isArray(Items)) {
77
+ throw Error("No address found");
78
+ }
79
+ if (Items[0].Error) {
80
+ throw Error(Items[0].Description);
81
+ }
82
+ return Items.map(
83
+ (item) => ({
84
+ id: item.Id,
85
+ label: `${item.Text}, ${item.Description}`,
86
+ value: item.Text,
87
+ // Add a callback to trigger secondary search
88
+ // if the address type is not "Address"
89
+ callback: item.Type === "Address" ? void 0 : () => this.findById(item.Id)
90
+ })
91
+ );
92
+ }
93
+ static formatUkAddress({ Items }) {
94
+ if (!Items || !Array.isArray(Items)) {
95
+ throw Error("No address found");
96
+ }
97
+ if (Items[0].Error) {
98
+ throw Error(Items[0].Description);
99
+ }
100
+ const { Line1, Line2, City, PostalCode } = Items[0];
101
+ return {
102
+ address_1: Line1,
103
+ address_2: Line2,
104
+ town: City,
105
+ uk_postcode: PostalCode
106
+ };
107
+ }
108
+ };
109
+
110
+ // src/airbrake/index.ts
111
+ var import_browser = require("@airbrake/browser");
112
+ var defaultProjectId = 512949;
113
+ var defaultProjectKey = "4e25197d8faea61c10fbb97702200780";
114
+ var notifierInstance;
115
+ var fakeAirbrake = {
116
+ notify: console.error
117
+ };
118
+ var shouldUseAirbrake = () => {
119
+ const { location } = globalThis;
120
+ const isTest = false;
121
+ return isTest || location?.hostname.indexOf("quote.") > -1;
122
+ };
123
+ function getAirbrake(options) {
124
+ const { projectId, projectKey, forceSend } = options;
125
+ if (!forceSend || !shouldUseAirbrake()) {
126
+ return fakeAirbrake;
127
+ }
128
+ if (!notifierInstance) {
129
+ notifierInstance = new import_browser.Notifier({
130
+ projectId: projectId ?? defaultProjectId,
131
+ projectKey: projectKey ?? defaultProjectKey,
132
+ environment: "development",
133
+ instrumentation: {
134
+ onerror: false
135
+ }
136
+ });
137
+ }
138
+ return notifierInstance;
139
+ }
140
+
141
+ // src/utils/text.ts
142
+ var snakeCaseKeys = (object) => Object.entries(object || {}).reduce(
143
+ (acc, [key, value]) => {
144
+ const newKey = camelToSnakeCase(key);
145
+ if (Array.isArray(value) && value.every(isObject)) {
146
+ return {
147
+ ...acc,
148
+ [newKey]: value.map((v) => snakeCaseKeys(v))
149
+ };
150
+ }
151
+ if (isObject(value)) {
152
+ return {
153
+ ...acc,
154
+ [newKey]: snakeCaseKeys(value)
155
+ };
156
+ }
157
+ return {
158
+ ...acc,
159
+ [newKey]: value
160
+ };
161
+ },
162
+ {}
163
+ );
164
+ var snakeCase = (text = "") => text.toLowerCase().replace(/ /g, "_");
165
+ var camelToSnakeCase = (text) => text.charAt(0).toLowerCase() + text.slice(1).replace(
166
+ /(\[.*?\])|[A-Z]/g,
167
+ (match, group) => group ? match : `_${match.toLowerCase()}`
168
+ );
169
+
170
+ // src/utils/isObject.tsx
171
+ function isObject(value) {
172
+ return typeof value === "object" && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
20
173
  }
21
174
 
22
- //# sourceMappingURL=index.js.map
175
+ // src/snowplow/contexts.ts
176
+ var getContexts = (config) => {
177
+ const contextEntries = Object.entries(config || {}).filter(([key]) => key.includes("Context") && key !== "includeGAContext").reduce((acc, [key, value]) => {
178
+ if (typeof value === "object") {
179
+ return { ...acc, [key]: snakeCaseKeys({ ...value }) };
180
+ }
181
+ return {
182
+ ...acc,
183
+ [key]: snakeCaseKeys({ data: { service_channel_identifier: value } })
184
+ };
185
+ }, {});
186
+ return contextEntries;
187
+ };
188
+ var updateIdentityContext = (contexts, uid) => {
189
+ const index = Object.keys(contexts).findIndex(
190
+ (ctx) => contexts[ctx].schema?.includes("identity_context")
191
+ );
192
+ if (index > -1) {
193
+ const key = Object.keys(contexts)[index];
194
+ return {
195
+ ...contexts,
196
+ [key]: {
197
+ ...contexts[key],
198
+ data: {
199
+ ...contexts[key].data,
200
+ domain_userid: uid
201
+ }
202
+ }
203
+ };
204
+ }
205
+ return contexts;
206
+ };
207
+ var makeContexts = (keys, config) => (keys || []).map((key) => config[key]);
208
+
209
+ // src/snowplow/event-definitions/base.ts
210
+ var baseEventDefinitions = [
211
+ // Mobile link in header
212
+ {
213
+ name: "mobileLinkClick",
214
+ type: "structured",
215
+ makePayload: () => ({
216
+ category: "marketing",
217
+ action: "link-click",
218
+ label: "mobile_call_button",
219
+ property: window.location.href
220
+ })
221
+ },
222
+ // Operating hours link in footer
223
+ {
224
+ name: "operatingHoursClick",
225
+ type: "unstructured",
226
+ makePayload: () => ({
227
+ schema: "iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0",
228
+ data: {
229
+ schema: "iglu:com.simplybusiness/operating_hours_clicked/jsonschema/1-0-2",
230
+ data: {}
231
+ }
232
+ })
233
+ },
234
+ {
235
+ name: "progressbarClicked",
236
+ type: "unstructured",
237
+ makePayload: (params) => {
238
+ const {
239
+ section,
240
+ context,
241
+ fromStepIndex,
242
+ fromStepName,
243
+ stepIndex,
244
+ stepName
245
+ } = params;
246
+ return {
247
+ schema: "iglu:com.simplybusiness/progressbar_clicked/jsonschema/1-1-0",
248
+ data: {
249
+ source_page_index: fromStepIndex,
250
+ source_page_name: fromStepName,
251
+ page_index: stepIndex,
252
+ page_name: stepName,
253
+ site: context.site,
254
+ section_name: section,
255
+ vertical: context.vertical
256
+ }
257
+ };
258
+ }
259
+ }
260
+ ];
261
+
262
+ // src/snowplow/event-definitions/qcp.ts
263
+ var qcpEventDefinitions = [
264
+ {
265
+ // QDP details button
266
+ name: "detailsClicked",
267
+ type: "structured",
268
+ makePayload: () => ({
269
+ category: "comparison_cta",
270
+ action: "link_click",
271
+ label: "Details"
272
+ })
273
+ },
274
+ {
275
+ // Buy button
276
+ name: "selectClicked",
277
+ type: "structured",
278
+ makePayload: () => ({
279
+ category: "comparison_cta",
280
+ action: "link_click",
281
+ label: "Buy"
282
+ })
283
+ },
284
+ {
285
+ // Quote Details Slider Next steps button
286
+ name: "nextStepsClicked",
287
+ type: "structured",
288
+ makePayload: () => ({
289
+ category: "quote_details_slider_next_step_cta",
290
+ action: "link_click",
291
+ label: "Next steps"
292
+ })
293
+ },
294
+ {
295
+ // Toggle deductibles accordion
296
+ name: "deductiblesClicked",
297
+ type: "structured",
298
+ makePayload: () => ({
299
+ category: "us-qcp-react",
300
+ action: "view_deductables_clicked",
301
+ label: "view_deductables_clicked",
302
+ property: window.location.href
303
+ })
304
+ },
305
+ {
306
+ name: "deductiblesClickedUk",
307
+ type: "structured",
308
+ makePayload: (params) => {
309
+ const { label, deviceType } = params;
310
+ const urlFriendlyLabel = label.replace(/ /g, "-").toLowerCase();
311
+ return {
312
+ category: `uk-qcp-react-${deviceType}-${urlFriendlyLabel}-view-excess-toggle`,
313
+ action: "view_excess_clicked",
314
+ label,
315
+ property: window.location.href
316
+ };
317
+ }
318
+ },
319
+ {
320
+ // Quote Details Slider opened
321
+ name: "sliderOpened",
322
+ type: "structured",
323
+ makePayload: (params) => {
324
+ const { label } = params;
325
+ return {
326
+ category: "comparison_cta",
327
+ action: "quote_details_slider_opened",
328
+ label
329
+ };
330
+ }
331
+ },
332
+ {
333
+ // Coverage modal opened
334
+ name: "coverageModalOpened",
335
+ type: "structured",
336
+ makePayload: (params) => {
337
+ const {
338
+ category,
339
+ product = "extra_coverage",
340
+ title
341
+ } = params;
342
+ const productLabel = snakeCase(product);
343
+ return {
344
+ category,
345
+ action: `${productLabel}_${snakeCase(title)}_popup_opened`,
346
+ label: productLabel,
347
+ property: window.location.href
348
+ };
349
+ }
350
+ },
351
+ {
352
+ // Toggle cover select
353
+ name: "coverChanged",
354
+ type: "unstructured",
355
+ makePayload: (params) => {
356
+ const { name = "", fromValue = "", toValue = "" } = params;
357
+ let action = "change";
358
+ if (fromValue === "0") {
359
+ action = "add";
360
+ }
361
+ if (toValue === "0") {
362
+ action = "remove";
363
+ }
364
+ return {
365
+ schema: "iglu:com.simplybusiness/comparison_page_cover_changed/jsonschema/1-0-0",
366
+ data: {
367
+ name,
368
+ action,
369
+ from_value: fromValue,
370
+ to_value: toValue
371
+ }
372
+ };
373
+ },
374
+ contexts: ["distributionChannelContext"]
375
+ },
376
+ {
377
+ name: "ratingsModalOpened",
378
+ type: "structured",
379
+ makePayload: (params) => {
380
+ const { category, label } = params;
381
+ return {
382
+ category,
383
+ action: "insurer_rating_help_popup_triggered",
384
+ label,
385
+ property: window.location.href
386
+ };
387
+ }
388
+ },
389
+ {
390
+ name: "coverToggleOpened",
391
+ type: "structured",
392
+ makePayload: () => ({
393
+ category: "qcp_limit_interaction",
394
+ label: "limit_interaction",
395
+ action: "limit_interaction_clicked",
396
+ property: window.location.href
397
+ })
398
+ },
399
+ {
400
+ name: "paymentToggleClicked",
401
+ type: "structured",
402
+ makePayload: (params) => {
403
+ const { category, label } = params;
404
+ return {
405
+ category,
406
+ action: "button_click",
407
+ label,
408
+ property: window.location.href
409
+ };
410
+ }
411
+ },
412
+ {
413
+ name: "insurerDetailsAccordionClicked",
414
+ type: "structured",
415
+ makePayload: () => ({
416
+ category: "quote_details_slider_insurer_details_description",
417
+ action: "accordion_clicked",
418
+ label: "accordion_clicked",
419
+ property: window.location.href
420
+ })
421
+ },
422
+ {
423
+ name: "priceDetailsPopUpOpened",
424
+ type: "structured",
425
+ makePayload: () => ({
426
+ category: "price_details",
427
+ action: "price_details_popup_opened",
428
+ label: "Price details",
429
+ property: window.location.href
430
+ })
431
+ },
432
+ {
433
+ name: "editLimitButtonClicked",
434
+ type: "structured",
435
+ makePayload: () => ({
436
+ category: "cover_limit_changes",
437
+ action: "edit_limit_button_clicked",
438
+ label: "Edit Limit",
439
+ property: window.location.href
440
+ })
441
+ },
442
+ {
443
+ name: "applyButtonClicked",
444
+ type: "structured",
445
+ makePayload: () => ({
446
+ category: "cover_limit_changes",
447
+ action: "apply_button_clicked",
448
+ label: "Apply Button Clicked",
449
+ property: window.location.href
450
+ })
451
+ },
452
+ {
453
+ name: "coverageInfoClicked",
454
+ type: "structured",
455
+ makePayload: (params) => {
456
+ const { deviceType } = params;
457
+ return {
458
+ action: "show_coverage_info_clicked",
459
+ category: `uk-qcp-react-${deviceType}-show-coverage-info-toggle`,
460
+ label: "show_coverage_info_clicked",
461
+ property: window.location.href
462
+ };
463
+ }
464
+ },
465
+ {
466
+ name: "backToApplication",
467
+ type: "unstructured",
468
+ makePayload: (params) => {
469
+ const { journeyId, vertical } = params;
470
+ return {
471
+ schema: "iglu:com.simplybusiness/qcp_back_to_application/jsonschema/1-0-0",
472
+ data: {
473
+ journey_id: journeyId,
474
+ vertical
475
+ }
476
+ };
477
+ },
478
+ contexts: ["serviceChannelContext"]
479
+ },
480
+ {
481
+ name: "helpChatLinkClicked",
482
+ type: "structured",
483
+ makePayload: () => ({
484
+ category: "help chat for question",
485
+ action: "help_chat_for_question_clicked",
486
+ property: window.location.href
487
+ })
488
+ },
489
+ // No quotes referral
490
+ {
491
+ name: "coverOptionsLinkClicked",
492
+ type: "structured",
493
+ makePayload: () => ({
494
+ category: "uk-qcp-react-cover-options-link",
495
+ action: "cover_options_link_clicked",
496
+ label: "cover_options_link_clicked",
497
+ property: window.location.href
498
+ })
499
+ },
500
+ {
501
+ name: "referralReasonsVariantBCoverOptionsLinkClicked",
502
+ type: "structured",
503
+ makePayload: () => ({
504
+ category: "uk-24-12-qcp-mvt-referral-reasons",
505
+ action: "cover_options_link_clicked_variant_b",
506
+ label: "cover_options_link_clicked_variant_b",
507
+ property: window.location.href
508
+ })
509
+ },
510
+ {
511
+ name: "referralReasonsVariantCCoverOptionsLinkClicked",
512
+ type: "structured",
513
+ makePayload: () => ({
514
+ category: "uk-24-12-qcp-mvt-referral-reasons",
515
+ action: "cover_options_link_clicked_variant_c",
516
+ label: "cover_options_link_clicked_variant_c",
517
+ property: window.location.href
518
+ })
519
+ },
520
+ {
521
+ name: "phoneNumberLinkClicked",
522
+ type: "structured",
523
+ makePayload: () => ({
524
+ category: "uk-qcp-react-phone-number-link",
525
+ action: "phone_number_link_clicked",
526
+ label: "phone_number_link_clicked",
527
+ property: window.location.href
528
+ })
529
+ },
530
+ {
531
+ name: "stickyFooterClick",
532
+ type: "structured",
533
+ makePayload: () => ({
534
+ category: "marketing",
535
+ action: "link-click",
536
+ label: "sticky_footer_button",
537
+ property: window.location.href
538
+ })
539
+ },
540
+ {
541
+ name: "linkClicked",
542
+ type: "unstructured",
543
+ makePayload: (params) => {
544
+ const { targetUrl, elementContent } = params;
545
+ return {
546
+ schema: "iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1",
547
+ data: {
548
+ targetUrl,
549
+ elementContent
550
+ }
551
+ };
552
+ }
553
+ },
554
+ {
555
+ name: "qcpUpsellAccordionClicked",
556
+ type: "structured",
557
+ makePayload: (params) => ({
558
+ category: "us-qcp-upsells",
559
+ action: "accordion_clicked_qcp",
560
+ label: params?.label,
561
+ property: window.location.href
562
+ })
563
+ },
564
+ {
565
+ name: "qdsUpsellAccordionClicked",
566
+ type: "structured",
567
+ makePayload: (params) => ({
568
+ category: "us-qcp-upsells",
569
+ action: "accordion_clicked_slider",
570
+ label: params?.label,
571
+ property: window.location.href
572
+ })
573
+ },
574
+ {
575
+ name: "qcpUpsellTooltipHelperClicked",
576
+ type: "structured",
577
+ makePayload: (params) => ({
578
+ category: "us-qcp-upsells",
579
+ action: "tooltip_helper_clicked_qcp",
580
+ label: params?.label,
581
+ property: window.location.href
582
+ })
583
+ },
584
+ {
585
+ name: "qdsUpsellTooltipHelperClicked",
586
+ type: "structured",
587
+ makePayload: (params) => ({
588
+ category: "us-qcp-upsells",
589
+ action: "tooltip_helper_clicked_slider",
590
+ label: params?.label,
591
+ property: window.location.href
592
+ })
593
+ }
594
+ ];
595
+
596
+ // src/snowplow/event-definitions/referral.ts
597
+ var referralEventDefinitions = [
598
+ {
599
+ name: "nextCoverageClicked",
600
+ type: "structured",
601
+ makePayload: (params) => {
602
+ const { url } = params;
603
+ const eventName = "post_referral_workers_compensation_continuation_link";
604
+ return {
605
+ category: eventName,
606
+ action: "link_click",
607
+ label: eventName,
608
+ property: url
609
+ };
610
+ }
611
+ },
612
+ {
613
+ name: "helpChatLinkClicked",
614
+ type: "structured",
615
+ makePayload: () => ({
616
+ category: "help chat for question",
617
+ action: "help_chat_for_question_clicked",
618
+ property: window.location.href
619
+ })
620
+ }
621
+ ];
622
+
623
+ // src/snowplow/event-definitions/intervention.ts
624
+ var interventionEventDefinitions = [
625
+ {
626
+ name: "interventionInteractionCompleted",
627
+ type: "unstructured",
628
+ makePayload: (params) => {
629
+ const {
630
+ interventionId,
631
+ interventionName,
632
+ category,
633
+ userUniqueIdentifier,
634
+ userUniqueIdentifierType,
635
+ action,
636
+ site
637
+ } = params;
638
+ return {
639
+ schema: "iglu:com.simplybusiness/intervention_interaction_completed/jsonschema/1-0-0",
640
+ data: {
641
+ intervention_id: interventionId,
642
+ intervention_name: interventionName,
643
+ category,
644
+ user_unique_identifier: userUniqueIdentifier,
645
+ user_unique_identifier_type: userUniqueIdentifierType,
646
+ action,
647
+ site
648
+ }
649
+ };
650
+ }
651
+ }
652
+ ];
653
+
654
+ // src/snowplow/constants.ts
655
+ var DELIMITER = "|";
656
+
657
+ // src/snowplow/event-definitions/redaction.ts
658
+ var PII_ANSWER = [
659
+ "customer_title",
660
+ "customer_first_name",
661
+ "customer_last_name",
662
+ "customer_email_address",
663
+ "preapp_email_address",
664
+ "customer_telephone_number",
665
+ "customer_alternative_telephone_number",
666
+ "uk_address_lookup",
667
+ "uk_correspondence_address_lookup",
668
+ "customer_address_1_pre_quote",
669
+ "customer_address_2_pre_quote",
670
+ "customer_town_pre_quote",
671
+ "customer_postcode_pre_quote",
672
+ "customer_address_1",
673
+ "customer_address_2",
674
+ "customer_town",
675
+ "customer_postcode",
676
+ "address_1_pre_quote",
677
+ "address_2_pre_quote",
678
+ "uk_postcode_pre_quote",
679
+ "town_pre_quote",
680
+ "owner_first_name",
681
+ "owner_last_name",
682
+ "beneficiary_first_name",
683
+ "beneficiary_last_name",
684
+ "gender",
685
+ "dynamic_ssn_fein",
686
+ "ssn",
687
+ "fein",
688
+ "sof_county_court_judgement_online_yes",
689
+ "sof_county_court_judgement_online_no",
690
+ "sof_ccj_count",
691
+ "sof_ccj_value",
692
+ "sof_ccj_date",
693
+ "sof_court_judgement_yes",
694
+ "sof_court_judgement_no",
695
+ "ccj_date",
696
+ "sof_single_ccj_no",
697
+ "sof_single_ccj_yes",
698
+ "sof_ccj_yes",
699
+ "sof_ccj_no",
700
+ "ccj_count",
701
+ "sof_bankrupt_yes",
702
+ "sof_bankrupt_no",
703
+ "sof_multiple_bankruptcies_yes",
704
+ "sof_multiple_bankruptcies_no",
705
+ "bankruptcy_date",
706
+ "sof_single_bankruptcy_no",
707
+ "sof_single_bankruptcy_yes",
708
+ "sof_bankruptcy_yes",
709
+ "sof_bankruptcy_no",
710
+ "bankruptcy_discharged",
711
+ "sof_liquidation_yes",
712
+ "sof_liquidation_no",
713
+ "sof_multiple_liquidations",
714
+ "liquidation_date",
715
+ "sof_criminal_offence_yes",
716
+ "sof_criminal_offence_no",
717
+ "sof_criminal_yes",
718
+ "sof_criminal_no",
719
+ "hcp_date_of_birth_1",
720
+ "hcp_date_of_birth_2",
721
+ "hcp_date_of_birth_3",
722
+ "hcp_date_of_birth_4",
723
+ "hcp_date_of_birth_5",
724
+ "hcp_date_of_birth_6",
725
+ "hcp_date_of_birth_7",
726
+ "hcp_date_of_birth_8",
727
+ "hcp_date_of_birth_9",
728
+ "hcp_date_of_birth_10",
729
+ "sof_previous_claims_yes",
730
+ "sof_previous_claims_no",
731
+ "sof_claims_yes",
732
+ "sof_claims_no",
733
+ "sof_property_claims_in_the_last_5_years_yes",
734
+ "sof_property_claims_in_the_last_5_years_no",
735
+ "sof_property_claims_in_the_last_0_to_4_years_yes",
736
+ "sof_property_claims_in_the_last_0_to_4_years_no",
737
+ "claim_count",
738
+ "sof_number_of_claims",
739
+ "number_of_claims_in_last_5_years",
740
+ "number_of_claims_in_time_owned",
741
+ "date_of_incident_1",
742
+ "date_of_incident_2",
743
+ "date_of_incident_3",
744
+ "date_of_incident_4",
745
+ "date_of_incident_5",
746
+ "type_of_incident_1",
747
+ "type_of_incident_2",
748
+ "type_of_incident_3",
749
+ "type_of_incident_4",
750
+ "type_of_incident_5",
751
+ "incident_value_1",
752
+ "incident_value_2",
753
+ "incident_value_3",
754
+ "incident_value_4",
755
+ "incident_value_5",
756
+ "sof_pollution_disease_claims_yes",
757
+ "sof_pollution_disease_claims_no",
758
+ "sof_potential_claims_yes",
759
+ "sof_potential_claims_no",
760
+ "sof_previous_circumstances_yes",
761
+ "sof_previous_circumstances_no",
762
+ "sof_possible_claims_yes",
763
+ "sof_possible_claims_no",
764
+ "date_of_possible_incident",
765
+ "type_of_possible_incident",
766
+ "possible_incident_value",
767
+ "sof_property_claims_yes",
768
+ "sof_property_claims_no",
769
+ "sof_liability_claims_yes",
770
+ "sof_liability_claims_no",
771
+ "van_registration",
772
+ "sof_disqualified_director_yes",
773
+ "sof_disqualified_director_no",
774
+ "sof_insurance_refused_yes",
775
+ "sof_insurance_refused_no",
776
+ "sof_insurance_declined_yes",
777
+ "sof_insurance_declined_no",
778
+ "insurance_refused"
779
+ ];
780
+ var RADIO_ANSWER_FROM_QUESTIONS = [
781
+ "have_secondary_trade_yes",
782
+ "have_secondary_trade_no"
783
+ ];
784
+ var ANSWER_SUFFIX_PATTERN = /_(yes|no)$/;
785
+ var redact = (params) => {
786
+ let { question, answer } = params;
787
+ const piiAnswer = new Set(PII_ANSWER);
788
+ const radioAnswerFromQuestions = new Set(RADIO_ANSWER_FROM_QUESTIONS);
789
+ if (piiAnswer.has(question)) {
790
+ answer = "REDACTED";
791
+ question = question?.replace(ANSWER_SUFFIX_PATTERN, "");
792
+ } else if (radioAnswerFromQuestions.has(question)) {
793
+ question = question?.replace(ANSWER_SUFFIX_PATTERN, "");
794
+ }
795
+ return { question, answer };
796
+ };
797
+
798
+ // src/snowplow/event-definitions/questionnaire.ts
799
+ var questionnaireEventDefinitions = [
800
+ {
801
+ name: "questionAnswered",
802
+ type: "unstructured",
803
+ makePayload: (params) => {
804
+ const { section, context } = params;
805
+ const { question, answer } = redact(params);
806
+ const flatAnswer = Array.isArray(answer) ? answer.join(DELIMITER) : answer;
807
+ return {
808
+ schema: "iglu:com.simplybusiness/form_question_answered/jsonschema/1-0-3",
809
+ data: {
810
+ site: context.site,
811
+ page_index: 1,
812
+ page_name: "quick_to_quote",
813
+ submitted_from: "quick_to_quote_experiment",
814
+ section_name: section,
815
+ question,
816
+ answer: flatAnswer,
817
+ vertical: context.vertical
818
+ }
819
+ };
820
+ }
821
+ },
822
+ {
823
+ name: "primaryDetailSelected",
824
+ type: "unstructured",
825
+ makePayload: (params) => {
826
+ const { context, answer, vertical } = params;
827
+ const { site } = context;
828
+ let verticalName = vertical || context.vertical;
829
+ if (verticalName.toLowerCase().indexOf("landlord") > -1) {
830
+ verticalName = answer === "residential" ? "Landlord" : "Commercial landlord";
831
+ }
832
+ return {
833
+ schema: "iglu:com.simplybusiness/primary_detail_selected/jsonschema/1-3-0",
834
+ data: {
835
+ site,
836
+ vertical: verticalName,
837
+ primary_detail: answer
838
+ }
839
+ };
840
+ },
841
+ contexts: ["distributionChannelContext"]
842
+ },
843
+ {
844
+ name: "helpTextOpened",
845
+ type: "unstructured",
846
+ makePayload: (params) => {
847
+ const { primaryText, label, context, helpText } = params;
848
+ return {
849
+ schema: "iglu:com.simplybusiness/help_text_opened/jsonschema/1-1-0",
850
+ data: {
851
+ vertical: context.vertical,
852
+ site: context.site,
853
+ primary_text: primaryText,
854
+ help_text: helpText,
855
+ label,
856
+ page_name: "quick_to_quote"
857
+ }
858
+ };
859
+ }
860
+ },
861
+ {
862
+ name: "assumptionsButtonClicked",
863
+ type: "structured",
864
+ makePayload: (params) => {
865
+ const { source, presentationGroup } = params;
866
+ return {
867
+ action: source,
868
+ category: presentationGroup
869
+ };
870
+ }
871
+ },
872
+ {
873
+ name: "navButtonClicked",
874
+ type: "structured",
875
+ makePayload: (params) => {
876
+ const { label, category } = params;
877
+ return {
878
+ label,
879
+ action: "link_click",
880
+ category
881
+ };
882
+ }
883
+ },
884
+ {
885
+ name: "manualAddressClicked",
886
+ type: "structured",
887
+ makePayload: (params) => {
888
+ const { category } = params;
889
+ return {
890
+ action: "link_click",
891
+ category,
892
+ label: "Enter address manually"
893
+ };
894
+ }
895
+ }
896
+ ];
897
+
898
+ // src/snowplow/event-definitions/personalised_cover.ts
899
+ var personalisedCoverEventDefinitions = [
900
+ {
901
+ name: "seeMoreClicked",
902
+ type: "structured",
903
+ makePayload: (_) => ({
904
+ category: "personalised_cover",
905
+ action: "see_more_clicked",
906
+ label: "page",
907
+ property: "personalised_cover"
908
+ })
909
+ },
910
+ {
911
+ name: "selectPackageClicked",
912
+ type: "structured",
913
+ makePayload: (_) => ({
914
+ category: "personalised_cover",
915
+ action: "select_package_clicked",
916
+ label: "page",
917
+ property: "personalised_cover"
918
+ })
919
+ },
920
+ {
921
+ name: "validationShown",
922
+ type: "structured",
923
+ makePayload: (params) => {
924
+ const { cover, question } = params;
925
+ return {
926
+ category: "personalised_cover",
927
+ action: "validation_shown",
928
+ label: "cover_question",
929
+ property: `${snakeCase(cover)}_${snakeCase(question)}`
930
+ };
931
+ }
932
+ },
933
+ {
934
+ name: "coverQuestionAnswered",
935
+ type: "unstructured",
936
+ makePayload: (params) => {
937
+ const { context } = params;
938
+ const { question, answer } = redact(params);
939
+ const flatAnswer = Array.isArray(answer) ? answer.join(DELIMITER) : answer;
940
+ return {
941
+ schema: "iglu:com.simplybusiness/form_question_answered/jsonschema/1-0-1",
942
+ data: {
943
+ site: context.site,
944
+ page_name: "personalised_cover",
945
+ section_name: "Personalised Cover Questions",
946
+ question,
947
+ answer: flatAnswer
948
+ }
949
+ };
950
+ }
951
+ },
952
+ {
953
+ name: "limitLinkClicked",
954
+ type: "structured",
955
+ makePayload: (params) => {
956
+ const { label } = params;
957
+ return {
958
+ category: "personalised_cover",
959
+ action: "limit_link_clicked",
960
+ label,
961
+ property: "link_clicked"
962
+ };
963
+ }
964
+ },
965
+ {
966
+ name: "limitChanged",
967
+ type: "structured",
968
+ makePayload: (params) => {
969
+ const { label, limit } = params;
970
+ return {
971
+ category: "personalised_cover",
972
+ action: "limit_changed",
973
+ label,
974
+ property: limit
975
+ };
976
+ }
977
+ },
978
+ {
979
+ name: "coverPresented",
980
+ type: "structured",
981
+ makePayload: (params) => {
982
+ const { property } = params;
983
+ return {
984
+ category: "personalised_cover",
985
+ action: "cover_presented",
986
+ label: "cover_name",
987
+ property
988
+ };
989
+ }
990
+ },
991
+ {
992
+ name: "moreInfoClicked",
993
+ type: "structured",
994
+ makePayload: (params) => {
995
+ const { property } = params;
996
+ return {
997
+ category: "personalised_cover",
998
+ action: "more_info_clicked",
999
+ label: "cover_name",
1000
+ property
1001
+ };
1002
+ }
1003
+ }
1004
+ ];
1005
+
1006
+ // src/snowplow/event-definitions/index.ts
1007
+ var eventDefinitions = [
1008
+ ...baseEventDefinitions,
1009
+ ...qcpEventDefinitions,
1010
+ ...referralEventDefinitions,
1011
+ ...interventionEventDefinitions,
1012
+ ...questionnaireEventDefinitions,
1013
+ ...personalisedCoverEventDefinitions
1014
+ ];
1015
+ var qcpPageEvents = [...baseEventDefinitions, ...qcpEventDefinitions];
1016
+ var referralPageEvents = [
1017
+ ...baseEventDefinitions,
1018
+ ...referralEventDefinitions
1019
+ ];
1020
+ var personalisedCoverPageEvents = [
1021
+ ...baseEventDefinitions,
1022
+ ...personalisedCoverEventDefinitions
1023
+ ];
1024
+ var interventionPageEvents = [...interventionEventDefinitions];
1025
+ var questionnairePageEvents = [...questionnaireEventDefinitions];
1026
+
1027
+ // src/snowplow/getSnowplowConfig.ts
1028
+ var getSnowplowConfig = (pageData) => pageData.scripts?.find(({ metadata }) => metadata.name === "snowplow")?.props;
1029
+
1030
+ // src/snowplow/Snowplow.ts
1031
+ var import_browser_tracker = require("@snowplow/browser-tracker");
1032
+ var Snowplow = class _Snowplow {
1033
+ constructor(props) {
1034
+ this.avalancheTrackerName = "sb-ava";
1035
+ this.bronzeAvalancheTrackerName = "sb-ava-br";
1036
+ this.pvAvalancheTrackerName = "sb-ava-pv";
1037
+ this.uid = "";
1038
+ this.trackPageView = false;
1039
+ this.contexts = {};
1040
+ this.pvContext = [];
1041
+ this.structContext = [];
1042
+ this.serverData = {};
1043
+ this.eventHandlers = {};
1044
+ if (!props) return;
1045
+ const {
1046
+ appId,
1047
+ cookieDomain,
1048
+ avalancheCollector,
1049
+ eventMethod,
1050
+ uid,
1051
+ postPath,
1052
+ trackPageView: tpv
1053
+ } = props;
1054
+ this.uid = uid;
1055
+ this.trackPageView = tpv;
1056
+ this.serverData = props?.pageViewContext?.data || {};
1057
+ const stateStorageStrategy = "cookieAndLocalStorage";
1058
+ const baseOptions = {
1059
+ appId,
1060
+ cookieDomain,
1061
+ eventMethod,
1062
+ stateStorageStrategy,
1063
+ postPath
1064
+ };
1065
+ (0, import_browser_tracker.newTracker)(this.avalancheTrackerName, avalancheCollector, baseOptions);
1066
+ (0, import_browser_tracker.newTracker)(
1067
+ this.bronzeAvalancheTrackerName,
1068
+ avalancheCollector,
1069
+ baseOptions
1070
+ );
1071
+ (0, import_browser_tracker.newTracker)(this.pvAvalancheTrackerName, avalancheCollector, {
1072
+ ...baseOptions,
1073
+ eventMethod: eventMethod === "post" ? "beacon" : eventMethod
1074
+ });
1075
+ (0, import_browser_tracker.setCookiePath)("/");
1076
+ if (uid) {
1077
+ (0, import_browser_tracker.setUserId)(uid);
1078
+ }
1079
+ _Snowplow.instance = this;
1080
+ }
1081
+ setContexts(contexts) {
1082
+ this.contexts = updateIdentityContext(contexts, this.uid);
1083
+ this.pvContext = Object.values(this.contexts);
1084
+ this.structContext = makeContexts(
1085
+ ["distributionChannelContext", "serviceChannelContext"],
1086
+ this.contexts
1087
+ );
1088
+ return this;
1089
+ }
1090
+ // Send a page view event
1091
+ async trackView(event) {
1092
+ if (this.trackPageView) {
1093
+ await (0, import_browser_tracker.trackPageView)({ ...event, context: this.pvContext }, [
1094
+ this.avalancheTrackerName
1095
+ ]);
1096
+ }
1097
+ return this;
1098
+ }
1099
+ // Send a structured event with contexts
1100
+ async trackEvent(event) {
1101
+ await (0, import_browser_tracker.trackStructEvent)({ ...event, context: this.structContext }, [
1102
+ this.bronzeAvalancheTrackerName
1103
+ ]);
1104
+ return this;
1105
+ }
1106
+ // Send a custom event with defined schema and optional contexts
1107
+ async trackUnstructEvent(event, contexts) {
1108
+ if (!event) {
1109
+ return this;
1110
+ }
1111
+ if (contexts && Array.isArray(contexts) && contexts.length > 0) {
1112
+ const context = makeContexts(contexts, this.contexts);
1113
+ await (0, import_browser_tracker.trackSelfDescribingEvent)({ event, context }, [
1114
+ this.avalancheTrackerName
1115
+ ]);
1116
+ } else {
1117
+ await (0, import_browser_tracker.trackSelfDescribingEvent)({ event }, [this.avalancheTrackerName]);
1118
+ }
1119
+ return this;
1120
+ }
1121
+ addEventHandlers(eventDefinitions2) {
1122
+ const context = this.serverData;
1123
+ eventDefinitions2.forEach(({ name, type, makePayload, contexts }) => {
1124
+ if (type === "structured") {
1125
+ this.addEventHandler(name, (params) => {
1126
+ this.trackEvent(
1127
+ makePayload({
1128
+ ...params,
1129
+ context
1130
+ })
1131
+ );
1132
+ });
1133
+ } else {
1134
+ this.addEventHandler(name, (params) => {
1135
+ const payload = makePayload({
1136
+ ...params,
1137
+ context
1138
+ });
1139
+ if (contexts && Array.isArray(contexts) && contexts.length > 0) {
1140
+ this.trackUnstructEvent(payload, contexts);
1141
+ } else {
1142
+ this.trackUnstructEvent(payload);
1143
+ }
1144
+ });
1145
+ }
1146
+ });
1147
+ return this;
1148
+ }
1149
+ addEventHandler(name, handler) {
1150
+ this.eventHandlers[name] = handler;
1151
+ return this;
1152
+ }
1153
+ removeEventHandler(name) {
1154
+ delete this.eventHandlers[name];
1155
+ return this;
1156
+ }
1157
+ trigger(name, params) {
1158
+ const handler = this.eventHandlers[name];
1159
+ if (Object.prototype.hasOwnProperty.call(this.eventHandlers, name) && typeof handler === "function") {
1160
+ handler(params);
1161
+ }
1162
+ return this;
1163
+ }
1164
+ static getInstance(props) {
1165
+ if (!_Snowplow.instance) {
1166
+ _Snowplow.instance = new _Snowplow(props);
1167
+ }
1168
+ return _Snowplow.instance;
1169
+ }
1170
+ };
1171
+
1172
+ // src/snowplow/SnowplowContext.tsx
1173
+ var import_react = require("react");
1174
+ var import_jsx_runtime = require("react/jsx-runtime");
1175
+ var SnowplowContext = (0, import_react.createContext)(null);
1176
+ var SnowplowProvider = ({ scripts, children }) => {
1177
+ const [config, _setConfig] = (0, import_react.useState)(scripts);
1178
+ const snowplow = (0, import_react.useRef)(Snowplow.getInstance(config));
1179
+ (0, import_react.useEffect)(() => {
1180
+ if (snowplow.current && scripts) {
1181
+ const contexts = getContexts(config);
1182
+ snowplow.current.setContexts(contexts).addEventHandlers(eventDefinitions);
1183
+ if (config.trackPageView) snowplow.current.trackView();
1184
+ }
1185
+ }, [config, snowplow, scripts]);
1186
+ const value = (0, import_react.useMemo)(
1187
+ () => ({
1188
+ config,
1189
+ snowplow: snowplow.current
1190
+ }),
1191
+ [config, snowplow]
1192
+ );
1193
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SnowplowContext.Provider, { value, children });
1194
+ };
1195
+ function useSnowplowContext() {
1196
+ const context = (0, import_react.useContext)(SnowplowContext);
1197
+ if (!context) {
1198
+ throw new Error(
1199
+ "useSnowplowContext must be used inside a `SnowplowProvider`"
1200
+ );
1201
+ }
1202
+ return context;
1203
+ }