@athoscommerce/snap-store-mobx 1.2.3-beta.4 → 1.2.3-beta.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 (93) hide show
  1. package/dist/cjs/Autocomplete/AutocompleteStore.d.ts +1 -1
  2. package/dist/cjs/Autocomplete/AutocompleteStore.d.ts.map +1 -1
  3. package/dist/cjs/Autocomplete/AutocompleteStore.js +8 -5
  4. package/dist/cjs/Autocomplete/Stores/AutocompleteFacetStore.d.ts.map +1 -1
  5. package/dist/cjs/Autocomplete/Stores/AutocompleteFacetStore.js +1 -2
  6. package/dist/cjs/Chat/ChatStore.d.ts +35 -6
  7. package/dist/cjs/Chat/ChatStore.d.ts.map +1 -1
  8. package/dist/cjs/Chat/ChatStore.js +201 -77
  9. package/dist/cjs/Chat/Stores/ChatAttachmentStore.d.ts.map +1 -1
  10. package/dist/cjs/Chat/Stores/ChatAttachmentStore.js +3 -3
  11. package/dist/cjs/Chat/Stores/ChatCompareStore.d.ts +2 -0
  12. package/dist/cjs/Chat/Stores/ChatCompareStore.d.ts.map +1 -1
  13. package/dist/cjs/Chat/Stores/ChatCompareStore.js +4 -2
  14. package/dist/cjs/Chat/Stores/ChatSessionStore.d.ts +10 -20
  15. package/dist/cjs/Chat/Stores/ChatSessionStore.d.ts.map +1 -1
  16. package/dist/cjs/Chat/Stores/ChatSessionStore.js +33 -87
  17. package/dist/cjs/Finder/FinderStore.d.ts +1 -1
  18. package/dist/cjs/Finder/FinderStore.d.ts.map +1 -1
  19. package/dist/cjs/Finder/FinderStore.js +3 -3
  20. package/dist/cjs/Finder/Stores/FinderSelectionStore.d.ts +1 -1
  21. package/dist/cjs/Finder/Stores/FinderSelectionStore.d.ts.map +1 -1
  22. package/dist/cjs/ProductQuickView/ProductQuickViewStore.d.ts +21 -0
  23. package/dist/cjs/ProductQuickView/ProductQuickViewStore.d.ts.map +1 -0
  24. package/dist/cjs/ProductQuickView/ProductQuickViewStore.js +69 -0
  25. package/dist/cjs/ProductQuickView/cloneProductForQuickView.d.ts +7 -0
  26. package/dist/cjs/ProductQuickView/cloneProductForQuickView.d.ts.map +1 -0
  27. package/dist/cjs/ProductQuickView/cloneProductForQuickView.js +23 -0
  28. package/dist/cjs/Recommendation/RecommendationStore.d.ts +2 -0
  29. package/dist/cjs/Recommendation/RecommendationStore.d.ts.map +1 -1
  30. package/dist/cjs/Recommendation/RecommendationStore.js +3 -0
  31. package/dist/cjs/Recommendation/Stores/RecommendationProfileStore.js +1 -1
  32. package/dist/cjs/Search/SearchStore.d.ts +1 -1
  33. package/dist/cjs/Search/SearchStore.d.ts.map +1 -1
  34. package/dist/cjs/Search/SearchStore.js +2 -2
  35. package/dist/cjs/Search/Stores/SearchFacetStore.d.ts +12 -12
  36. package/dist/cjs/Search/Stores/SearchFacetStore.d.ts.map +1 -1
  37. package/dist/cjs/Search/Stores/SearchFacetStore.js +25 -32
  38. package/dist/cjs/Search/Stores/SearchHistoryStore.js +2 -2
  39. package/dist/cjs/index.d.ts +4 -2
  40. package/dist/cjs/index.d.ts.map +1 -1
  41. package/dist/cjs/index.js +8 -4
  42. package/dist/cjs/types.d.ts +8 -2
  43. package/dist/cjs/types.d.ts.map +1 -1
  44. package/dist/esm/Autocomplete/AutocompleteStore.d.ts +1 -1
  45. package/dist/esm/Autocomplete/AutocompleteStore.d.ts.map +1 -1
  46. package/dist/esm/Autocomplete/AutocompleteStore.js +5 -3
  47. package/dist/esm/Autocomplete/Stores/AutocompleteFacetStore.d.ts.map +1 -1
  48. package/dist/esm/Autocomplete/Stores/AutocompleteFacetStore.js +4 -6
  49. package/dist/esm/Chat/ChatStore.d.ts +35 -6
  50. package/dist/esm/Chat/ChatStore.d.ts.map +1 -1
  51. package/dist/esm/Chat/ChatStore.js +188 -65
  52. package/dist/esm/Chat/Stores/ChatAttachmentStore.d.ts.map +1 -1
  53. package/dist/esm/Chat/Stores/ChatAttachmentStore.js +3 -3
  54. package/dist/esm/Chat/Stores/ChatCompareStore.d.ts +2 -0
  55. package/dist/esm/Chat/Stores/ChatCompareStore.d.ts.map +1 -1
  56. package/dist/esm/Chat/Stores/ChatCompareStore.js +3 -1
  57. package/dist/esm/Chat/Stores/ChatSessionStore.d.ts +10 -20
  58. package/dist/esm/Chat/Stores/ChatSessionStore.d.ts.map +1 -1
  59. package/dist/esm/Chat/Stores/ChatSessionStore.js +26 -86
  60. package/dist/esm/Finder/FinderStore.d.ts +1 -1
  61. package/dist/esm/Finder/FinderStore.d.ts.map +1 -1
  62. package/dist/esm/Finder/FinderStore.js +1 -1
  63. package/dist/esm/Finder/Stores/FinderSelectionStore.d.ts +1 -1
  64. package/dist/esm/Finder/Stores/FinderSelectionStore.d.ts.map +1 -1
  65. package/dist/esm/ProductQuickView/ProductQuickViewStore.d.ts +21 -0
  66. package/dist/esm/ProductQuickView/ProductQuickViewStore.d.ts.map +1 -0
  67. package/dist/esm/ProductQuickView/ProductQuickViewStore.js +56 -0
  68. package/dist/esm/ProductQuickView/cloneProductForQuickView.d.ts +7 -0
  69. package/dist/esm/ProductQuickView/cloneProductForQuickView.d.ts.map +1 -0
  70. package/dist/esm/ProductQuickView/cloneProductForQuickView.js +19 -0
  71. package/dist/esm/Recommendation/RecommendationStore.d.ts +2 -0
  72. package/dist/esm/Recommendation/RecommendationStore.d.ts.map +1 -1
  73. package/dist/esm/Recommendation/RecommendationStore.js +3 -0
  74. package/dist/esm/Recommendation/Stores/RecommendationProfileStore.js +1 -1
  75. package/dist/esm/Search/SearchStore.d.ts +1 -1
  76. package/dist/esm/Search/SearchStore.d.ts.map +1 -1
  77. package/dist/esm/Search/SearchStore.js +1 -1
  78. package/dist/esm/Search/Stores/SearchFacetStore.d.ts +12 -12
  79. package/dist/esm/Search/Stores/SearchFacetStore.d.ts.map +1 -1
  80. package/dist/esm/Search/Stores/SearchFacetStore.js +25 -31
  81. package/dist/esm/Search/Stores/SearchHistoryStore.js +1 -1
  82. package/dist/esm/index.d.ts +4 -2
  83. package/dist/esm/index.d.ts.map +1 -1
  84. package/dist/esm/index.js +3 -1
  85. package/dist/esm/types.d.ts +8 -2
  86. package/dist/esm/types.d.ts.map +1 -1
  87. package/package.json +11 -6
  88. package/dist/cjs/Storage/StorageStore.d.ts +0 -27
  89. package/dist/cjs/Storage/StorageStore.d.ts.map +0 -1
  90. package/dist/cjs/Storage/StorageStore.js +0 -176
  91. package/dist/esm/Storage/StorageStore.d.ts +0 -27
  92. package/dist/esm/Storage/StorageStore.d.ts.map +0 -1
  93. package/dist/esm/Storage/StorageStore.js +0 -169
