@searchspring/snap-controller 0.72.2 → 0.73.6

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 (25) hide show
  1. package/dist/cjs/Autocomplete/AutocompleteController.d.ts +13 -13
  2. package/dist/cjs/Autocomplete/AutocompleteController.d.ts.map +1 -1
  3. package/dist/cjs/Autocomplete/AutocompleteController.js +152 -149
  4. package/dist/cjs/Recommendation/RecommendationController.d.ts +5 -13
  5. package/dist/cjs/Recommendation/RecommendationController.d.ts.map +1 -1
  6. package/dist/cjs/Recommendation/RecommendationController.js +81 -94
  7. package/dist/cjs/Search/SearchController.d.ts +12 -5
  8. package/dist/cjs/Search/SearchController.d.ts.map +1 -1
  9. package/dist/cjs/Search/SearchController.js +144 -170
  10. package/dist/cjs/utils/isClickWithinBannerLink.d.ts +2 -0
  11. package/dist/cjs/utils/isClickWithinBannerLink.d.ts.map +1 -0
  12. package/dist/cjs/utils/isClickWithinBannerLink.js +21 -0
  13. package/dist/esm/Autocomplete/AutocompleteController.d.ts +13 -13
  14. package/dist/esm/Autocomplete/AutocompleteController.d.ts.map +1 -1
  15. package/dist/esm/Autocomplete/AutocompleteController.js +132 -141
  16. package/dist/esm/Recommendation/RecommendationController.d.ts +5 -13
  17. package/dist/esm/Recommendation/RecommendationController.d.ts.map +1 -1
  18. package/dist/esm/Recommendation/RecommendationController.js +72 -82
  19. package/dist/esm/Search/SearchController.d.ts +12 -5
  20. package/dist/esm/Search/SearchController.d.ts.map +1 -1
  21. package/dist/esm/Search/SearchController.js +128 -167
  22. package/dist/esm/utils/isClickWithinBannerLink.d.ts +2 -0
  23. package/dist/esm/utils/isClickWithinBannerLink.d.ts.map +1 -0
  24. package/dist/esm/utils/isClickWithinBannerLink.js +17 -0
  25. package/package.json +10 -10
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { StorageStore, Product, Banner } from '@searchspring/snap-store-mobx';
2
+ import { StorageStore, Product, Banner, MerchandisingContentBanner } 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';
@@ -7,14 +7,21 @@ import type { AutocompleteControllerConfig, ControllerServices, ContextVariables
7
7
  import type { AutocompleteRequestModel } from '@searchspring/snapi-types';
8
8
  export declare const INPUT_DELAY = 200;
9
9
  type AutocompleteTrackMethods = {
10
+ banner: {
11
+ click: (e: MouseEvent, merchandisingBanner: MerchandisingContentBanner) => void;
12
+ clickThrough: (e: MouseEvent, merchandisingBanner: MerchandisingContentBanner) => void;
13
+ impression: (merchandisingBanner: MerchandisingContentBanner) => void;
14
+ };
10
15
  product: {
11
- clickThrough: (e: MouseEvent, result: Product) => void;
16
+ clickThrough: (e: MouseEvent, result: Product | Banner) => void;
12
17
  click: (e: MouseEvent, result: Product | Banner) => void;
13
- render: (result: Product) => void;
14
- impression: (result: Product) => void;
18
+ impression: (result: Product | Banner) => void;
15
19
  addToCart: (results: Product) => void;
16
20
  };
17
- redirect: (redirectURL: string) => void;
21
+ redirect: ({ redirectURL, responseId }: {
22
+ redirectURL: string;
23
+ responseId: string;
24
+ }) => void;
18
25
  };
19
26
  export declare class AutocompleteController extends AbstractController {
20
27
  type: ControllerTypes;
@@ -22,14 +29,7 @@ export declare class AutocompleteController extends AbstractController {
22
29
  config: AutocompleteControllerConfig;
23
30
  storage: StorageStore;
24
31
  private lastSearchQuery;
25
- events: {
26
- product: Record<string, {
27
- click?: boolean;
28
- clickThrough?: boolean;
29
- impression?: boolean;
30
- render?: boolean;
31
- }>;
32
- };
32
+ private events;
33
33
  constructor(config: AutocompleteControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
34
34
  track: AutocompleteTrackMethods;
35
35
  get params(): AutocompleteRequestModel;
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACzF,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,EAA6C,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9I,OAAO,KAAK,EAAE,wBAAwB,EAAgE,MAAM,2BAA2B,CAAC;AAexI,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;IAC7B,OAAO,CAAC,eAAe,CAAqB;IAE5C,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CACd,MAAM,EACN;YACC,KAAK,CAAC,EAAE,OAAO,CAAC;YAChB,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;IAsF3B,KAAK,EAAE,wBAAwB,CA0D7B;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;wBAiDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCA+ChD,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,CAyJ9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAQ/D;CACF"}
1
+ {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACrH,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,EAA6C,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9I,OAAO,KAAK,EAAE,wBAAwB,EAA4C,MAAM,2BAA2B,CAAC;AAkBpH,eAAO,MAAM,WAAW,MAAM,CAAC;AA+B/B,KAAK,wBAAwB,GAAG;IAC/B,MAAM,EAAE;QACP,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;QAChF,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;QACvF,UAAU,EAAE,CAAC,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;KACtE,CAAC;IACF,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QAChE,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7F,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;IAC7B,OAAO,CAAC,eAAe,CAAqB;IAE5C,OAAO,CAAC,MAAM,CAgBP;gBAGN,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;IAwE3B,KAAK,EAAE,wBAAwB,CAwI7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CAkDrC;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;wBAiDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCA+ChD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBA0DL,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,CA+J9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAQ/D;CACF"}
@@ -71,8 +71,8 @@ var snap_store_mobx_1 = require("@searchspring/snap-store-mobx");
71
71
  var AbstractController_1 = require("../Abstract/AbstractController");
72
72
  var getParams_1 = require("../utils/getParams");
73
73
  var types_1 = require("../types");
74
- var beacon_1 = require("@searchspring/beacon");
75
74
  var isClickWithinProductLink_1 = require("../utils/isClickWithinProductLink");
75
+ var isClickWithinBannerLink_1 = require("../utils/isClickWithinBannerLink");
76
76
  var INPUT_ATTRIBUTE = 'ss-autocomplete-input';
77
77
  exports.INPUT_DELAY = 200;
78
78
  var KEY_ENTER = 13;
@@ -109,69 +109,150 @@ var AutocompleteController = /** @class */ (function (_super) {
109
109
  var client = _a.client, store = _a.store, urlManager = _a.urlManager, eventManager = _a.eventManager, profiler = _a.profiler, logger = _a.logger, tracker = _a.tracker;
110
110
  var _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
111
111
  _this.type = types_1.ControllerTypes.autocomplete;
112
- _this.events = {
113
- product: {},
114
- };
112
+ _this.events = {};
115
113
  _this.track = {
114
+ banner: {
115
+ impression: function (_banner) {
116
+ var _a, _b, _c, _d;
117
+ var responseId = _banner.responseId, uid = _banner.uid;
118
+ if ((_c = (_b = (_a = _this.events[responseId]) === null || _a === void 0 ? void 0 : _a.banner) === null || _b === void 0 ? void 0 : _b[uid]) === null || _c === void 0 ? void 0 : _c.impression) {
119
+ return;
120
+ }
121
+ var banner = { uid: uid };
122
+ var data = {
123
+ responseId: responseId,
124
+ banners: [banner],
125
+ results: [],
126
+ };
127
+ _this.eventManager.fire('track.banner.impression', { controller: _this, product: { uid: uid }, trackEvent: data });
128
+ _this.tracker.events.autocomplete.impression({ data: data, siteId: (_d = _this.config.globals) === null || _d === void 0 ? void 0 : _d.siteId });
129
+ _this.events[responseId].banner[uid] = _this.events[responseId].banner[uid] || {};
130
+ _this.events[responseId].banner[uid].impression = true;
131
+ },
132
+ click: function (e, banner) {
133
+ var _a, _b, _c;
134
+ var responseId = banner.responseId, uid = banner.uid;
135
+ if ((0, isClickWithinBannerLink_1.isClickWithinBannerLink)(e)) {
136
+ if ((_c = (_b = (_a = _this.events) === null || _a === void 0 ? void 0 : _a[responseId]) === null || _b === void 0 ? void 0 : _b.banner[uid]) === null || _c === void 0 ? void 0 : _c.clickThrough) {
137
+ return;
138
+ }
139
+ _this.track.banner.clickThrough(e, banner);
140
+ _this.events[responseId].banner[uid] = _this.events[responseId].banner[uid] || {};
141
+ _this.events[responseId].banner[uid].clickThrough = true;
142
+ setTimeout(function () {
143
+ _this.events[responseId].banner[uid].clickThrough = false;
144
+ }, isClickWithinProductLink_1.CLICK_DUPLICATION_TIMEOUT);
145
+ }
146
+ },
147
+ clickThrough: function (e, _a) {
148
+ var _b;
149
+ var uid = _a.uid, responseId = _a.responseId;
150
+ var banner = { uid: uid };
151
+ var data = {
152
+ responseId: responseId,
153
+ banners: [banner],
154
+ };
155
+ _this.eventManager.fire('track.banner.clickThrough', { controller: _this, event: e, product: { uid: uid }, trackEvent: data });
156
+ _this.tracker.events.autocomplete.clickThrough({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
157
+ _this.events[responseId].banner[uid] = _this.events[responseId].banner[uid] || {};
158
+ _this.events[responseId].banner[uid].clickThrough = true;
159
+ setTimeout(function () {
160
+ _this.events[responseId].banner[uid].clickThrough = false;
161
+ }, isClickWithinProductLink_1.CLICK_DUPLICATION_TIMEOUT);
162
+ },
163
+ },
116
164
  product: {
117
165
  clickThrough: function (e, result) {
118
166
  var _a, _b;
119
- if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.clickThrough) {
120
- return;
121
- }
122
- var data = getAutocompleteSchemaData({ params: _this.params, store: _this.store, results: [result] });
167
+ var responseId = result.responseId;
168
+ var item = {
169
+ type: result.type,
170
+ uid: result.id,
171
+ parentId: result.id,
172
+ sku: (_a = result.mappings.core) === null || _a === void 0 ? void 0 : _a.sku,
173
+ };
174
+ var data = {
175
+ responseId: responseId,
176
+ results: [item],
177
+ };
123
178
  _this.eventManager.fire('track.product.clickThrough', { controller: _this, event: e, product: result, trackEvent: data });
124
179
  _this.tracker.events.autocomplete.clickThrough({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
125
- _this.events.product[result.id] = _this.events.product[result.id] || {};
126
- _this.events.product[result.id].clickThrough = true;
127
180
  },
128
181
  click: function (e, result) {
129
- var _a;
130
- if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.click) {
131
- return;
182
+ var _a, _b, _c, _d, _e, _f;
183
+ var responseId = result.responseId;
184
+ if (result.type === 'banner' && (0, isClickWithinBannerLink_1.isClickWithinBannerLink)(e)) {
185
+ if ((_c = (_b = (_a = _this.events) === null || _a === void 0 ? void 0 : _a[responseId]) === null || _b === void 0 ? void 0 : _b.product[result.id]) === null || _c === void 0 ? void 0 : _c.inlineBannerClickThrough) {
186
+ return;
187
+ }
188
+ _this.track.product.clickThrough(e, result);
189
+ _this.events[responseId].product[result.id] = _this.events[responseId].product[result.id] || {};
190
+ _this.events[responseId].product[result.id].inlineBannerClickThrough = true;
191
+ setTimeout(function () {
192
+ _this.events[responseId].product[result.id].inlineBannerClickThrough = false;
193
+ }, isClickWithinProductLink_1.CLICK_DUPLICATION_TIMEOUT);
132
194
  }
133
- if (result.type === 'banner') {
134
- return;
195
+ else if ((0, isClickWithinProductLink_1.isClickWithinProductLink)(e, result)) {
196
+ if ((_f = (_e = (_d = _this.events) === null || _d === void 0 ? void 0 : _d[responseId]) === null || _e === void 0 ? void 0 : _e.product[result.id]) === null || _f === void 0 ? void 0 : _f.productClickThrough) {
197
+ return;
198
+ }
199
+ _this.track.product.clickThrough(e, result);
200
+ _this.events[responseId].product[result.id] = _this.events[responseId].product[result.id] || {};
201
+ _this.events[responseId].product[result.id].productClickThrough = true;
202
+ setTimeout(function () {
203
+ _this.events[responseId].product[result.id].productClickThrough = false;
204
+ }, isClickWithinProductLink_1.CLICK_DUPLICATION_TIMEOUT);
135
205
  }
136
- (0, isClickWithinProductLink_1.isClickWithinProductLink)(e, result) && _this.track.product.clickThrough(e, result);
137
- _this.events.product[result.id] = _this.events.product[result.id] || {};
138
- _this.events.product[result.id].click = true;
139
- setTimeout(function () {
140
- _this.events.product[result.id].click = false;
141
- }, isClickWithinProductLink_1.CLICK_DUPLICATION_TIMEOUT);
142
- },
143
- render: function (result) {
144
- var _a, _b;
145
- if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.render)
146
- return;
147
- var data = getAutocompleteSchemaData({ params: _this.params, store: _this.store, results: result ? [result] : [] });
148
- _this.eventManager.fire('track.product.render', { controller: _this, product: result, trackEvent: data });
149
- _this.tracker.events.autocomplete.render({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
150
- _this.events.product[result.id] = _this.events.product[result.id] || {};
151
- _this.events.product[result.id].render = true;
152
206
  },
153
207
  impression: function (result) {
154
- var _a, _b, _c;
155
- if (((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.impression) || !((_b = _this.events.product[result.id]) === null || _b === void 0 ? void 0 : _b.render))
208
+ var _a, _b, _c, _d, _e;
209
+ var responseId = result.responseId;
210
+ if ((_c = (_b = (_a = _this.events) === null || _a === void 0 ? void 0 : _a[responseId]) === null || _b === void 0 ? void 0 : _b.product[result.id]) === null || _c === void 0 ? void 0 : _c.impression) {
156
211
  return;
157
- var data = getAutocompleteSchemaData({ params: _this.params, store: _this.store, results: [result] });
212
+ }
213
+ var item = {
214
+ type: result.type,
215
+ uid: result.id,
216
+ parentId: result.id,
217
+ sku: (_d = result.mappings.core) === null || _d === void 0 ? void 0 : _d.sku,
218
+ };
219
+ var data = {
220
+ responseId: responseId,
221
+ results: [item],
222
+ banners: [],
223
+ };
158
224
  _this.eventManager.fire('track.product.impression', { controller: _this, product: result, trackEvent: data });
159
- _this.tracker.events.autocomplete.impression({ data: data, siteId: (_c = _this.config.globals) === null || _c === void 0 ? void 0 : _c.siteId });
160
- _this.events.product[result.id] = _this.events.product[result.id] || {};
161
- _this.events.product[result.id].impression = true;
225
+ _this.tracker.events.autocomplete.impression({ data: data, siteId: (_e = _this.config.globals) === null || _e === void 0 ? void 0 : _e.siteId });
226
+ _this.events[responseId].product[result.id] = _this.events[responseId].product[result.id] || {};
227
+ _this.events[responseId].product[result.id].impression = true;
162
228
  },
163
229
  addToCart: function (result) {
164
- var _a;
165
- var data = getAutocompleteAddtocartSchemaData({ params: _this.params, store: _this.store, results: [result] });
230
+ var _a, _b, _c;
231
+ var responseId = result.responseId;
232
+ var product = {
233
+ parentId: result.id,
234
+ uid: result.id,
235
+ sku: (_a = result.mappings.core) === null || _a === void 0 ? void 0 : _a.sku,
236
+ qty: result.quantity || 1,
237
+ price: Number((_b = result.mappings.core) === null || _b === void 0 ? void 0 : _b.price),
238
+ };
239
+ var data = {
240
+ responseId: responseId,
241
+ results: [product],
242
+ };
166
243
  _this.eventManager.fire('track.product.addToCart', { controller: _this, product: result, trackEvent: data });
167
- _this.tracker.events.autocomplete.addToCart({ data: data, siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
244
+ _this.tracker.events.autocomplete.addToCart({ data: data, siteId: (_c = _this.config.globals) === null || _c === void 0 ? void 0 : _c.siteId });
168
245
  },
169
246
  },
170
- redirect: function (redirectURL) {
171
- var _a;
172
- var data = getAutocompleteRedirectSchemaData({ redirectURL: redirectURL });
247
+ redirect: function (_a) {
248
+ var _b;
249
+ var redirectURL = _a.redirectURL, responseId = _a.responseId;
250
+ var data = {
251
+ responseId: responseId,
252
+ redirect: redirectURL,
253
+ };
173
254
  _this.eventManager.fire('track.redirect', { controller: _this, redirectURL: redirectURL, trackEvent: data });
174
- _this.tracker.events.autocomplete.redirect({ data: data, siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
255
+ _this.tracker.events.autocomplete.redirect({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
175
256
  },
176
257
  };
177
258
  _this.handlers = {
@@ -350,6 +431,7 @@ var AutocompleteController = /** @class */ (function (_super) {
350
431
  if (((!_this.store.state.input && !value) || _this.store.state.input == value) && _this.store.loaded) {
351
432
  return;
352
433
  }
434
+ _this.store.state.source = 'input';
353
435
  _this.store.state.input = value;
354
436
  // remove merch redirect to prevent race condition
355
437
  _this.store.merchandising.redirect = '';
@@ -433,7 +515,7 @@ var AutocompleteController = /** @class */ (function (_super) {
433
515
  });
434
516
  }); };
435
517
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
436
- var params, err_3, searchProfile, _a, meta, response, impressedResultIds, afterSearchProfile, err_4, afterStoreProfile, err_5, err_6;
518
+ var params, err_3, searchProfile, _a, meta, response, responseId_1, impressedResultIds, afterSearchProfile, err_4, afterStoreProfile, err_5, err_6;
437
519
  var _this = this;
438
520
  var _b, _c, _d, _e;
439
521
  return __generator(this, function (_f) {
@@ -491,17 +573,20 @@ var AutocompleteController = /** @class */ (function (_super) {
491
573
  }
492
574
  searchProfile.stop();
493
575
  this.log.profile(searchProfile);
576
+ responseId_1 = response.tracking.responseId;
577
+ this.events[responseId_1] = this.events[responseId_1] || { product: {}, banner: {} };
494
578
  if (((_d = response.search) === null || _d === void 0 ? void 0 : _d.query) === this.lastSearchQuery) {
495
- impressedResultIds = Object.keys(this.events.product).filter(function (resultId) { var _a; return (_a = _this.events.product[resultId]) === null || _a === void 0 ? void 0 : _a.impression; });
496
- this.events = {
579
+ impressedResultIds = Object.keys(this.events[responseId_1].product || {}).filter(function (resultId) { var _a, _b; return (_b = (_a = _this.events[responseId_1].product) === null || _a === void 0 ? void 0 : _a[resultId]) === null || _b === void 0 ? void 0 : _b.impression; });
580
+ this.events[responseId_1] = {
497
581
  product: impressedResultIds.reduce(function (acc, resultId) {
498
582
  acc[resultId] = { impression: true };
499
583
  return acc;
500
584
  }, {}),
585
+ banner: this.events[responseId_1].banner,
501
586
  };
502
587
  }
503
588
  else {
504
- this.events = { product: {} };
589
+ this.events[responseId_1] = { product: {}, banner: {} };
505
590
  this.lastSearchQuery = (_e = response.search) === null || _e === void 0 ? void 0 : _e.query;
506
591
  }
507
592
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
@@ -640,8 +725,7 @@ var AutocompleteController = /** @class */ (function (_super) {
640
725
  key: "ss-controller-".concat(_this.config.id),
641
726
  });
642
727
  _this.eventManager.on('afterStore', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
643
- var controller, products, data;
644
- var _this = this;
728
+ var controller, responseId, data;
645
729
  var _a;
646
730
  return __generator(this, function (_b) {
647
731
  switch (_b.label) {
@@ -649,22 +733,10 @@ var AutocompleteController = /** @class */ (function (_super) {
649
733
  case 1:
650
734
  _b.sent();
651
735
  controller = search.controller;
736
+ responseId = search.response.tracking.responseId;
652
737
  if (controller.store.loaded && !controller.store.error) {
653
- products = controller.store.results.filter(function (result) { return result.type === 'product'; });
654
- if (products.length === 0 && !search.response._cached) {
655
- data = getAutocompleteSchemaData({ params: search.request, store: this.store });
656
- this.eventManager.fire('track.product.render', { controller: this, trackEvent: data });
657
- this.tracker.events.autocomplete.render({ data: data, siteId: (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
658
- }
659
- products.forEach(function (result) {
660
- if (!search.response._cached) {
661
- _this.track.product.render(result);
662
- }
663
- else {
664
- _this.events.product[result.id] = _this.events.product[result.id] || {};
665
- _this.events.product[result.id].render = true;
666
- }
667
- });
738
+ data = { responseId: responseId };
739
+ this.tracker.events.autocomplete.render({ data: data, siteId: (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
668
740
  }
669
741
  return [2 /*return*/];
670
742
  }
@@ -688,26 +760,26 @@ var AutocompleteController = /** @class */ (function (_super) {
688
760
  }); });
689
761
  _this.eventManager.on('beforeSubmit', function (ac, next) { return __awaiter(_this, void 0, void 0, function () {
690
762
  var loading, inputState, redirectURL, results, filteredResults, singleResultUrl;
691
- var _a, _b, _c, _d, _e, _f, _g, _h;
692
- return __generator(this, function (_j) {
693
- switch (_j.label) {
763
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
764
+ return __generator(this, function (_k) {
765
+ switch (_k.label) {
694
766
  case 0: return [4 /*yield*/, next()];
695
767
  case 1:
696
- _j.sent();
768
+ _k.sent();
697
769
  loading = ac.controller.store.loading;
698
770
  if (loading)
699
771
  return [2 /*return*/];
700
772
  inputState = ac.controller.store.state.input;
701
773
  redirectURL = (_a = ac.controller.store.merchandising) === null || _a === void 0 ? void 0 : _a.redirect;
702
774
  if (((_d = (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.settings) === null || _c === void 0 ? void 0 : _c.redirects) === null || _d === void 0 ? void 0 : _d.merchandising) && inputState && redirectURL) {
703
- this.track.redirect(redirectURL);
775
+ this.track.redirect({ redirectURL: redirectURL, responseId: (_e = ac.controller.store.merchandising) === null || _e === void 0 ? void 0 : _e.responseId });
704
776
  window.location.href = redirectURL;
705
777
  return [2 /*return*/, false];
706
778
  }
707
- if ((_g = (_f = (_e = this.config) === null || _e === void 0 ? void 0 : _e.settings) === null || _f === void 0 ? void 0 : _f.redirects) === null || _g === void 0 ? void 0 : _g.singleResult) {
779
+ if ((_h = (_g = (_f = this.config) === null || _f === void 0 ? void 0 : _f.settings) === null || _g === void 0 ? void 0 : _g.redirects) === null || _h === void 0 ? void 0 : _h.singleResult) {
708
780
  results = ac.controller.store.results;
709
781
  filteredResults = results.filter(function (result) { return result.type == 'product'; });
710
- singleResultUrl = filteredResults.length === 1 && ((_h = filteredResults[0].mappings.core) === null || _h === void 0 ? void 0 : _h.url);
782
+ singleResultUrl = filteredResults.length === 1 && ((_j = filteredResults[0].mappings.core) === null || _j === void 0 ? void 0 : _j.url);
711
783
  if (singleResultUrl) {
712
784
  window.location.href = singleResultUrl;
713
785
  return [2 /*return*/, false];
@@ -738,6 +810,14 @@ var AutocompleteController = /** @class */ (function (_super) {
738
810
  if (pageLoadId) {
739
811
  params.tracking.pageLoadId = pageLoadId;
740
812
  }
813
+ if (this.store.state.input) {
814
+ params.search = params.search || {};
815
+ params.search.input = this.store.state.input;
816
+ }
817
+ if (this.store.state.source) {
818
+ params.search = params.search || {};
819
+ params.search.source = this.store.state.source;
820
+ }
741
821
  if (!((_b = (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.personalization) === null || _b === void 0 ? void 0 : _b.disabled)) {
742
822
  var cartItems = this.tracker.cookies.cart.get();
743
823
  if (cartItems.length) {
@@ -966,80 +1046,3 @@ function unbindFormParameters(form, fn) {
966
1046
  }
967
1047
  }
968
1048
  }
969
- function getAutocompleteRedirectSchemaData(_a) {
970
- var redirectURL = _a.redirectURL;
971
- return {
972
- redirect: redirectURL,
973
- };
974
- }
975
- function getAutocompleteAddtocartSchemaData(_a) {
976
- var params = _a.params, store = _a.store, results = _a.results;
977
- var base = getAutocompleteSchemaData({ params: params, store: store, results: results });
978
- return __assign(__assign({}, base), { results: (results === null || results === void 0 ? void 0 : results.map(function (result) {
979
- var core = result.mappings.core;
980
- return {
981
- uid: core.uid || '',
982
- sku: core.sku,
983
- price: Number(core.price),
984
- qty: result.quantity || 1,
985
- };
986
- })) || [] });
987
- }
988
- function getAutocompleteSchemaData(_a) {
989
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
990
- var params = _a.params, store = _a.store, results = _a.results;
991
- var filters = (_b = params.filters) === null || _b === void 0 ? void 0 : _b.reduce(function (acc, filter) {
992
- var _a;
993
- var _b, _c, _d, _e;
994
- var key = filter.background ? 'bgfilter' : 'filter';
995
- acc[key] = acc[key] || [];
996
- var value = filter.type === 'range' &&
997
- !isNaN((_b = filter.value) === null || _b === void 0 ? void 0 : _b.low) &&
998
- !isNaN((_c = filter.value) === null || _c === void 0 ? void 0 : _c.high)
999
- ? ["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)]
1000
- : ["".concat(filter.value)];
1001
- var existing = acc[key].find(function (item) { return item.field === filter.field; });
1002
- if (existing && !existing.value.includes(value[0])) {
1003
- (_a = existing.value).push.apply(_a, value);
1004
- }
1005
- else {
1006
- acc[key].push({
1007
- field: filter.field,
1008
- value: value,
1009
- });
1010
- }
1011
- return acc;
1012
- }, {});
1013
- return __assign(__assign({ q: ((_d = (_c = store.search) === null || _c === void 0 ? void 0 : _c.originalQuery) === null || _d === void 0 ? void 0 : _d.string) || ((_f = (_e = store.search) === null || _e === void 0 ? void 0 : _e.query) === null || _f === void 0 ? void 0 : _f.string) || '', rq: ((_g = params.search) === null || _g === void 0 ? void 0 : _g.subQuery) ? (_h = params.search) === null || _h === void 0 ? void 0 : _h.subQuery : undefined, correctedQuery: ((_k = (_j = store.search) === null || _j === void 0 ? void 0 : _j.originalQuery) === null || _k === void 0 ? void 0 : _k.string) ? (_m = (_l = store.search) === null || _l === void 0 ? void 0 : _l.query) === null || _m === void 0 ? void 0 : _m.string : undefined, matchType: store.search.matchType }, filters), { sort: (_o = params.sorts) === null || _o === void 0 ? void 0 : _o.map(function (sort) {
1014
- return {
1015
- field: sort.field,
1016
- dir: sort.direction,
1017
- };
1018
- }), pagination: {
1019
- totalResults: store.pagination.totalResults,
1020
- page: store.pagination.page,
1021
- resultsPerPage: store.pagination.pageSize,
1022
- }, merchandising: {
1023
- personalized: store.merchandising.personalized,
1024
- redirect: store.merchandising.redirect,
1025
- triggeredCampaigns: (((_p = store.merchandising.campaigns) === null || _p === void 0 ? void 0 : _p.length) &&
1026
- ((_q = store.merchandising.campaigns) === null || _q === void 0 ? void 0 : _q.map(function (campaign) {
1027
- var experiement = store.merchandising.experiments.find(function (experiment) { return experiment.campaignId === campaign.id; });
1028
- return {
1029
- id: campaign.id,
1030
- experimentId: experiement === null || experiement === void 0 ? void 0 : experiement.experimentId,
1031
- variationId: experiement === null || experiement === void 0 ? void 0 : experiement.variationId,
1032
- };
1033
- }))) ||
1034
- undefined,
1035
- }, banners: [], results: (results === null || results === void 0 ? void 0 : results.map(function (result) {
1036
- var core = result.mappings.core;
1037
- var position = result.position;
1038
- return {
1039
- type: beacon_1.ItemTypeEnum.Product,
1040
- position: position,
1041
- uid: core.uid || '',
1042
- sku: core.sku,
1043
- };
1044
- })) || [] });
1045
- }
@@ -1,15 +1,14 @@
1
1
  import { Product } from '@searchspring/snap-store-mobx';
2
2
  import { AbstractController } from '../Abstract/AbstractController';
3
3
  import { ControllerTypes } from '../types';
4
- import type { RecommendationStore } from '@searchspring/snap-store-mobx';
4
+ import type { Banner, RecommendationStore } from '@searchspring/snap-store-mobx';
5
5
  import type { RecommendRequestModel } from '@searchspring/snap-client';
6
6
  import type { RecommendationControllerConfig, ControllerServices, ContextVariables } from '../types';
7
7
  type RecommendationTrackMethods = {
8
8
  product: {
9
- clickThrough: (e: MouseEvent, result: Product) => void;
10
- click: (e: MouseEvent, result: Product) => void;
11
- render: (result: Product) => void;
12
- impression: (result: Product) => void;
9
+ clickThrough: (e: MouseEvent, result: Product | Banner) => void;
10
+ click: (e: MouseEvent, result: Product | Banner) => void;
11
+ impression: (result: Product | Banner) => void;
13
12
  addToCart: (result: Product) => void;
14
13
  };
15
14
  };
@@ -17,14 +16,7 @@ export declare class RecommendationController extends AbstractController {
17
16
  type: ControllerTypes;
18
17
  store: RecommendationStore;
19
18
  config: RecommendationControllerConfig;
20
- events: {
21
- product: Record<string, {
22
- click?: boolean;
23
- clickThrough?: boolean;
24
- impression?: boolean;
25
- render?: boolean;
26
- }>;
27
- };
19
+ private events;
28
20
  constructor(config: RecommendationControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
29
21
  track: RecommendationTrackMethods;
30
22
  get params(): RecommendRequestModel;
@@ -1 +1 @@
1
- {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAQ3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,gBAAgB,EAAiB,MAAM,UAAU,CAAC;AAIpH,KAAK,0BAA0B,GAAG;IACjC,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,KAAK,IAAI,CAAC;QAChD,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACtC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;KACrC,CAAC;CACF,CAAC;AAUF,qBAAa,wBAAyB,SAAQ,kBAAkB;IACxD,IAAI,kBAAkC;IACrC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,8BAA8B,CAAC;IAE/C,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CACd,MAAM,EACN;YACC,KAAK,CAAC,EAAE,OAAO,CAAC;YAChB,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,8BAA8B,EACtC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAgE3B,KAAK,EAAE,0BAA0B,CAuD/B;IAEF,IAAI,MAAM,IAAI,qBAAqB,CA4BlC;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6H9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAQ/D;CACF"}
1
+ {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAW3C,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,gBAAgB,EAAiB,MAAM,UAAU,CAAC;AAIpH,KAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QAChE,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QAC/C,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;KACrC,CAAC;CACF,CAAC;AAUF,qBAAa,wBAAyB,SAAQ,kBAAkB;IACxD,IAAI,kBAAkC;IACrC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,8BAA8B,CAAC;IAE/C,OAAO,CAAC,MAAM,CAUP;gBAGN,MAAM,EAAE,8BAA8B,EACtC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAkD3B,KAAK,EAAE,0BAA0B,CAqF/B;IAEF,IAAI,MAAM,IAAI,qBAAqB,CA4BlC;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6H9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAQ/D;CACF"}