@searchspring/snap-controller 0.63.5 → 0.65.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.
@@ -81,6 +81,8 @@ var AbstractController_1 = require("../Abstract/AbstractController");
81
81
  var snap_store_mobx_1 = require("@searchspring/snap-store-mobx");
82
82
  var getParams_1 = require("../utils/getParams");
83
83
  var types_1 = require("../types");
84
+ var BACKGROUND_FILTER_FIELD_MATCHES = ['collection', 'category', 'categories', 'hierarchy'];
85
+ var BACKGROUND_FILTERS_VALUE_FLAGS = [1, 0, '1', '0', 'true', 'false', true, false];
84
86
  var defaultConfig = {
85
87
  id: 'search',
86
88
  globals: {},
@@ -105,19 +107,24 @@ var SearchController = /** @class */ (function (_super) {
105
107
  var _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
106
108
  _this.type = types_1.ControllerTypes.search;
107
109
  _this.previousResults = [];
110
+ _this.pageType = 'search';
111
+ _this.events = { product: {} };
108
112
  _this.track = {
109
113
  product: {
110
- click: function (e, result) {
111
- var _a, _b, _c, _d;
114
+ clickThrough: function (e, result) {
115
+ var _a, _b, _c, _d, _e, _f;
116
+ if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.clickThrough) {
117
+ return;
118
+ }
112
119
  var target = e.target;
113
- var resultHref = ((_b = (_a = result.display) === null || _a === void 0 ? void 0 : _a.mappings.core) === null || _b === void 0 ? void 0 : _b.url) || ((_c = result.mappings.core) === null || _c === void 0 ? void 0 : _c.url);
120
+ var resultHref = ((_c = (_b = result.display) === null || _b === void 0 ? void 0 : _b.mappings.core) === null || _c === void 0 ? void 0 : _c.url) || ((_d = result.mappings.core) === null || _d === void 0 ? void 0 : _d.url) || '';
114
121
  var elemHref = target === null || target === void 0 ? void 0 : target.getAttribute('href');
115
122
  // the href that should be used for restoration - if the elemHref contains the resultHref - use resultHref
116
123
  var storedHref = (elemHref === null || elemHref === void 0 ? void 0 : elemHref.indexOf(resultHref)) != -1 ? resultHref : elemHref || resultHref;
117
124
  var scrollMap = {};
118
125
  // generate the selector using element class and parent classes
119
126
  var selector = generateHrefSelector(target, storedHref);
120
- var domRect = selector ? (_d = document === null || document === void 0 ? void 0 : document.querySelector(selector)) === null || _d === void 0 ? void 0 : _d.getBoundingClientRect() : undefined;
127
+ var domRect = selector ? (_e = document === null || document === void 0 ? void 0 : document.querySelector(selector)) === null || _e === void 0 ? void 0 : _e.getBoundingClientRect() : undefined;
121
128
  // store element position data to scrollMap
122
129
  if (selector || storedHref || domRect) {
123
130
  try {
@@ -135,51 +142,100 @@ var SearchController = /** @class */ (function (_super) {
135
142
  }
136
143
  // store position data or empty object
137
144
  _this.storage.set('scrollMap', scrollMap);
138
- // track
139
- var _e = result.attributes, intellisuggestData = _e.intellisuggestData, intellisuggestSignature = _e.intellisuggestSignature;
140
- var event = _this.tracker.track.product.click({
141
- intellisuggestData: intellisuggestData,
142
- intellisuggestSignature: intellisuggestSignature,
143
- href: elemHref || resultHref,
145
+ var data = getSearchSchemaData({ params: _this.params, store: _this.store, results: [result] });
146
+ _this.tracker.events[_this.pageType].clickThrough({ data: data, siteId: (_f = _this.config.globals) === null || _f === void 0 ? void 0 : _f.siteId });
147
+ _this.events.product[result.id] = _this.events.product[result.id] || {};
148
+ _this.events.product[result.id].clickThrough = true;
149
+ _this.eventManager.fire('track.product.clickThrough', { controller: _this, event: e, products: [result], trackEvent: data });
150
+ },
151
+ click: function (e, result) {
152
+ var _a, _b, _c;
153
+ if (result.type === 'banner') {
154
+ return;
155
+ }
156
+ // TODO: closest might be going too far - write own function to only go n levels up - additionally check that href includes result.url
157
+ var href = ((_a = e.target) === null || _a === void 0 ? void 0 : _a.getAttribute('href')) || ((_c = (_b = e.target) === null || _b === void 0 ? void 0 : _b.closest('a')) === null || _c === void 0 ? void 0 : _c.getAttribute('href'));
158
+ if (href) {
159
+ _this.track.product.clickThrough(e, result);
160
+ }
161
+ else {
162
+ // TODO: in future, send as an interaction event
163
+ }
164
+ },
165
+ render: function (result) {
166
+ var _a, _b;
167
+ if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.render) {
168
+ return;
169
+ }
170
+ var data = getSearchSchemaData({ params: _this.params, store: _this.store, results: [result] });
171
+ _this.tracker.events[_this.pageType].render({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
172
+ _this.events.product[result.id] = _this.events.product[result.id] || {};
173
+ _this.events.product[result.id].render = true;
174
+ _this.eventManager.fire('track.product.render', { controller: _this, products: [result], trackEvent: data });
175
+ },
176
+ impression: function (result) {
177
+ var _a, _b;
178
+ if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.impression) {
179
+ return;
180
+ }
181
+ var data = getSearchSchemaData({ params: _this.params, store: _this.store, results: [result] });
182
+ _this.tracker.events[_this.pageType].impression({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
183
+ _this.events.product[result.id] = _this.events.product[result.id] || {};
184
+ _this.events.product[result.id].impression = true;
185
+ _this.eventManager.fire('track.product.impression', { controller: _this, products: [result], trackEvent: data });
186
+ },
187
+ addToCart: function (result) {
188
+ var _a;
189
+ var data = getSearchSchemaData({ params: _this.params, store: _this.store, results: [result] });
190
+ _this.tracker.events[_this.pageType].addToCart({
191
+ data: data,
192
+ siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId,
144
193
  });
145
- _this.eventManager.fire('track.product.click', { controller: _this, event: e, result: result, trackEvent: event });
146
- return event;
194
+ _this.eventManager.fire('track.product.addToCart', { controller: _this, products: [result], trackEvent: data });
147
195
  },
148
196
  },
197
+ redirect: function (redirectURL) {
198
+ var _a;
199
+ var data = getSearchRedirectSchemaData({ redirectURL: redirectURL });
200
+ _this.tracker.events.search.redirect({ data: data, siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
201
+ _this.eventManager.fire('track.product.redirect', { controller: _this, redirectURL: redirectURL, trackEvent: data });
202
+ },
149
203
  };
150
204
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
151
205
  var params_1, err_1, stringyParams, prevStringyParams, searchProfile, meta, response, preventBackfill, dontBackfill, backfillRequests, backfillResponses, backfillResults, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
152
206
  var _a, _b;
153
207
  var _this = this;
154
- var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
155
- return __generator(this, function (_p) {
156
- switch (_p.label) {
208
+ var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
209
+ return __generator(this, function (_o) {
210
+ switch (_o.label) {
157
211
  case 0:
158
- _p.trys.push([0, 22, 23, 24]);
212
+ _o.trys.push([0, 22, 23, 24]);
159
213
  if (!!this.initialized) return [3 /*break*/, 2];
160
214
  return [4 /*yield*/, this.init()];
161
215
  case 1:
162
- _p.sent();
163
- _p.label = 2;
216
+ _o.sent();
217
+ _o.label = 2;
164
218
  case 2:
165
219
  params_1 = this.params;
166
- if (((_d = (_c = this.params.search) === null || _c === void 0 ? void 0 : _c.query) === null || _d === void 0 ? void 0 : _d.string) && ((_f = (_e = this.params.search) === null || _e === void 0 ? void 0 : _e.query) === null || _f === void 0 ? void 0 : _f.string.length)) {
220
+ // reset events for new search
221
+ this.events = { product: {} };
222
+ if (((_d = (_c = params_1.search) === null || _c === void 0 ? void 0 : _c.query) === null || _d === void 0 ? void 0 : _d.string) && ((_f = (_e = params_1.search) === null || _e === void 0 ? void 0 : _e.query) === null || _f === void 0 ? void 0 : _f.string.length)) {
167
223
  // save it to the history store
168
- this.store.history.save(this.params.search.query.string);
224
+ this.store.history.save(params_1.search.query.string);
169
225
  }
170
226
  this.store.loading = true;
171
- _p.label = 3;
227
+ _o.label = 3;
172
228
  case 3:
173
- _p.trys.push([3, 5, , 6]);
229
+ _o.trys.push([3, 5, , 6]);
174
230
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
175
231
  controller: this,
176
232
  request: params_1,
177
233
  })];
178
234
  case 4:
179
- _p.sent();
235
+ _o.sent();
180
236
  return [3 /*break*/, 6];
181
237
  case 5:
182
- err_1 = _p.sent();
238
+ err_1 = _o.sent();
183
239
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
184
240
  this.log.warn("'beforeSearch' middleware cancelled");
185
241
  return [2 /*return*/];
@@ -227,7 +283,7 @@ var SearchController = /** @class */ (function (_super) {
227
283
  });
228
284
  return [4 /*yield*/, Promise.all(backfillRequests)];
229
285
  case 7:
230
- backfillResponses = _p.sent();
286
+ backfillResponses = _o.sent();
231
287
  // backfillResponses are [meta, searchResponse][]
232
288
  // set the meta and response to the first page of backfillResponses
233
289
  meta = backfillResponses[0][0];
@@ -245,10 +301,10 @@ var SearchController = /** @class */ (function (_super) {
245
301
  case 8: return [4 /*yield*/, this.client.search(params_1)];
246
302
  case 9:
247
303
  // infinite with no backfills.
248
- _a = _p.sent(), meta = _a[0], response = _a[1];
304
+ _a = _o.sent(), meta = _a[0], response = _a[1];
249
305
  // append new results to previous results
250
306
  response.results = __spreadArray(__spreadArray([], this.previousResults, true), (response.results || []), true);
251
- _p.label = 10;
307
+ _o.label = 10;
252
308
  case 10: return [3 /*break*/, 13];
253
309
  case 11:
254
310
  // normal request for next page
@@ -256,8 +312,8 @@ var SearchController = /** @class */ (function (_super) {
256
312
  this.previousResults = [];
257
313
  return [4 /*yield*/, this.client.search(params_1)];
258
314
  case 12:
259
- _b = _p.sent(), meta = _b[0], response = _b[1];
260
- _p.label = 13;
315
+ _b = _o.sent(), meta = _b[0], response = _b[1];
316
+ _o.label = 13;
261
317
  case 13:
262
318
  // MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data
263
319
  if (!response.meta) {
@@ -266,19 +322,19 @@ var SearchController = /** @class */ (function (_super) {
266
322
  searchProfile.stop();
267
323
  this.log.profile(searchProfile);
268
324
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params_1 }).start();
269
- _p.label = 14;
325
+ _o.label = 14;
270
326
  case 14:
271
- _p.trys.push([14, 16, , 17]);
327
+ _o.trys.push([14, 16, , 17]);
272
328
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
273
329
  controller: this,
274
330
  request: params_1,
275
331
  response: response,
276
332
  })];
277
333
  case 15:
278
- _p.sent();
334
+ _o.sent();
279
335
  return [3 /*break*/, 17];
280
336
  case 16:
281
- err_2 = _p.sent();
337
+ err_2 = _o.sent();
282
338
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
283
339
  this.log.warn("'afterSearch' middleware cancelled");
284
340
  afterSearchProfile.stop();
@@ -292,26 +348,24 @@ var SearchController = /** @class */ (function (_super) {
292
348
  case 17:
293
349
  afterSearchProfile.stop();
294
350
  this.log.profile(afterSearchProfile);
295
- // store previous results for infinite usage
296
- if ((_o = this.config.settings) === null || _o === void 0 ? void 0 : _o.infinite) {
297
- this.previousResults = JSON.parse(JSON.stringify(response.results));
298
- }
351
+ // store previous results for infinite usage (need to alsways store in case switch to infinite after pagination)
352
+ this.previousResults = JSON.parse(JSON.stringify(response.results));
299
353
  // update the store
300
354
  this.store.update(response);
301
355
  afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params_1 }).start();
302
- _p.label = 18;
356
+ _o.label = 18;
303
357
  case 18:
304
- _p.trys.push([18, 20, , 21]);
358
+ _o.trys.push([18, 20, , 21]);
305
359
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
306
360
  controller: this,
307
361
  request: params_1,
308
362
  response: response,
309
363
  })];
310
364
  case 19:
311
- _p.sent();
365
+ _o.sent();
312
366
  return [3 /*break*/, 21];
313
367
  case 20:
314
- err_3 = _p.sent();
368
+ err_3 = _o.sent();
315
369
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
316
370
  this.log.warn("'afterStore' middleware cancelled");
317
371
  afterStoreProfile.stop();
@@ -327,7 +381,7 @@ var SearchController = /** @class */ (function (_super) {
327
381
  this.log.profile(afterStoreProfile);
328
382
  return [3 /*break*/, 24];
329
383
  case 22:
330
- err_4 = _p.sent();
384
+ err_4 = _o.sent();
331
385
  if (err_4) {
332
386
  if (err_4.err && err_4.fetchDetails) {
333
387
  switch (err_4.fetchDetails.status) {
@@ -375,6 +429,13 @@ var SearchController = /** @class */ (function (_super) {
375
429
  }
376
430
  });
377
431
  }); };
432
+ _this.addToCart = function (product) { return __awaiter(_this, void 0, void 0, function () {
433
+ return __generator(this, function (_a) {
434
+ this.track.product.addToCart(product);
435
+ this.eventManager.fire('addToCart', { controller: this, products: [product] });
436
+ return [2 /*return*/];
437
+ });
438
+ }); };
378
439
  // deep merge config with defaults
379
440
  _this.config = (0, deepmerge_1.default)(defaultConfig, _this.config);
380
441
  // set restorePosition to be enabled by default when using infinite (if not provided)
@@ -388,6 +449,53 @@ var SearchController = /** @class */ (function (_super) {
388
449
  });
389
450
  // set last params to undefined for compare in search
390
451
  _this.storage.set('lastStringyParams', undefined);
452
+ _this.eventManager.on('beforeSearch', function (_a, next) {
453
+ var request = _a.request;
454
+ return __awaiter(_this, void 0, void 0, function () {
455
+ var req, query, hasCategoryBackgroundFilters;
456
+ var _b, _c, _d;
457
+ return __generator(this, function (_e) {
458
+ switch (_e.label) {
459
+ case 0:
460
+ // wait for other middleware to resolve
461
+ return [4 /*yield*/, next()];
462
+ case 1:
463
+ // wait for other middleware to resolve
464
+ _e.sent();
465
+ if (((_b = this.context) === null || _b === void 0 ? void 0 : _b.pageType) === 'category') {
466
+ this.pageType = 'category';
467
+ return [2 /*return*/];
468
+ }
469
+ req = request;
470
+ query = (_c = req.search) === null || _c === void 0 ? void 0 : _c.query;
471
+ if (!query) {
472
+ hasCategoryBackgroundFilters = (_d = req.filters) === null || _d === void 0 ? void 0 : _d.filter(function (filter) { return filter.background; }).filter(function (filter) {
473
+ return BACKGROUND_FILTER_FIELD_MATCHES.find(function (bgFilter) {
474
+ var _a;
475
+ return (_a = filter.field) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(bgFilter);
476
+ });
477
+ }).filter(function (filter) {
478
+ return BACKGROUND_FILTERS_VALUE_FLAGS.every(function (flag) {
479
+ switch (filter.type) {
480
+ case 'range':
481
+ var rangeFilter = filter;
482
+ return rangeFilter.value !== flag;
483
+ case 'value':
484
+ default:
485
+ var valueFilter = filter;
486
+ return valueFilter.value !== flag;
487
+ }
488
+ });
489
+ });
490
+ if (hasCategoryBackgroundFilters === null || hasCategoryBackgroundFilters === void 0 ? void 0 : hasCategoryBackgroundFilters.length) {
491
+ this.pageType = 'category';
492
+ }
493
+ }
494
+ return [2 /*return*/];
495
+ }
496
+ });
497
+ });
498
+ });
391
499
  // add 'afterSearch' middleware
392
500
  _this.eventManager.on('afterSearch', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
393
501
  var config, redirectURL, searchStore, nonBackgroundFilters;
@@ -399,6 +507,9 @@ var SearchController = /** @class */ (function (_super) {
399
507
  redirectURL = (_b = (_a = search.response) === null || _a === void 0 ? void 0 : _a.merchandising) === null || _b === void 0 ? void 0 : _b.redirect;
400
508
  searchStore = search.controller.store;
401
509
  if (redirectURL && ((_d = (_c = config === null || config === void 0 ? void 0 : config.settings) === null || _c === void 0 ? void 0 : _c.redirects) === null || _d === void 0 ? void 0 : _d.merchandising) && !((_f = (_e = search === null || search === void 0 ? void 0 : search.response) === null || _e === void 0 ? void 0 : _e.filters) === null || _f === void 0 ? void 0 : _f.length) && !searchStore.loaded) {
510
+ //set loaded to true to prevent infinite search/reloading from happening
511
+ searchStore.loaded = true;
512
+ this.track.redirect(redirectURL);
402
513
  window.location.replace(redirectURL);
403
514
  return [2 /*return*/, false];
404
515
  }
@@ -407,6 +518,8 @@ var SearchController = /** @class */ (function (_super) {
407
518
  ((_m = (_l = search === null || search === void 0 ? void 0 : search.response) === null || _l === void 0 ? void 0 : _l.search) === null || _m === void 0 ? void 0 : _m.query) &&
408
519
  ((_p = (_o = search === null || search === void 0 ? void 0 : search.response) === null || _o === void 0 ? void 0 : _o.pagination) === null || _p === void 0 ? void 0 : _p.totalResults) === 1 &&
409
520
  !(nonBackgroundFilters === null || nonBackgroundFilters === void 0 ? void 0 : nonBackgroundFilters.length)) {
521
+ //set loaded to true to prevent infinite search/reloading from happening
522
+ searchStore.loaded = true;
410
523
  window.location.replace(search === null || search === void 0 ? void 0 : search.response.results[0].mappings.core.url);
411
524
  return [2 /*return*/, false];
412
525
  }
@@ -556,17 +669,15 @@ var SearchController = /** @class */ (function (_super) {
556
669
  }
557
670
  params.tracking = params.tracking || {};
558
671
  params.tracking.domain = window.location.href;
559
- var userId = this.tracker.getUserId();
672
+ var _e = this.tracker.getContext(), userId = _e.userId, sessionId = _e.sessionId, pageLoadId = _e.pageLoadId, shopperId = _e.shopperId;
560
673
  if (userId) {
561
674
  params.tracking.userId = userId;
562
675
  }
563
- var sessionId = this.tracker.getContext().sessionId;
564
676
  if (sessionId) {
565
677
  params.tracking.sessionId = sessionId;
566
678
  }
567
- var pageId = this.tracker.getContext().pageLoadId;
568
- if (pageId) {
569
- params.tracking.pageLoadId = pageId;
679
+ if (pageLoadId) {
680
+ params.tracking.pageLoadId = pageLoadId;
570
681
  }
571
682
  if (!((_d = (_c = this.config.globals) === null || _c === void 0 ? void 0 : _c.personalization) === null || _d === void 0 ? void 0 : _d.disabled)) {
572
683
  var cartItems = this.tracker.cookies.cart.get();
@@ -579,7 +690,6 @@ var SearchController = /** @class */ (function (_super) {
579
690
  params.personalization = params.personalization || {};
580
691
  params.personalization.lastViewed = lastViewedItems.join(',');
581
692
  }
582
- var shopperId = this.tracker.getShopperId();
583
693
  if (shopperId) {
584
694
  params.personalization = params.personalization || {};
585
695
  params.personalization.shopper = shopperId;
@@ -639,3 +749,66 @@ function generateHrefSelector(element, href, levels) {
639
749
  return;
640
750
  }
641
751
  exports.generateHrefSelector = generateHrefSelector;
752
+ function getSearchRedirectSchemaData(_a) {
753
+ var redirectURL = _a.redirectURL;
754
+ return {
755
+ redirect: redirectURL,
756
+ };
757
+ }
758
+ function getSearchSchemaData(_a) {
759
+ var _b, _c, _d, _e, _f, _g, _h, _j;
760
+ var params = _a.params, store = _a.store, results = _a.results;
761
+ var filters = (_b = params.filters) === null || _b === void 0 ? void 0 : _b.reduce(function (acc, filter) {
762
+ var _a;
763
+ var _b, _c, _d, _e;
764
+ var key = filter.background ? 'bgfilter' : 'filter';
765
+ acc[key] = acc[key] || [];
766
+ var value = filter.type === 'range' &&
767
+ !isNaN((_b = filter.value) === null || _b === void 0 ? void 0 : _b.low) &&
768
+ !isNaN((_c = filter.value) === null || _c === void 0 ? void 0 : _c.low)
769
+ ? ["low=".concat((_d = filter.value) === null || _d === void 0 ? void 0 : _d.low), "high=".concat((_e = filter.value) === null || _e === void 0 ? void 0 : _e.high)]
770
+ : ["".concat(filter.value)];
771
+ var existing = acc[key].find(function (item) { return item.field === filter.field; });
772
+ if (existing && !existing.value.includes(value[0])) {
773
+ (_a = existing.value).push.apply(_a, value);
774
+ }
775
+ else {
776
+ acc[key].push({
777
+ field: filter.field,
778
+ value: value,
779
+ });
780
+ }
781
+ return acc;
782
+ }, {});
783
+ return __assign(__assign({ q: ((_d = (_c = params.search) === null || _c === void 0 ? void 0 : _c.query) === null || _d === void 0 ? void 0 : _d.string) || '', correctedQuery: (_e = params.search) === null || _e === void 0 ? void 0 : _e.originalQuery }, filters), { sort: [
784
+ {
785
+ field: (_f = store.sorting.current) === null || _f === void 0 ? void 0 : _f.field,
786
+ dir: (_g = store.sorting.current) === null || _g === void 0 ? void 0 : _g.direction,
787
+ },
788
+ ], pagination: {
789
+ totalResults: store.pagination.totalResults,
790
+ page: store.pagination.page,
791
+ resultsPerPage: store.pagination.pageSize,
792
+ }, merchandising: {
793
+ personalized: store.merchandising.personalized,
794
+ redirect: store.merchandising.redirect,
795
+ triggeredCampaigns: (((_h = store.merchandising.campaigns) === null || _h === void 0 ? void 0 : _h.length) &&
796
+ ((_j = store.merchandising.campaigns) === null || _j === void 0 ? void 0 : _j.map(function (campaign) {
797
+ var experiement = store.merchandising.experiments.find(function (experiment) { return experiment.campaignId === campaign.id; });
798
+ return {
799
+ id: campaign.id,
800
+ experimentId: experiement === null || experiement === void 0 ? void 0 : experiement.experimentId,
801
+ variationId: experiement === null || experiement === void 0 ? void 0 : experiement.variationId,
802
+ };
803
+ }))) ||
804
+ undefined,
805
+ }, results: (results === null || results === void 0 ? void 0 : results.map(function (result) {
806
+ var core = result.mappings.core;
807
+ return {
808
+ uid: core.uid || '',
809
+ // childUid: core.uid,
810
+ sku: core.sku,
811
+ // childSku: core.sku,
812
+ };
813
+ })) || [] });
814
+ }
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { StorageStore } from '@searchspring/snap-store-mobx';
2
+ import { StorageStore, Product, Banner } from '@searchspring/snap-store-mobx';
3
3
  import { AbstractController } from '../Abstract/AbstractController';
4
4
  import { ControllerTypes } from '../types';
5
5
  import { AutocompleteStore } from '@searchspring/snap-store-mobx';
@@ -8,14 +8,26 @@ import type { AutocompleteRequestModel } from '@searchspring/snapi-types';
8
8
  export declare const INPUT_DELAY = 200;
9
9
  type AutocompleteTrackMethods = {
10
10
  product: {
11
- click: (e: MouseEvent, result: any) => void;
11
+ clickThrough: (e: MouseEvent, result: Product) => void;
12
+ click: (e: MouseEvent, result: Product | Banner) => void;
13
+ render: (result: Product) => void;
14
+ impression: (result: Product) => void;
15
+ addToCart: (results: Product) => void;
12
16
  };
17
+ redirect: (redirectURL: string) => void;
13
18
  };
14
19
  export declare class AutocompleteController extends AbstractController {
15
20
  type: ControllerTypes;
16
21
  store: AutocompleteStore;
17
22
  config: AutocompleteControllerConfig;
18
23
  storage: StorageStore;
24
+ events: {
25
+ product: Record<string, {
26
+ clickThrough?: boolean;
27
+ impression?: boolean;
28
+ render?: boolean;
29
+ }>;
30
+ };
19
31
  constructor(config: AutocompleteControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
20
32
  track: AutocompleteTrackMethods;
21
33
  get params(): AutocompleteRequestModel;
@@ -39,6 +51,7 @@ export declare class AutocompleteController extends AbstractController {
39
51
  bind(): Promise<void>;
40
52
  searchTrending: () => Promise<void>;
41
53
  search: () => Promise<void>;
54
+ addToCart: (product: Product) => Promise<void>;
42
55
  }
43
56
  export {};
44
57
  //# sourceMappingURL=AutocompleteController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAiC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAElI,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AA+B/B,KAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAyD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBAyDL,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CA0I9B;CACF"}
1
+ {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,OAAO,EAAqB,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5G,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAiC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAElI,OAAO,KAAK,EAAE,wBAAwB,EAAgE,MAAM,2BAA2B,CAAC;AAWxI,eAAO,MAAM,WAAW,MAAM,CAAC;AA+B/B,KAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACtC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;IAE7B,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CACd,MAAM,EACN;YACC,YAAY,CAAC,EAAE,OAAO,CAAC;YACvB,UAAU,CAAC,EAAE,OAAO,CAAC;YACrB,MAAM,CAAC,EAAE,OAAO,CAAC;SACjB,CACD,CAAC;KACF,CAEC;gBAGD,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA0D3B,KAAK,EAAE,wBAAwB,CAqD7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CAwCrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBAyDL,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6I9B;IAEF,SAAS,YAAmB,OAAO,KAAG,QAAQ,IAAI,CAAC,CAGjD;CACF"}