@@ -1,7 +1,7 @@
1
1
  import { UrlManager } from '@athoscommerce/snap-url-manager';
2
+ import { StorageStore } from '@athoscommerce/snap-toolbox';
2
3
  import { AbstractStore } from '../Abstract/AbstractStore';
3
4
  import { SearchFilterStore, SearchResultStore, SearchMerchandisingStore, SearchPaginationStore, SearchSortingStore } from '../Search/Stores';
4
- import { StorageStore } from '../Storage/StorageStore';
5
5
  import { AutocompleteStateStore, AutocompleteTermStore, AutocompleteQueryStore, AutocompleteFacetStore, AutocompleteTrendingStore, AutocompleteHistoryStore } from './Stores';
6
6
  import type { AutocompleteResponseModel, MetaResponseModel } from '@athoscommerce/snapi-types';
7
7
  import type { TrendingResponseModel } from '@athoscommerce/snap-client';
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteStore.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,qBAAa,iBAAkB,SAAQ,aAAa,CAAC,uBAAuB,CAAC;IACrE,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,aAAa,EAAG,wBAAwB,CAAC;IACzC,MAAM,EAAG,sBAAsB,CAAC;IAChC,KAAK,EAAG,qBAAqB,CAAC;IAC9B,MAAM,EAAG,sBAAsB,CAAC;IAChC,OAAO,EAAG,iBAAiB,CAAC;IAC5B,OAAO,EAAG,iBAAiB,CAAC;IAC5B,UAAU,EAAG,qBAAqB,CAAC;IACnC,OAAO,EAAG,kBAAkB,CAAC;IAC7B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,OAAO,EAAE,wBAAwB,CAAC;gBAE7B,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa;IAoCpE,IAAI,QAAQ,YAEX;IAEM,KAAK,IAAI,IAAI;IAMb,WAAW,IAAI,IAAI;IA8BnB,UAAU,IAAI,IAAI;IAMlB,gBAAgB,IAAI,IAAI;IAIxB,aAAa,IAAI,IAAI;IAIrB,YAAY,IAAI,IAAI;IAIpB,UAAU,CAAC,IAAI,EAAE,MAAM,aAAa,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAUhE,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAiB1D,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,iBAAiB,CAAC;QAAC,MAAM,CAAC,EAAE,yBAAyB,CAAA;KAAE,GAAG,IAAI;CA8G5F"}
1
+ {"version":3,"file":"AutocompleteStore.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,qBAAa,iBAAkB,SAAQ,aAAa,CAAC,uBAAuB,CAAC;IACrE,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,aAAa,EAAG,wBAAwB,CAAC;IACzC,MAAM,EAAG,sBAAsB,CAAC;IAChC,KAAK,EAAG,qBAAqB,CAAC;IAC9B,MAAM,EAAG,sBAAsB,CAAC;IAChC,OAAO,EAAG,iBAAiB,CAAC;IAC5B,OAAO,EAAG,iBAAiB,CAAC;IAC5B,UAAU,EAAG,qBAAqB,CAAC;IACnC,OAAO,EAAG,kBAAkB,CAAC;IAC7B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,OAAO,EAAE,wBAAwB,CAAC;gBAE7B,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa;IAoCpE,IAAI,QAAQ,YAEX;IAEM,KAAK,IAAI,IAAI;IAMb,WAAW,IAAI,IAAI;IA8BnB,UAAU,IAAI,IAAI;IAMlB,gBAAgB,IAAI,IAAI;IAIxB,aAAa,IAAI,IAAI;IAIrB,YAAY,IAAI,IAAI;IAIpB,UAAU,CAAC,IAAI,EAAE,MAAM,aAAa,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAYhE,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAiB1D,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,iBAAiB,CAAC;QAAC,MAAM,CAAC,EAAE,yBAAyB,CAAA;KAAE,GAAG,IAAI;CA8G5F"}
@@ -17,9 +17,9 @@ var __extends = (this && this.__extends) || (function () {
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.AutocompleteStore = void 0;
19
19
  var mobx_1 = require("mobx");
20
+ var snap_toolbox_1 = require("@athoscommerce/snap-toolbox");
20
21
  var AbstractStore_1 = require("../Abstract/AbstractStore");
21
22
  var Stores_1 = require("../Search/Stores");
22
- var StorageStore_1 = require("../Storage/StorageStore");
23
23
  var Stores_2 = require("./Stores");
24
24
  var MetaStore_1 = require("../Meta/MetaStore");
25
25
  var AutocompleteStore = /** @class */ (function (_super) {
@@ -34,7 +34,7 @@ var AutocompleteStore = /** @class */ (function (_super) {
34
34
  _this.state = new Stores_2.AutocompleteStateStore({
35
35
  services: _this.services,
36
36
  });
37
- _this.storage = new StorageStore_1.StorageStore();
37
+ _this.storage = new snap_toolbox_1.StorageStore();
38
38
  _this.trending = [];
39
39
  _this.history = [];
40
40
  _this.initHistory();
@@ -69,9 +69,9 @@ var AutocompleteStore = /** @class */ (function (_super) {
69
69
  };
70
70
  AutocompleteStore.prototype.initHistory = function () {
71
71
  var _this = this;
72
- var _a, _b;
72
+ var _a, _b, _c, _d;
73
73
  var limit = (_b = (_a = this.config.settings) === null || _a === void 0 ? void 0 : _a.history) === null || _b === void 0 ? void 0 : _b.limit;
74
- if (limit) {
74
+ if (limit && ((_d = (_c = this.config.settings) === null || _c === void 0 ? void 0 : _c.history) === null || _d === void 0 ? void 0 : _d.enabled) !== false) {
75
75
  var historyStore = new Stores_1.SearchHistoryStore({
76
76
  services: this.services,
77
77
  config: {
@@ -116,11 +116,14 @@ var AutocompleteStore = /** @class */ (function (_super) {
116
116
  (_a = this.history) === null || _a === void 0 ? void 0 : _a.forEach(function (term) { return (term.active = false); });
117
117
  };
118
118
  AutocompleteStore.prototype.setService = function (name, service) {
119
+ var _a;
119
120
  if (this.services[name] && service) {
120
121
  this.services[name] = service;
121
122
  if (name === 'urlManager') {
122
123
  this.state.url = service;
123
- this.initHistory();
124
+ (_a = this.history) === null || _a === void 0 ? void 0 : _a.forEach(function (term) {
125
+ term.url = service.set({ query: term.value });
126
+ });
124
127
  }
125
128
  }
126
129
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteFacetStore.d.ts","sourceRoot":"","sources":["../../../../src/Autocomplete/Stores/AutocompleteFacetStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,KAAK,4BAA4B,GAAG,sBAAsB,GAAG;IAC5D,KAAK,EAAE;QACN,YAAY,EAAE,sBAAsB,CAAC;KACrC,CAAC;CACF,CAAC;AACF,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAE9C;gBAEW,MAAM,EAAE,4BAA4B;CAoChD"}
1
+ {"version":3,"file":"AutocompleteFacetStore.d.ts","sourceRoot":"","sources":["../../../../src/Autocomplete/Stores/AutocompleteFacetStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,KAAK,4BAA4B,GAAG,sBAAsB,GAAG;IAC5D,KAAK,EAAE;QACN,YAAY,EAAE,sBAAsB,CAAC;KACrC,CAAC;CACF,CAAC;AACF,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAE9C;gBAEW,MAAM,EAAE,4BAA4B;CAkChD"}
@@ -33,8 +33,7 @@ var AutocompleteFacetStore = /** @class */ (function (_super) {
33
33
  function AutocompleteFacetStore(params) {
34
34
  var _a = params || {}, services = _a.services, state = _a.state;
35
35
  // allow for only a singular facet option selection at a time
36
- var facets = new Stores_1.SearchFacetStore(__assign(__assign({}, params), { services: (services === null || services === void 0 ? void 0 : services.urlManager)
37
- ? __assign(__assign({}, services), { urlManager: services.urlManager.remove('filter') }) : services }));
36
+ var facets = new Stores_1.SearchFacetStore(__assign(__assign({}, params), { services: __assign(__assign({}, services), { urlManager: services.urlManager.remove('filter') }) }));
38
37
  // mutate facet values to add 'preview' function
39
38
  facets.forEach(function (facet) {
40
39
  var _a;
@@ -1,17 +1,25 @@
1
- import { ChatStoreConfig } from '../types';
1
+ import { ChatStoreConfig, StoreServices } from '../types';
2
2
  import { MetaStore } from '../Meta/MetaStore';
3
- import type { MetaResponseModel } from '@athoscommerce/snapi-types';
3
+ import type { MetaResponseModel, SearchResponseModelFacet } from '@athoscommerce/snapi-types';
4
4
  import { AbstractStore } from '../Abstract/AbstractStore';
5
5
  import type { ChatResponseModel, ChatRequestModel, ProductsResponseModel } from '@athoscommerce/snap-client';
6
- import { StorageStore } from '../Storage/StorageStore';
6
+ import type { UrlManager } from '@athoscommerce/snap-url-manager';
7
+ import { StorageStore } from '@athoscommerce/snap-toolbox';
7
8
  import { ChatSessionStore } from './Stores/ChatSessionStore';
8
9
  import { ChatStatusResponse } from '@athoscommerce/snap-client';
9
10
  import { Product } from '../Search/Stores/SearchResultStore';
11
+ import { SearchFacetStore } from '../Search/Stores/SearchFacetStore';
10
12
  export declare class ChatStore extends AbstractStore<ChatStoreConfig> {
11
13
  meta?: MetaStore;
12
14
  inputValue: string;
13
15
  open: boolean;
14
16
  storage: StorageStore;
17
+ services: StoreServices;
18
+ /** Detached UrlManager — holds the in-progress facet selection for the active facets display.
19
+ * Detached so .go() updates state without navigating the page. */
20
+ urlManager: UrlManager;
21
+ /** The single facet store rendered in chat — backed by the active message's facets. */
22
+ facets: SearchFacetStore;
15
23
  chats: ChatSessionStore[];
16
24
  currentChatId: string;
17
25
  chatEnabled: boolean | null;
@@ -23,7 +31,25 @@ export declare class ChatStore extends AbstractStore<ChatStoreConfig> {
23
31
  productQuickviewError: string | null;
24
32
  /** Raw meta kept for lazy hydration of inactive chat sessions. */
25
33
  private storedMetaData;
26
- constructor(config: ChatStoreConfig);
34
+ /** Tracks which message currently owns the displayed facets — guards against redundant rebuilds. */
35
+ private activeFacetsMessageId;
36
+ /** Bumps on every detached-urlManager change so observers re-evaluate isFacetSelected. */
37
+ urlVersion: number;
38
+ /** Snapshot of the applied filter state captured the last time the active message was seeded.
39
+ * Compared against the live urlManager state to decide whether there are pending changes. */
40
+ private appliedFilterSnapshot;
41
+ constructor(config: ChatStoreConfig, services: StoreServices);
42
+ /** Build a SearchFacetStore from raw facet data using the current detached urlManager.
43
+ * Synthesizes meta entries for each facet so SearchFacetStore's display/meta filter
44
+ * doesn't drop chat facets (the chat backend already decided what to send). */
45
+ private buildFacetStore;
46
+ /** Reset the detached urlManager and seed it with this message's filtered facet values,
47
+ * then rebuild the root SearchFacetStore so the UI shows the matching display. */
48
+ setActiveFacets(facets: SearchResponseModelFacet[], messageId: string | null): void;
49
+ /** True when the in-progress facet selection differs from the filters that were applied
50
+ * by the active productSearchResult — i.e. the user has selected/removed something that
51
+ * hasn't been sent yet. Used to decide whether to show the Apply button. */
52
+ get hasPendingFacetChanges(): boolean;
27
53
  get currentChat(): ChatSessionStore | undefined;
28
54
  get chatsIds(): string[];
29
55
  get blocked(): boolean;
@@ -37,17 +63,20 @@ export declare class ChatStore extends AbstractStore<ChatStoreConfig> {
37
63
  clearHistory(): void;
38
64
  createChat(data?: {
39
65
  sessionId: string;
66
+ sessionEndTime?: Date;
40
67
  }): ChatSessionStore;
41
68
  switchChat(id: string): void;
42
69
  sendProductQuery(result: any, options: {
43
70
  requestType: 'productQuery' | 'productSimilar' | 'productComparison';
44
71
  }): void;
45
72
  compareProduct(result: any): void;
46
- addFacet(facet: any): void;
73
+ addFacet(facet: {
74
+ key: string;
75
+ value: string;
76
+ }): void;
47
77
  removeFacet(key: string, value: string): void;
48
78
  clearPendingFacets(): void;
49
79
  isFacetSelected(key: string, value: string): boolean;
50
- isFacetRemoved(key: string, value: string): boolean;
51
80
  request(request: ChatRequestModel): void;
52
81
  update(data: {
53
82
  chat: ChatResponseModel;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatStore.d.ts","sourceRoot":"","sources":["../../../src/Chat/ChatStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAY,MAAM,oCAAoC,CAAC;AAIvE,qBAAa,SAAU,SAAQ,aAAa,CAAC,eAAe,CAAC;IACrD,IAAI,CAAC,EAAE,SAAS,CAAa;IAC7B,UAAU,EAAE,MAAM,CAAM;IACxB,IAAI,EAAE,OAAO,CAAS;IACtB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,gBAAgB,EAAE,CAAM;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAQ;IACnC,eAAe,EAAE,OAAO,CAAS;IACjC,kBAAkB,EAAE,MAAM,EAAE,CAAM;IAClC,cAAc,EAAE,MAAM,CAAM;IAC5B,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAA4E;IACpH,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAQ;IACxC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnD,kEAAkE;IAClE,OAAO,CAAC,cAAc,CAAkC;gBAE5C,MAAM,EAAE,eAAe;IAsGnC,IAAI,WAAW,IAAI,gBAAgB,GAAG,SAAS,CAE9C;IAED,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED,IAAI,OAAO,IAAI,OAAO,CAQrB;IAED,OAAO,CAAC,uBAAuB;IAUxB,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO;IAQ/D,KAAK,IAAI,IAAI;IAOb,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK3C,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IA8B7D,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI/C,qBAAqB,IAAI,IAAI;IAK7B,YAAY,IAAI,IAAI;IAoBpB,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB;IAyB1D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAa5B,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE;QAAE,WAAW,EAAE,cAAc,GAAG,gBAAgB,GAAG,mBAAmB,CAAA;KAAE,GAAG,IAAI;IAkBtH,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI;IAMjC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAmB1B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAuB7C,kBAAkB,IAAI,IAAI;IAc1B,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAkBpD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAInD,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAmBxC,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,IAAI,EAAE,iBAAiB,CAAA;KAAE,GAAG,IAAI;CAkB/E"}
1
+ {"version":3,"file":"ChatStore.d.ts","sourceRoot":"","sources":["../../../src/Chat/ChatStore.ts"],"names":[],"mappings":"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"}
@@ -30,13 +30,14 @@ exports.ChatStore = void 0;
30
30
  var mobx_1 = require("mobx");
31
31
  var MetaStore_1 = require("../Meta/MetaStore");
32
32
  var AbstractStore_1 = require("../Abstract/AbstractStore");
33
- var StorageStore_1 = require("../Storage/StorageStore");
33
+ var snap_toolbox_1 = require("@athoscommerce/snap-toolbox");
34
34
  var ChatSessionStore_1 = require("./Stores/ChatSessionStore");
35
35
  var SearchResultStore_1 = require("../Search/Stores/SearchResultStore");
36
+ var SearchFacetStore_1 = require("../Search/Stores/SearchFacetStore");
36
37
  var CHAT_STATUS_EXPIRATION_TIME = 1000 * 60 * 60 * 12; // 12 hours
37
38
  var ChatStore = /** @class */ (function (_super) {
38
39
  __extends(ChatStore, _super);
39
- function ChatStore(config) {
40
+ function ChatStore(config, services) {
40
41
  var _this = _super.call(this, config) || this;
41
42
  _this.meta = undefined;
42
43
  _this.inputValue = '';
@@ -51,12 +52,25 @@ var ChatStore = /** @class */ (function (_super) {
51
52
  _this.productQuickviewError = null;
52
53
  /** Raw meta kept for lazy hydration of inactive chat sessions. */
53
54
  _this.storedMetaData = null;
55
+ /** Tracks which message currently owns the displayed facets — guards against redundant rebuilds. */
56
+ _this.activeFacetsMessageId = null;
57
+ /** Bumps on every detached-urlManager change so observers re-evaluate isFacetSelected. */
58
+ _this.urlVersion = 0;
59
+ /** Snapshot of the applied filter state captured the last time the active message was seeded.
60
+ * Compared against the live urlManager state to decide whether there are pending changes. */
61
+ _this.appliedFilterSnapshot = '{}';
62
+ _this.services = services;
63
+ _this.urlManager = services.urlManager.detach(true);
64
+ _this.urlManager.subscribe(function () {
65
+ _this.urlVersion++;
66
+ });
54
67
  var legacyKey = "ss-".concat(_this.config.id);
55
68
  var storageKey = _this.config.siteId ? "ss-".concat(_this.config.siteId, "-").concat(_this.config.id) : legacyKey;
56
- _this.storage = new StorageStore_1.StorageStore({
69
+ _this.storage = new snap_toolbox_1.StorageStore({
57
70
  type: 'local',
58
71
  key: storageKey,
59
72
  });
73
+ _this.facets = _this.buildFacetStore();
60
74
  var storedChatStatusResponse = _this.storage.get('chatStatusResponse');
61
75
  if (storedChatStatusResponse) {
62
76
  try {
@@ -140,9 +154,102 @@ var ChatStore = /** @class */ (function (_super) {
140
154
  welcomeMessage: mobx_1.observable,
141
155
  productQuickview: mobx_1.observable,
142
156
  productQuickviewError: mobx_1.observable,
157
+ facets: mobx_1.observable,
158
+ urlVersion: mobx_1.observable,
159
+ hasPendingFacetChanges: mobx_1.computed,
143
160
  });
161
+ // Sync the root facets display with the active message. Only productSearchResult
162
+ // messages carry facets — for any other active message, clear the display so a
163
+ // stale facet bar from a previous response doesn't linger.
164
+ (0, mobx_1.reaction)(function () {
165
+ var _a;
166
+ var active = (_a = _this.currentChat) === null || _a === void 0 ? void 0 : _a.activeMessage;
167
+ return active && active.messageType === 'productSearchResult' ? active : null;
168
+ }, function (active) {
169
+ if (active && active.id !== _this.activeFacetsMessageId) {
170
+ var facets = active.facets;
171
+ _this.setActiveFacets(facets || [], active.id);
172
+ }
173
+ else if (!active && _this.activeFacetsMessageId !== null) {
174
+ _this.setActiveFacets([], null);
175
+ }
176
+ }, { fireImmediately: true });
144
177
  return _this;
145
178
  }
179
+ /** Build a SearchFacetStore from raw facet data using the current detached urlManager.
180
+ * Synthesizes meta entries for each facet so SearchFacetStore's display/meta filter
181
+ * doesn't drop chat facets (the chat backend already decided what to send). */
182
+ ChatStore.prototype.buildFacetStore = function (facets) {
183
+ var _a;
184
+ if (facets === void 0) { facets = []; }
185
+ var baseMeta = ((_a = this.meta) === null || _a === void 0 ? void 0 : _a.data) || {};
186
+ var baseFacetMeta = baseMeta.facets || {};
187
+ var facetMeta = __assign({}, baseFacetMeta);
188
+ facets.forEach(function (facet) {
189
+ if (!facet.field)
190
+ return;
191
+ var expectedDisplay = facet.type === 'range' ? 'slider' : 'list';
192
+ var existing = facetMeta[facet.field];
193
+ if (!existing || existing.display !== expectedDisplay) {
194
+ facetMeta[facet.field] = __assign(__assign({}, (existing || {})), { field: facet.field, label: facet.label, display: expectedDisplay });
195
+ }
196
+ });
197
+ return new SearchFacetStore_1.SearchFacetStore({
198
+ config: {},
199
+ services: __assign(__assign({}, this.services), { urlManager: this.urlManager }),
200
+ stores: { storage: this.storage },
201
+ data: {
202
+ search: { facets: facets },
203
+ meta: __assign(__assign({}, baseMeta), { facets: facetMeta }),
204
+ },
205
+ });
206
+ };
207
+ /** Reset the detached urlManager and seed it with this message's filtered facet values,
208
+ * then rebuild the root SearchFacetStore so the UI shows the matching display. */
209
+ ChatStore.prototype.setActiveFacets = function (facets, messageId) {
210
+ var _this = this;
211
+ var _a;
212
+ // reset url state, then seed with the API-reported filtered values
213
+ this.urlManager.reset().go();
214
+ facets.forEach(function (facet) {
215
+ // Slider/range facets carry the active selection on the facet itself rather
216
+ // than on individual bucket values.
217
+ if (facet.type === 'range') {
218
+ var active = facet.active;
219
+ var range = facet.range;
220
+ if (active && range && (active.low !== range.low || active.high !== range.high)) {
221
+ _this.urlManager.set("filter.".concat(facet.field), { low: active.low, high: active.high }).go();
222
+ }
223
+ return;
224
+ }
225
+ var filteredValues = (facet.values || []).filter(function (v) { return v === null || v === void 0 ? void 0 : v.filtered; });
226
+ filteredValues.forEach(function (v) {
227
+ if (typeof v.low !== 'undefined' || typeof v.high !== 'undefined') {
228
+ _this.urlManager.merge("filter.".concat(facet.field), [{ low: v.low, high: v.high }]).go();
229
+ }
230
+ else if (typeof v.value !== 'undefined') {
231
+ _this.urlManager.merge("filter.".concat(facet.field), v.value).go();
232
+ }
233
+ });
234
+ });
235
+ this.facets = this.buildFacetStore(facets);
236
+ this.activeFacetsMessageId = messageId;
237
+ this.appliedFilterSnapshot = stableStringify((_a = this.urlManager.state) === null || _a === void 0 ? void 0 : _a.filter);
238
+ };
239
+ Object.defineProperty(ChatStore.prototype, "hasPendingFacetChanges", {
240
+ /** True when the in-progress facet selection differs from the filters that were applied
241
+ * by the active productSearchResult — i.e. the user has selected/removed something that
242
+ * hasn't been sent yet. Used to decide whether to show the Apply button. */
243
+ get: function () {
244
+ var _a;
245
+ // touch the version so mobx re-runs this when urlManager state changes
246
+ void this.urlVersion;
247
+ var current = stableStringify((_a = this.urlManager.state) === null || _a === void 0 ? void 0 : _a.filter);
248
+ return current !== this.appliedFilterSnapshot;
249
+ },
250
+ enumerable: false,
251
+ configurable: true
252
+ });
146
253
  Object.defineProperty(ChatStore.prototype, "currentChat", {
147
254
  get: function () {
148
255
  var _this = this;
@@ -194,7 +301,11 @@ var ChatStore = /** @class */ (function (_super) {
194
301
  this.createChat();
195
302
  };
196
303
  ChatStore.prototype.setProductQuickview = function (product) {
197
- this.productQuickview = product;
304
+ var _a;
305
+ // Clone the product so variant selections (and the parent-mappings merge done
306
+ // in updateProductQuickview) only affect the quickview — the carousel and any
307
+ // other surfaces still hold the original instance.
308
+ this.productQuickview = cloneProductForQuickview(product, (_a = this.meta) === null || _a === void 0 ? void 0 : _a.data);
198
309
  this.productQuickviewError = null;
199
310
  };
200
311
  ChatStore.prototype.updateProductQuickview = function (response) {
@@ -256,6 +367,7 @@ var ChatStore = /** @class */ (function (_super) {
256
367
  var newChat = new ChatSessionStore_1.ChatSessionStore({
257
368
  data: {
258
369
  sessionId: data === null || data === void 0 ? void 0 : data.sessionId,
370
+ sessionEndTime: data === null || data === void 0 ? void 0 : data.sessionEndTime,
259
371
  },
260
372
  stores: {
261
373
  storage: this.storage,
@@ -302,91 +414,55 @@ var ChatStore = /** @class */ (function (_super) {
302
414
  });
303
415
  };
304
416
  ChatStore.prototype.addFacet = function (facet) {
305
- var _a;
306
- (_a = this.currentChat) === null || _a === void 0 ? void 0 : _a.attachments.add({
307
- type: 'facet',
308
- key: facet.key,
309
- facetLabel: facet.facetLabel,
310
- value: facet.value,
311
- label: facet.label,
312
- count: facet.count,
313
- });
314
- // If re-selecting a previously removed server-side filter, remove it from removedFacets
315
- if (this.currentChat) {
316
- var removedIndex = this.currentChat.removedFacets.findIndex(function (rf) { return rf.key === facet.key && rf.value === facet.value; });
317
- if (removedIndex !== -1) {
318
- this.currentChat.removedFacets.splice(removedIndex, 1);
319
- }
320
- }
417
+ var value = parseFacetValue(facet.value);
418
+ this.urlManager.merge("filter.".concat(facet.key), Array.isArray(value) ? value : value).go();
321
419
  };
322
420
  ChatStore.prototype.removeFacet = function (key, value) {
323
- var _a, _b, _c;
324
- var facetAttachment = (_a = this.currentChat) === null || _a === void 0 ? void 0 : _a.attachments.items.find(function (item) {
325
- return item.type === 'facet' &&
326
- item.key === key &&
327
- item.value === value &&
328
- (item.state === 'active' || item.state === 'attached');
329
- });
330
- if (facetAttachment) {
331
- var index = (_b = this.currentChat) === null || _b === void 0 ? void 0 : _b.attachments.items.indexOf(facetAttachment);
332
- if (index !== undefined && index !== -1) {
333
- (_c = this.currentChat) === null || _c === void 0 ? void 0 : _c.attachments.items.splice(index, 1);
334
- }
335
- }
336
- else if (this.currentChat) {
337
- // No attachment exists — this is a server-side filtered facet.
338
- // Track it as explicitly removed so the next request excludes it.
339
- var alreadyRemoved = this.currentChat.removedFacets.some(function (rf) { return rf.key === key && rf.value === value; });
340
- if (!alreadyRemoved) {
341
- this.currentChat.removedFacets.push({ key: key, value: value });
342
- }
343
- }
421
+ var parsed = parseFacetValue(value);
422
+ this.urlManager.remove("filter.".concat(key), parsed).go();
344
423
  };
345
424
  ChatStore.prototype.clearPendingFacets = function () {
346
- var _this = this;
347
- var _a;
348
- var facetAttachments = ((_a = this.currentChat) === null || _a === void 0 ? void 0 : _a.attachments.items.filter(function (item) { return item.type === 'facet' && (item.state === 'active' || item.state === 'attached'); })) || [];
349
- facetAttachments.forEach(function (item) {
350
- var _a, _b;
351
- var index = (_a = _this.currentChat) === null || _a === void 0 ? void 0 : _a.attachments.items.indexOf(item);
352
- if (index !== undefined && index !== -1) {
353
- (_b = _this.currentChat) === null || _b === void 0 ? void 0 : _b.attachments.items.splice(index, 1);
354
- }
355
- });
356
- if (this.currentChat) {
357
- this.currentChat.removedFacets = [];
358
- }
425
+ this.urlManager.remove('filter').go();
359
426
  };
360
427
  ChatStore.prototype.isFacetSelected = function (key, value) {
361
428
  var _a;
362
- // A facet that has been explicitly removed by the user is not selected,
363
- // even if the server still reports it as filtered.
364
- if (this.isFacetRemoved(key, value)) {
429
+ // touch the version so mobx re-runs this when urlManager state changes (the
430
+ // underlying UrlManager isn't a mobx observable, so we mirror its updates here)
431
+ void this.urlVersion;
432
+ var filterState = (_a = this.urlManager.state) === null || _a === void 0 ? void 0 : _a.filter;
433
+ if (!filterState || !filterState[key])
365
434
  return false;
366
- }
367
- return (((_a = this.currentChat) === null || _a === void 0 ? void 0 : _a.attachments.items.some(function (item) {
368
- return item.type === 'facet' &&
369
- item.key === key &&
370
- item.value === value &&
371
- (item.state === 'active' || item.state === 'attached');
372
- })) || false);
373
- };
374
- ChatStore.prototype.isFacetRemoved = function (key, value) {
375
- var _a;
376
- return ((_a = this.currentChat) === null || _a === void 0 ? void 0 : _a.removedFacets.some(function (rf) { return rf.key === key && rf.value === value; })) || false;
435
+ var stored = Array.isArray(filterState[key]) ? filterState[key] : [filterState[key]];
436
+ var parsed = parseFacetValue(value);
437
+ return stored.some(function (entry) { return facetValueEquals(entry, parsed); });
377
438
  };
378
439
  ChatStore.prototype.request = function (request) {
379
440
  var _this = this;
380
- var _a, _b, _c;
381
- (_a = this.currentChat) === null || _a === void 0 ? void 0 : _a.request(request);
382
- // remove any facet attachments after request
383
- var facetAttachments = ((_b = this.currentChat) === null || _b === void 0 ? void 0 : _b.attachments.attached.filter(function (item) { return item.type === 'facet'; })) || [];
384
- facetAttachments.forEach(function (item) {
385
- var _a;
386
- (_a = _this.currentChat) === null || _a === void 0 ? void 0 : _a.attachments.remove(item.id);
387
- });
441
+ var _a, _b;
442
+ // snapshot facet labels (field + per-value) from the active facets display so the
443
+ // outgoing user message can render "Filter by Color Red" rather than raw keys
444
+ var filterLabels = {};
445
+ var _loop_1 = function (facet) {
446
+ var valueFacet = facet;
447
+ var values = {};
448
+ (valueFacet.values || []).forEach(function (v) {
449
+ var _a, _b;
450
+ if (typeof v.low !== 'undefined' || typeof v.high !== 'undefined') {
451
+ values["".concat((_a = v.low) !== null && _a !== void 0 ? _a : '*', ":").concat((_b = v.high) !== null && _b !== void 0 ? _b : '*')] = v.label;
452
+ }
453
+ else if (typeof v.value !== 'undefined') {
454
+ values[v.value] = v.label;
455
+ }
456
+ });
457
+ filterLabels[valueFacet.field] = { facetLabel: valueFacet.label || valueFacet.field, values: values };
458
+ };
459
+ for (var _i = 0, _c = this.facets; _i < _c.length; _i++) {
460
+ var facet = _c[_i];
461
+ _loop_1(facet);
462
+ }
463
+ (_a = this.currentChat) === null || _a === void 0 ? void 0 : _a.request(request, filterLabels);
388
464
  // remove any productSimilar attachments after request
389
- var productSimilarAttachments = ((_c = this.currentChat) === null || _c === void 0 ? void 0 : _c.attachments.attached.filter(function (item) { return item.type === 'product' && item.requestType === 'productSimilar'; })) || [];
465
+ var productSimilarAttachments = ((_b = this.currentChat) === null || _b === void 0 ? void 0 : _b.attachments.attached.filter(function (item) { return item.type === 'product' && item.requestType === 'productSimilar'; })) || [];
390
466
  productSimilarAttachments.forEach(function (item) {
391
467
  var _a;
392
468
  (_a = _this.currentChat) === null || _a === void 0 ? void 0 : _a.attachments.remove(item.id);
@@ -413,3 +489,51 @@ var ChatStore = /** @class */ (function (_super) {
413
489
  return ChatStore;
414
490
  }(AbstractStore_1.AbstractStore));
415
491
  exports.ChatStore = ChatStore;
492
+ /** Deterministic JSON.stringify — sorts object keys recursively so equality comparisons
493
+ * aren't sensitive to insertion order. */
494
+ function stableStringify(value) {
495
+ if (value === null || value === undefined)
496
+ return 'null';
497
+ if (typeof value !== 'object')
498
+ return JSON.stringify(value);
499
+ if (Array.isArray(value)) {
500
+ return "[".concat(value.map(function (v) { return stableStringify(v); }).join(','), "]");
501
+ }
502
+ var keys = Object.keys(value).sort();
503
+ return "{".concat(keys.map(function (k) { return "".concat(JSON.stringify(k), ":").concat(stableStringify(value[k])); }).join(','), "}");
504
+ }
505
+ /** Convert a chat-facet UI value into the URL-state shape — range buckets arrive as "low:high". */
506
+ function parseFacetValue(value) {
507
+ if (typeof value === 'string' && value.includes(':')) {
508
+ var _a = value.split(':'), low = _a[0], high = _a[1];
509
+ return {
510
+ low: low === '*' ? undefined : Number(low),
511
+ high: high === '*' ? undefined : Number(high),
512
+ };
513
+ }
514
+ return value;
515
+ }
516
+ function facetValueEquals(a, b) {
517
+ if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {
518
+ return a.low === b.low && a.high === b.high;
519
+ }
520
+ return a === b;
521
+ }
522
+ /** Build a fresh observable Product from an existing one. Variants are intentionally
523
+ * omitted — `updateProductQuickview` populates them from the products API response. */
524
+ function cloneProductForQuickview(product, meta) {
525
+ var _a, _b, _c;
526
+ var result = {
527
+ id: product.id,
528
+ responseId: product.responseId,
529
+ mappings: JSON.parse(JSON.stringify(product.mappings || {})),
530
+ attributes: JSON.parse(JSON.stringify(product.attributes || {})),
531
+ badges: ((_b = (_a = product.badges) === null || _a === void 0 ? void 0 : _a.all) === null || _b === void 0 ? void 0 : _b.map(function (b) { return ({ tag: b.tag }); })) || [],
532
+ };
533
+ return new SearchResultStore_1.Product({
534
+ config: {},
535
+ data: { result: result, meta: meta || {} },
536
+ position: (_c = product.position) !== null && _c !== void 0 ? _c : 0,
537
+ responseId: product.responseId,
538
+ });
539
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"ChatAttachmentStore.d.ts","sourceRoot":"","sources":["../../../../src/Chat/Stores/ChatAttachmentStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatAttachmentStore.d.ts","sourceRoot":"","sources":["../../../../src/Chat/Stores/ChatAttachmentStore.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,7 @@ exports.ChatAttachmentImage = exports.ChatAttachmentFacet = exports.ChatAttachme
56
56
  // how should localStorage be handled for attachments?
57
57
  var uuid_1 = require("uuid");
58
58
  var mobx_1 = require("mobx");
59
+ var ChatCompareStore_1 = require("./ChatCompareStore");
59
60
  var ChatAttachmentStore = /** @class */ (function () {
60
61
  function ChatAttachmentStore() {
61
62
  this.items = [];
@@ -123,11 +124,10 @@ var ChatAttachmentStore = /** @class */ (function () {
123
124
  existingProductAttachment.requestType = attachment.requestType; // changes existing attachments to the incoming requestType
124
125
  return existingProductAttachment;
125
126
  }
126
- // productComparison supports up to 4 products (matches ChatCompareStore.maxItems);
127
+ // productComparison supports up to CHAT_COMPARISON_MAX products (matches ChatCompareStore.maxItems);
127
128
  // trim oldest active/attached product attachments to keep total below the cap.
128
- var COMPARISON_MAX = 4;
129
129
  var productAttachments = this.items.filter(function (item) { return item.type === 'product' && (item.state === 'active' || item.state === 'attached'); });
130
- while (productAttachments.length >= COMPARISON_MAX) {
130
+ while (productAttachments.length >= ChatCompareStore_1.CHAT_COMPARISON_MAX) {
131
131
  var toRemove = productAttachments.pop();
132
132
  if (toRemove) {
133
133
  this.remove(toRemove.id);
@@ -1,3 +1,5 @@
1
+ /** Maximum number of products that can be added to a chat comparison. */
2
+ export declare const CHAT_COMPARISON_MAX = 4;
1
3
  export declare class ChatCompareStore {
2
4
  items: any[];
3
5
  committedItems: any[];
@@ -1 +1 @@
1
- {"version":3,"file":"ChatCompareStore.d.ts","sourceRoot":"","sources":["../../../../src/Chat/Stores/ChatCompareStore.ts"],"names":[],"mappings":"AAEA,qBAAa,gBAAgB;IACrB,KAAK,EAAE,GAAG,EAAE,CAAM;IAClB,cAAc,EAAE,GAAG,EAAE,CAAM;IAC3B,QAAQ,EAAE,MAAM,CAAK;;IAa5B,GAAG,CAAC,IAAI,EAAE,GAAG;IAYb,MAAM,CAAC,MAAM,EAAE,MAAM;IAIrB,KAAK;IAIL,cAAc;IAKd,MAAM;IAON,IAAI,QAAQ,UAEX;IAED,IAAI,SAAS,UAEZ;CACD"}
1
+ {"version":3,"file":"ChatCompareStore.d.ts","sourceRoot":"","sources":["../../../../src/Chat/Stores/ChatCompareStore.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,qBAAa,gBAAgB;IACrB,KAAK,EAAE,GAAG,EAAE,CAAM;IAClB,cAAc,EAAE,GAAG,EAAE,CAAM;IAC3B,QAAQ,EAAE,MAAM,CAAuB;;IAa9C,GAAG,CAAC,IAAI,EAAE,GAAG;IAYb,MAAM,CAAC,MAAM,EAAE,MAAM;IAIrB,KAAK;IAIL,cAAc;IAKd,MAAM;IAON,IAAI,QAAQ,UAEX;IAED,IAAI,SAAS,UAEZ;CACD"}
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ChatCompareStore = void 0;
3
+ exports.ChatCompareStore = exports.CHAT_COMPARISON_MAX = void 0;
4
4
  var mobx_1 = require("mobx");
5
+ /** Maximum number of products that can be added to a chat comparison. */
6
+ exports.CHAT_COMPARISON_MAX = 4;
5
7
  var ChatCompareStore = /** @class */ (function () {
6
8
  function ChatCompareStore() {
7
9
  this.items = [];
8
10
  this.committedItems = [];
9
- this.maxItems = 4;
11
+ this.maxItems = exports.CHAT_COMPARISON_MAX;
10
12
  (0, mobx_1.makeObservable)(this, {
11
13
  items: mobx_1.observable,
12
14
  committedItems: mobx_1.observable,