@bonlineza/luxity-lib 2.36.1-beta.4 → 2.36.1

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 (90) hide show
  1. package/Accordion.js +116 -76
  2. package/AddInterest.js +777 -440
  3. package/AddProductInterest.js +644 -485
  4. package/BrandSelector.js +336 -176
  5. package/Checkbox.js +101 -68
  6. package/CheckboxButton.js +124 -79
  7. package/CommunicationPreferenceOptionsRenderer.js +169 -159
  8. package/CommunicationPreferenceSection.js +178 -166
  9. package/CommunicationPreferences.js +427 -549
  10. package/ConditionSelector.js +336 -174
  11. package/CountryCodeSelect.js +10 -7
  12. package/CurrencyInputFormatter.js +56 -29
  13. package/CurrencySelect.js +49 -23
  14. package/DropdownSelector.js +92 -68
  15. package/GALink.js +16 -6
  16. package/GenderSelector.js +142 -88
  17. package/GraphQLDropdownSelector.js +1511 -933
  18. package/GraphQLMultiSelector.js +274 -141
  19. package/IconHeader.js +25 -11
  20. package/IconWrapper.js +7 -3
  21. package/InterestCatSelector.js +74 -34
  22. package/InterestItem.js +187 -103
  23. package/Interests.js +1466 -917
  24. package/InterestsSubheading.js +10 -5
  25. package/InvertedTextButton.js +63 -27
  26. package/LuxityAppSideNav.js +22 -19
  27. package/LuxityDesktopHeader.js +663 -549
  28. package/LuxityFooter.js +325 -434
  29. package/LuxityGraphQLDropdownSelector.js +1543 -949
  30. package/LuxityGraphQLMultiselector.js +321 -167
  31. package/LuxityMobileHeader.js +807 -681
  32. package/LuxityPageReady.js +136 -74
  33. package/LuxityProductInterestItem.js +175 -97
  34. package/LuxitySideNav.js +310 -382
  35. package/MaterialSelector.js +1550 -955
  36. package/ModelSelector.js +1550 -955
  37. package/NotificationDropDown.js +221 -122
  38. package/Notify.js +1 -0
  39. package/OutlinePrimaryButton.js +58 -26
  40. package/PriceRangeSelector.js +281 -168
  41. package/PrimaryButton.js +58 -26
  42. package/RadioButtons.js +140 -114
  43. package/RangeSlider.js +242 -152
  44. package/RareStepFooter.js +41 -27
  45. package/RareStepHeader.js +190 -139
  46. package/ReactSelectWrapper.js +1 -0
  47. package/SecondaryButton.js +58 -26
  48. package/ShoeSizeRangeSelector.js +260 -162
  49. package/ShoeSizeSelector.js +263 -158
  50. package/SimpleErrorBoundary.js +106 -59
  51. package/StyleSelector.js +336 -176
  52. package/TextButton.js +58 -26
  53. package/Tooltip.js +39 -17
  54. package/Tracking.js +1 -0
  55. package/WrapperButton.js +43 -20
  56. package/build/bundle.css +1 -1
  57. package/build/bundle.js +2973 -2457
  58. package/package.json +2 -3
  59. package/svg/Accessories.js +13 -6
  60. package/svg/Account.js +13 -6
  61. package/svg/Add.js +13 -6
  62. package/svg/ArrowRight.js +13 -6
  63. package/svg/Bags.js +13 -6
  64. package/svg/BurgerMenu.js +13 -6
  65. package/svg/Calendar.js +13 -6
  66. package/svg/CalendarCircled.js +13 -6
  67. package/svg/CheckCircled.js +13 -6
  68. package/svg/Close.js +13 -6
  69. package/svg/Clothing.js +13 -6
  70. package/svg/Dot.js +13 -6
  71. package/svg/Edit.js +13 -6
  72. package/svg/Eye.js +13 -6
  73. package/svg/FileAttach.js +13 -6
  74. package/svg/FileAttachCircled.js +13 -6
  75. package/svg/LightBulb.js +13 -6
  76. package/svg/Logo.js +13 -6
  77. package/svg/LuxityMenu.js +13 -6
  78. package/svg/Minus.js +13 -6
  79. package/svg/MobileAvatar.js +13 -6
  80. package/svg/MyOrder.js +13 -6
  81. package/svg/MyPayment.js +13 -6
  82. package/svg/MyProfile.js +14 -8
  83. package/svg/MySale.js +13 -6
  84. package/svg/Notification.js +13 -6
  85. package/svg/PointerDown.js +13 -6
  86. package/svg/Search.js +13 -6
  87. package/svg/Shoes.js +13 -6
  88. package/svg/SvgWrapper.js +7 -3
  89. package/svg/Trash.js +13 -6
  90. package/svg/Watches.js +13 -6
@@ -8,265 +8,149 @@
8
8
  axios = axios && Object.prototype.hasOwnProperty.call(axios, 'default') ? axios['default'] : axios;
9
9
  var styled__default = 'default' in styled ? styled['default'] : styled;
10
10
 
11
- function _arrayLikeToArray(r, a) {
12
- (null == a || a > r.length) && (a = r.length);
13
- for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
14
- return n;
15
- }
16
- function _arrayWithHoles(r) {
17
- if (Array.isArray(r)) return r;
18
- }
19
- function _defineProperty(e, r, t) {
20
- return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
21
- value: t,
22
- enumerable: !0,
23
- configurable: !0,
24
- writable: !0
25
- }) : e[r] = t, e;
26
- }
27
- function _extends() {
28
- return _extends = Object.assign ? Object.assign.bind() : function (n) {
29
- for (var e = 1; e < arguments.length; e++) {
30
- var t = arguments[e];
31
- for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
32
- }
33
- return n;
34
- }, _extends.apply(null, arguments);
35
- }
36
- function _iterableToArrayLimit(r, l) {
37
- var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
38
- if (null != t) {
39
- var e,
40
- n,
41
- i,
42
- u,
43
- a = [],
44
- f = !0,
45
- o = !1;
46
- try {
47
- if (i = (t = t.call(r)).next, 0 === l) {
48
- if (Object(t) !== t) return;
49
- f = !1;
50
- } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
51
- } catch (r) {
52
- o = !0, n = r;
53
- } finally {
54
- try {
55
- if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
56
- } finally {
57
- if (o) throw n;
58
- }
59
- }
60
- return a;
11
+ function ownKeys(object, enumerableOnly) {
12
+ var keys = Object.keys(object);
13
+
14
+ if (Object.getOwnPropertySymbols) {
15
+ var symbols = Object.getOwnPropertySymbols(object);
16
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
17
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
18
+ })), keys.push.apply(keys, symbols);
61
19
  }
20
+
21
+ return keys;
62
22
  }
63
- function _nonIterableRest() {
64
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
65
- }
66
- function ownKeys(e, r) {
67
- var t = Object.keys(e);
68
- if (Object.getOwnPropertySymbols) {
69
- var o = Object.getOwnPropertySymbols(e);
70
- r && (o = o.filter(function (r) {
71
- return Object.getOwnPropertyDescriptor(e, r).enumerable;
72
- })), t.push.apply(t, o);
23
+
24
+ function _objectSpread2(target) {
25
+ for (var i = 1; i < arguments.length; i++) {
26
+ var source = null != arguments[i] ? arguments[i] : {};
27
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
28
+ _defineProperty(target, key, source[key]);
29
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
30
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
31
+ });
73
32
  }
74
- return t;
33
+
34
+ return target;
75
35
  }
76
- function _objectSpread2(e) {
77
- for (var r = 1; r < arguments.length; r++) {
78
- var t = null != arguments[r] ? arguments[r] : {};
79
- r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
80
- _defineProperty(e, r, t[r]);
81
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
82
- Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
36
+
37
+ function _defineProperty(obj, key, value) {
38
+ if (key in obj) {
39
+ Object.defineProperty(obj, key, {
40
+ value: value,
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true
83
44
  });
45
+ } else {
46
+ obj[key] = value;
84
47
  }
85
- return e;
48
+
49
+ return obj;
86
50
  }
87
- function _slicedToArray(r, e) {
88
- return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
51
+
52
+ function _extends() {
53
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
54
+ for (var i = 1; i < arguments.length; i++) {
55
+ var source = arguments[i];
56
+
57
+ for (var key in source) {
58
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
59
+ target[key] = source[key];
60
+ }
61
+ }
62
+ }
63
+
64
+ return target;
65
+ };
66
+ return _extends.apply(this, arguments);
89
67
  }
90
- function _taggedTemplateLiteral(e, t) {
91
- return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, {
68
+
69
+ function _taggedTemplateLiteral(strings, raw) {
70
+ if (!raw) {
71
+ raw = strings.slice(0);
72
+ }
73
+
74
+ return Object.freeze(Object.defineProperties(strings, {
92
75
  raw: {
93
- value: Object.freeze(t)
76
+ value: Object.freeze(raw)
94
77
  }
95
78
  }));
96
79
  }
97
- function _toPrimitive(t, r) {
98
- if ("object" != typeof t || !t) return t;
99
- var e = t[Symbol.toPrimitive];
100
- if (void 0 !== e) {
101
- var i = e.call(t, r || "default");
102
- if ("object" != typeof i) return i;
103
- throw new TypeError("@@toPrimitive must return a primitive value.");
104
- }
105
- return ("string" === r ? String : Number)(t);
106
- }
107
- function _toPropertyKey(t) {
108
- var i = _toPrimitive(t, "string");
109
- return "symbol" == typeof i ? i : i + "";
80
+
81
+ function _slicedToArray(arr, i) {
82
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
110
83
  }
111
- function _unsupportedIterableToArray(r, a) {
112
- if (r) {
113
- if ("string" == typeof r) return _arrayLikeToArray(r, a);
114
- var t = {}.toString.call(r).slice(8, -1);
115
- return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
116
- }
84
+
85
+ function _arrayWithHoles(arr) {
86
+ if (Array.isArray(arr)) return arr;
117
87
  }
118
88
 
119
- var cssUnit = {
120
- cm: true,
121
- mm: true,
122
- in: true,
123
- px: true,
124
- pt: true,
125
- pc: true,
126
- em: true,
127
- ex: true,
128
- ch: true,
129
- rem: true,
130
- vw: true,
131
- vh: true,
132
- vmin: true,
133
- vmax: true,
134
- "%": true,
135
- };
136
- /**
137
- * If size is a number, append px to the value as default unit.
138
- * If size is a string, validate against list of valid units.
139
- * If unit is valid, return size as is.
140
- * If unit is invalid, console warn issue, replace with px as the unit.
141
- *
142
- * @param {(number | string)} size
143
- * @return {LengthObject} LengthObject
144
- */
145
- function parseLengthAndUnit(size) {
146
- if (typeof size === "number") {
147
- return {
148
- value: size,
149
- unit: "px",
150
- };
151
- }
152
- var value;
153
- var valueString = (size.match(/^[0-9.]*/) || "").toString();
154
- if (valueString.includes(".")) {
155
- value = parseFloat(valueString);
156
- }
157
- else {
158
- value = parseInt(valueString, 10);
89
+ function _iterableToArrayLimit(arr, i) {
90
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
91
+
92
+ if (_i == null) return;
93
+ var _arr = [];
94
+ var _n = true;
95
+ var _d = false;
96
+
97
+ var _s, _e;
98
+
99
+ try {
100
+ for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
101
+ _arr.push(_s.value);
102
+
103
+ if (i && _arr.length === i) break;
159
104
  }
160
- var unit = (size.match(/[^0-9]*$/) || "").toString();
161
- if (cssUnit[unit]) {
162
- return {
163
- value: value,
164
- unit: unit,
165
- };
105
+ } catch (err) {
106
+ _d = true;
107
+ _e = err;
108
+ } finally {
109
+ try {
110
+ if (!_n && _i["return"] != null) _i["return"]();
111
+ } finally {
112
+ if (_d) throw _e;
166
113
  }
167
- console.warn("React Spinners: ".concat(size, " is not a valid css value. Defaulting to ").concat(value, "px."));
168
- return {
169
- value: value,
170
- unit: "px",
171
- };
114
+ }
115
+
116
+ return _arr;
172
117
  }
173
- /**
174
- * Take value as an input and return valid css value
175
- *
176
- * @param {(number | string)} value
177
- * @return {string} valid css value
178
- */
179
- function cssValue(value) {
180
- var lengthWithunit = parseLengthAndUnit(value);
181
- return "".concat(lengthWithunit.value).concat(lengthWithunit.unit);
118
+
119
+ function _unsupportedIterableToArray(o, minLen) {
120
+ if (!o) return;
121
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
122
+ var n = Object.prototype.toString.call(o).slice(8, -1);
123
+ if (n === "Object" && o.constructor) n = o.constructor.name;
124
+ if (n === "Map" || n === "Set") return Array.from(o);
125
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
182
126
  }
183
127
 
184
- var createAnimation = function (loaderName, frames, suffix) {
185
- var animationName = "react-spinners-".concat(loaderName, "-").concat(suffix);
186
- if (typeof window == "undefined" || !window.document) {
187
- return animationName;
188
- }
189
- var styleEl = document.createElement("style");
190
- document.head.appendChild(styleEl);
191
- var styleSheet = styleEl.sheet;
192
- var keyFrames = "\n @keyframes ".concat(animationName, " {\n ").concat(frames, "\n }\n ");
193
- if (styleSheet) {
194
- styleSheet.insertRule(keyFrames, 0);
195
- }
196
- return animationName;
197
- };
128
+ function _arrayLikeToArray(arr, len) {
129
+ if (len == null || len > arr.length) len = arr.length;
198
130
 
199
- var __assign = (undefined && undefined.__assign) || function () {
200
- __assign = Object.assign || function(t) {
201
- for (var s, i = 1, n = arguments.length; i < n; i++) {
202
- s = arguments[i];
203
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
204
- t[p] = s[p];
205
- }
206
- return t;
207
- };
208
- return __assign.apply(this, arguments);
209
- };
210
- var __rest = (undefined && undefined.__rest) || function (s, e) {
211
- var t = {};
212
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
213
- t[p] = s[p];
214
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
215
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
216
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
217
- t[p[i]] = s[p[i]];
218
- }
219
- return t;
220
- };
221
- var beat = createAnimation("BeatLoader", "50% {transform: scale(0.75);opacity: 0.2} 100% {transform: scale(1);opacity: 1}", "beat");
222
- function BeatLoader(_a) {
223
- var _b = _a.loading, loading = _b === void 0 ? true : _b, _c = _a.color, color = _c === void 0 ? "#000000" : _c, _d = _a.speedMultiplier, speedMultiplier = _d === void 0 ? 1 : _d, _e = _a.cssOverride, cssOverride = _e === void 0 ? {} : _e, _f = _a.size, size = _f === void 0 ? 15 : _f, _g = _a.margin, margin = _g === void 0 ? 2 : _g, additionalprops = __rest(_a, ["loading", "color", "speedMultiplier", "cssOverride", "size", "margin"]);
224
- var wrapper = __assign({ display: "inherit" }, cssOverride);
225
- var style = function (i) {
226
- return {
227
- display: "inline-block",
228
- backgroundColor: color,
229
- width: cssValue(size),
230
- height: cssValue(size),
231
- margin: cssValue(margin),
232
- borderRadius: "100%",
233
- animation: "".concat(beat, " ").concat(0.7 / speedMultiplier, "s ").concat(i % 2 ? "0s" : "".concat(0.35 / speedMultiplier, "s"), " infinite linear"),
234
- animationFillMode: "both",
235
- };
236
- };
237
- if (!loading) {
238
- return null;
239
- }
240
- return (React.createElement("span", __assign({ style: wrapper }, additionalprops),
241
- React.createElement("span", { style: style(1) }),
242
- React.createElement("span", { style: style(2) }),
243
- React.createElement("span", { style: style(3) })));
131
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
132
+
133
+ return arr2;
244
134
  }
245
135
 
246
- var searchProducts = function searchProducts(search, limit) {
247
- return {
248
- query: "\n query SearchProducts($search: String!, $limit: Int!) {\n luxity_products_serach_results(search: $search, limit: $limit) {\n brands {\n name\n link\n }\n products {\n name\n link\n }\n luxity_product_ids\n }\n }\n ",
249
- variables: {
250
- search: search,
251
- limit: limit
252
- }
253
- };
254
- };
136
+ function _nonIterableRest() {
137
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
138
+ }
255
139
 
256
140
  var Dropdown = function Dropdown(_ref) {
257
141
  var title = _ref.title,
258
- imageSrc = _ref.imageSrc,
259
- _ref$categoryElements = _ref.categoryElements,
260
- categoryElements = _ref$categoryElements === void 0 ? [] : _ref$categoryElements,
261
- _ref$brandElements = _ref.brandElements,
262
- brandElements = _ref$brandElements === void 0 ? [] : _ref$brandElements,
263
- productsUrl = _ref.productsUrl,
264
- LinkComponent = _ref.LinkComponent,
265
- categorySlug = _ref.categorySlug,
266
- categoryTitle = _ref.categoryTitle,
267
- isLoading = _ref.isLoading,
268
- hasError = _ref.hasError,
269
- onMenuItemClick = _ref.onMenuItemClick;
142
+ imageSrc = _ref.imageSrc,
143
+ _ref$categoryElements = _ref.categoryElements,
144
+ categoryElements = _ref$categoryElements === void 0 ? [] : _ref$categoryElements,
145
+ _ref$brandElements = _ref.brandElements,
146
+ brandElements = _ref$brandElements === void 0 ? [] : _ref$brandElements,
147
+ productsUrl = _ref.productsUrl,
148
+ LinkComponent = _ref.LinkComponent,
149
+ categorySlug = _ref.categorySlug,
150
+ categoryTitle = _ref.categoryTitle,
151
+ isLoading = _ref.isLoading,
152
+ hasError = _ref.hasError,
153
+ onMenuItemClick = _ref.onMenuItemClick;
270
154
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, hasError ? /*#__PURE__*/React__default.createElement("div", {
271
155
  className: "dropdown__errors"
272
156
  }, "Failed to load data.") : /*#__PURE__*/React__default.createElement("div", {
@@ -305,11 +189,11 @@
305
189
  onClick: onMenuItemClick
306
190
  }, "All ", categoryTitle)), !!brandElements.length && brandElements.map(function (brand) {
307
191
  return /*#__PURE__*/React__default.createElement("div", {
308
- className: "dropdown__brand-element"
192
+ className: "dropdown__brand-element",
193
+ key: brand.name
309
194
  }, /*#__PURE__*/React__default.createElement(LinkComponent, {
310
195
  href: "".concat(productsUrl, "/").concat(categorySlug, "/").concat(brand === null || brand === void 0 ? void 0 : brand.slug),
311
196
  className: "dropdown__element",
312
- key: brand.name,
313
197
  onClick: onMenuItemClick
314
198
  }, brand === null || brand === void 0 ? void 0 : brand.name));
315
199
  }))), /*#__PURE__*/React__default.createElement("div", {
@@ -322,22 +206,25 @@
322
206
 
323
207
  var DropdownLink = function DropdownLink(_ref) {
324
208
  var title = _ref.title,
325
- imageSrc = _ref.imageSrc,
326
- categoryElements = _ref.categoryElements,
327
- brandElements = _ref.brandElements,
328
- productsUrl = _ref.productsUrl,
329
- LinkComponent = _ref.LinkComponent,
330
- categorySlug = _ref.categorySlug,
331
- categoryTitle = _ref.categoryTitle,
332
- isLoading = _ref.isLoading,
333
- hasError = _ref.hasError;
209
+ imageSrc = _ref.imageSrc,
210
+ categoryElements = _ref.categoryElements,
211
+ brandElements = _ref.brandElements,
212
+ productsUrl = _ref.productsUrl,
213
+ LinkComponent = _ref.LinkComponent,
214
+ categorySlug = _ref.categorySlug,
215
+ categoryTitle = _ref.categoryTitle,
216
+ isLoading = _ref.isLoading,
217
+ hasError = _ref.hasError;
218
+
334
219
  var _useState = React.useState(false),
335
- _useState2 = _slicedToArray(_useState, 2),
336
- dropdownVisible = _useState2[0],
337
- setDropdownVisible = _useState2[1];
220
+ _useState2 = _slicedToArray(_useState, 2),
221
+ dropdownVisible = _useState2[0],
222
+ setDropdownVisible = _useState2[1];
223
+
338
224
  var handleMenuItemClick = function handleMenuItemClick() {
339
225
  setDropdownVisible(false);
340
226
  };
227
+
341
228
  return /*#__PURE__*/React__default.createElement("li", {
342
229
  className: "navbar__link",
343
230
  onMouseEnter: function onMouseEnter() {
@@ -369,8 +256,8 @@
369
256
 
370
257
  var StoresDropdown = function StoresDropdown(_ref) {
371
258
  var _ref$stores = _ref.stores,
372
- stores = _ref$stores === void 0 ? [] : _ref$stores,
373
- contactNumber = _ref.contactNumber;
259
+ stores = _ref$stores === void 0 ? [] : _ref$stores,
260
+ contactNumber = _ref.contactNumber;
374
261
  return /*#__PURE__*/React__default.createElement("div", {
375
262
  className: "stores-dropdown"
376
263
  }, !!stores.length && stores.map(function (store) {
@@ -410,89 +297,160 @@
410
297
  }, contactNumber)));
411
298
  };
412
299
 
413
- var categories = {
414
- shoes: {
415
- name: 'Shoes',
416
- slug: 'shoes'
417
- },
418
- bags: {
419
- name: 'Bags',
420
- slug: 'bags'
421
- },
422
- clothing: {
423
- name: 'Clothing',
424
- slug: 'apparel'
425
- },
426
- watches: {
427
- name: 'Watches',
428
- slug: 'watches'
429
- },
430
- accessories: {
431
- name: 'Accessories',
432
- slug: 'accessories'
300
+ var SearchResults = function SearchResults(_ref) {
301
+ var _searchResults$brands, _searchResults$produc, _searchResults$brands2, _searchResults$produc2, _initialSearchData$tr, _initialSearchData$la, _limitBrands, _limitBrands2, _initialSearchData$la2, _searchResults$produc3;
302
+
303
+ var searchValue = _ref.searchValue,
304
+ searchResults = _ref.searchResults,
305
+ onViewAll = _ref.onViewAll,
306
+ searchResultsRef = _ref.searchResultsRef,
307
+ onSearchSubmit = _ref.onSearchSubmit,
308
+ setSearchValue = _ref.setSearchValue,
309
+ initialSearchData = _ref.initialSearchData,
310
+ isSearchFocused = _ref.isSearchFocused,
311
+ setIsSearchFocused = _ref.setIsSearchFocused,
312
+ currency = _ref.currency,
313
+ currencySymbol = _ref.currencySymbol;
314
+
315
+ var _useState = React.useState(false),
316
+ _useState2 = _slicedToArray(_useState, 2),
317
+ isMobile = _useState2[0],
318
+ setIsMobile = _useState2[1];
319
+
320
+ React.useEffect(function () {
321
+ var checkIfMobile = function checkIfMobile() {
322
+ setIsMobile(window.innerWidth <= 1024);
323
+ };
324
+
325
+ checkIfMobile();
326
+ window.addEventListener('resize', checkIfMobile);
327
+ return function () {
328
+ window.removeEventListener('resize', checkIfMobile);
329
+ };
330
+ }, []);
331
+ var shouldShowInitialData = isSearchFocused && (!searchValue || searchValue.trim().length < 3) || (searchValue === null || searchValue === void 0 ? void 0 : searchValue.trim().length) >= 3 && !(searchResults !== null && searchResults !== void 0 && (_searchResults$brands = searchResults.brands) !== null && _searchResults$brands !== void 0 && _searchResults$brands.length) && !(searchResults !== null && searchResults !== void 0 && (_searchResults$produc = searchResults.products) !== null && _searchResults$produc !== void 0 && _searchResults$produc.length);
332
+ var hasResults = (searchResults === null || searchResults === void 0 ? void 0 : (_searchResults$brands2 = searchResults.brands) === null || _searchResults$brands2 === void 0 ? void 0 : _searchResults$brands2.length) > 0 || (searchResults === null || searchResults === void 0 ? void 0 : (_searchResults$produc2 = searchResults.products) === null || _searchResults$produc2 === void 0 ? void 0 : _searchResults$produc2.length) > 0;
333
+ var hasInitialData = (initialSearchData === null || initialSearchData === void 0 ? void 0 : (_initialSearchData$tr = initialSearchData.trending_brands) === null || _initialSearchData$tr === void 0 ? void 0 : _initialSearchData$tr.length) > 0 || (initialSearchData === null || initialSearchData === void 0 ? void 0 : (_initialSearchData$la = initialSearchData.latest_products) === null || _initialSearchData$la === void 0 ? void 0 : _initialSearchData$la.length) > 0;
334
+
335
+ if (!hasResults && !hasInitialData) {
336
+ return null;
433
337
  }
434
- };
435
338
 
436
- var removeCategoryByName = function removeCategoryByName(categories, name) {
437
- var _categories$filter;
438
- return (_categories$filter = categories === null || categories === void 0 ? void 0 : categories.filter(function (category) {
439
- return category.name !== name;
440
- })) !== null && _categories$filter !== void 0 ? _categories$filter : [];
441
- };
339
+ if (!isSearchFocused) {
340
+ return null;
341
+ }
442
342
 
443
- var SearchResults = function SearchResults(_ref) {
444
- var searchValue = _ref.searchValue,
445
- searchResults = _ref.searchResults,
446
- onViewAll = _ref.onViewAll,
447
- searchResultsRef = _ref.searchResultsRef,
448
- onSearchSubmit = _ref.onSearchSubmit,
449
- setSearchValue = _ref.setSearchValue;
450
- if (searchValue.trim().length >= 3) {
451
- if (searchResults.brands.length === 0 && searchResults.products.length === 0) {
452
- return null;
453
- }
454
- return /*#__PURE__*/React__default.createElement("div", {
455
- className: "z-50 absolute md:top-14 font-body bg-white w-full lg:w-1/2 flex flex-col md:flex-row md:divide-x divide-black lg:mt-1 shadow-md",
456
- ref: searchResultsRef
457
- }, /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
458
- className: "w-full lg:w-1/3"
459
- }, /*#__PURE__*/React__default.createElement("p", {
460
- className: "font-bold p-2 px-4"
461
- }, "Brands"), searchResults.brands.map(function (brand) {
462
- return /*#__PURE__*/React__default.createElement("a", {
463
- key: brand.link,
464
- href: brand.link,
465
- className: ""
466
- }, /*#__PURE__*/React__default.createElement("div", {
467
- className: "p-2 px-4 hover:bg-gray-100"
468
- }, brand.name));
343
+ var formatPrice = function formatPrice(price) {
344
+ var formatter = new Intl.NumberFormat(undefined, {
345
+ minimumFractionDigits: 0,
346
+ maximumFractionDigits: 2
347
+ });
348
+ return "".concat(currencySymbol).concat(formatter.format(price));
349
+ };
350
+
351
+ var renderProductCard = function renderProductCard(product) {
352
+ var selectedPrice = product.prices ? product.prices.find(function (p) {
353
+ return p.currency === currency;
354
+ }) : {
355
+ price: product.price,
356
+ retail_price: product.est_retail_price
357
+ };
358
+ return /*#__PURE__*/React__default.createElement("a", {
359
+ key: product.link,
360
+ href: product.link,
361
+ className: "product-card"
362
+ }, product.featured_image && /*#__PURE__*/React__default.createElement("div", {
363
+ className: "product-card__image-container"
364
+ }, /*#__PURE__*/React__default.createElement("img", {
365
+ src: product.featured_image,
366
+ alt: product.name,
367
+ className: "product-card__image"
469
368
  })), /*#__PURE__*/React__default.createElement("div", {
470
- className: "w-full lg:w-2/3"
471
- }, /*#__PURE__*/React__default.createElement("p", {
472
- className: "font-bold p-2 px-4"
473
- }, "Products"), searchResults.products.map(function (product) {
474
- return /*#__PURE__*/React__default.createElement("a", {
475
- key: product.link,
476
- href: product.link
477
- }, /*#__PURE__*/React__default.createElement("div", {
478
- className: "p-2 px-4 hover:bg-gray-100"
479
- }, product.name));
480
- }), /*#__PURE__*/React__default.createElement("button", {
481
- type: "button",
482
- onClick: function onClick() {
483
- onViewAll();
369
+ className: "product-card__details"
370
+ }, /*#__PURE__*/React__default.createElement("h3", {
371
+ className: "product-card__name"
372
+ }, shouldShowInitialData ? /*#__PURE__*/React__default.createElement("span", null, /*#__PURE__*/React__default.createElement("span", {
373
+ className: "product-card__brand-name"
374
+ }, product.brand.toUpperCase()), ' ', product.name) : product.name), /*#__PURE__*/React__default.createElement("div", {
375
+ className: "product-card__info-row"
376
+ }, /*#__PURE__*/React__default.createElement("div", {
377
+ className: "product-card__price-group"
378
+ }, /*#__PURE__*/React__default.createElement("div", {
379
+ className: "product-card__price"
380
+ }, formatPrice(selectedPrice.price)), selectedPrice.retail_price > 1 && /*#__PURE__*/React__default.createElement("div", {
381
+ className: "product-card__retail-price"
382
+ }, "Est. Retail: ", formatPrice(selectedPrice.retail_price))), /*#__PURE__*/React__default.createElement("div", {
383
+ className: "product-card__condition"
384
+ }, /*#__PURE__*/React__default.createElement("span", {
385
+ className: "product-card__condition-label"
386
+ }, "Condition:"), product.condition))));
387
+ };
388
+
389
+ var getBrandLink = function getBrandLink(brand) {
390
+ return "/products/brands/".concat(brand.slug);
391
+ };
392
+
393
+ var limitBrands = function limitBrands(brands) {
394
+ if (isMobile && brands && brands.length > 4) {
395
+ return brands.slice(0, 4);
396
+ }
397
+
398
+ return brands;
399
+ };
400
+
401
+ return /*#__PURE__*/React__default.createElement("div", {
402
+ className: "search-results",
403
+ ref: searchResultsRef
404
+ }, /*#__PURE__*/React__default.createElement("div", {
405
+ className: "search-results__section"
406
+ }, /*#__PURE__*/React__default.createElement("h2", {
407
+ className: "search-results__header"
408
+ }, shouldShowInitialData ? 'TRENDING SEARCHES' : 'BRANDS'), /*#__PURE__*/React__default.createElement("div", {
409
+ className: "search-results__list"
410
+ }, shouldShowInitialData ? (_limitBrands = limitBrands(initialSearchData === null || initialSearchData === void 0 ? void 0 : initialSearchData.trending_brands)) === null || _limitBrands === void 0 ? void 0 : _limitBrands.map(function (brand) {
411
+ return /*#__PURE__*/React__default.createElement("a", {
412
+ key: brand.id,
413
+ href: getBrandLink(brand),
414
+ className: "search-results__item"
415
+ }, brand.name);
416
+ }) : (_limitBrands2 = limitBrands(searchResults === null || searchResults === void 0 ? void 0 : searchResults.brands)) === null || _limitBrands2 === void 0 ? void 0 : _limitBrands2.map(function (brand) {
417
+ return /*#__PURE__*/React__default.createElement("a", {
418
+ key: brand.link,
419
+ href: brand.link,
420
+ className: "search-results__item"
421
+ }, brand.name);
422
+ }))), /*#__PURE__*/React__default.createElement("div", {
423
+ className: "search-results__section"
424
+ }, /*#__PURE__*/React__default.createElement("div", {
425
+ className: "search-results__section-header"
426
+ }, /*#__PURE__*/React__default.createElement("h2", {
427
+ className: "search-results__header"
428
+ }, shouldShowInitialData ? 'POPULAR' : 'TOP MATCHES'), /*#__PURE__*/React__default.createElement("button", {
429
+ type: "button",
430
+ className: "search-results__view-all-link",
431
+ onClick: function onClick() {
432
+ onViewAll();
433
+ }
434
+ }, "View all items")), /*#__PURE__*/React__default.createElement("div", {
435
+ className: "search-results__product-list"
436
+ }, shouldShowInitialData ? initialSearchData === null || initialSearchData === void 0 ? void 0 : (_initialSearchData$la2 = initialSearchData.latest_products) === null || _initialSearchData$la2 === void 0 ? void 0 : _initialSearchData$la2.map(renderProductCard) : searchResults === null || searchResults === void 0 ? void 0 : (_searchResults$produc3 = searchResults.products) === null || _searchResults$produc3 === void 0 ? void 0 : _searchResults$produc3.map(renderProductCard)), /*#__PURE__*/React__default.createElement("button", {
437
+ type: "button",
438
+ className: "search-results__view-all-button",
439
+ onClick: function onClick() {
440
+ onViewAll();
441
+
442
+ if (!shouldShowInitialData) {
484
443
  onSearchSubmit(searchValue);
485
444
  setSearchValue('');
486
- },
487
- className: "bottom-0 mt-5 py-3 w-full font-body text-center text-white uppercase bg-black hover:bg-gray-950 border border-black transition-all ease-in-out duration-300 cursor-pointer"
488
- }, "View all"))));
489
- }
490
- return null;
445
+ setIsSearchFocused(false);
446
+ }
447
+ }
448
+ }, "View all items")));
491
449
  };
492
450
 
493
451
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
494
-
495
452
  /* position relative is required for the Body element to be positioned correctly */
453
+
496
454
  var relativeInlineStyle = styled.css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n"])));
497
455
  var topMiddleBodyStyle = styled.css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: absolute;\n z-index: 1;\n bottom: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n"])));
498
456
  var getTopMiddleArrowAfterStyle = function getTopMiddleArrowAfterStyle(props) {
@@ -506,31 +464,40 @@
506
464
  };
507
465
 
508
466
  var _templateObject$1;
467
+
509
468
  var getBodyStyle = function getBodyStyle() {
510
469
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
511
470
  var _props$toolTipPositio = props.toolTipPosition,
512
- toolTipPosition = _props$toolTipPositio === void 0 ? '' : _props$toolTipPositio;
471
+ toolTipPosition = _props$toolTipPositio === void 0 ? '' : _props$toolTipPositio;
472
+
513
473
  switch (toolTipPosition) {
514
474
  case 'top':
515
475
  return topMiddleBodyStyle;
476
+
516
477
  case 'bottom':
517
478
  return getBottomMiddleBodyStyle(props);
479
+
518
480
  default:
519
481
  return null;
520
482
  }
521
483
  };
484
+
522
485
  var getAfterStyling = function getAfterStyling() {
523
486
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
524
487
  var toolTipPosition = props.toolTipPosition;
488
+
525
489
  switch (toolTipPosition) {
526
490
  case 'top':
527
491
  return getTopMiddleArrowAfterStyle(props);
492
+
528
493
  case 'bottom':
529
494
  return getBottomMiddleArrowAfterStyle(props);
495
+
530
496
  default:
531
497
  return '';
532
498
  }
533
499
  };
500
+
534
501
  var Body = styled__default.span(_templateObject$1 || (_templateObject$1 = _taggedTemplateLiteral(["\n ", ";\n visibility: hidden;\n opacity: 0;\n width: ", ";\n transition: visibility 0.3s linear, opacity 0.3s linear;\n background-color: ", ";\n color: white;\n text-align: center;\n border-radius: 5px;\n ", "\n &::after {\n content: ' ';\n position: absolute;\n ", "\n }\n"])), relativeInlineStyle, function (props) {
535
502
  return props.bodyWidth;
536
503
  }, function (props) {
@@ -610,12 +577,12 @@
610
577
 
611
578
  var Tooltip = function Tooltip(_ref) {
612
579
  var children = _ref.children,
613
- toolTipText = _ref.toolTipText,
614
- toolTipPosition = _ref.toolTipPosition,
615
- bodyWidth = _ref.bodyWidth,
616
- apexWidth = _ref.apexWidth,
617
- containerClassName = _ref.containerClassName,
618
- bodyClassName = _ref.bodyClassName;
580
+ toolTipText = _ref.toolTipText,
581
+ toolTipPosition = _ref.toolTipPosition,
582
+ bodyWidth = _ref.bodyWidth,
583
+ apexWidth = _ref.apexWidth,
584
+ containerClassName = _ref.containerClassName,
585
+ bodyClassName = _ref.bodyClassName;
619
586
  return /*#__PURE__*/React__default.createElement(Container, {
620
587
  className: containerClassName
621
588
  }, children, /*#__PURE__*/React__default.createElement(Body, {
@@ -625,6 +592,7 @@
625
592
  className: bodyClassName
626
593
  }, toolTipText));
627
594
  };
595
+
628
596
  Tooltip.defaultProps = {
629
597
  children: null,
630
598
  toolTipText: '',
@@ -638,21 +606,25 @@
638
606
 
639
607
  var CurrencySelect = function CurrencySelect(_ref) {
640
608
  var currency = _ref.currency,
641
- currencyOptions = _ref.currencyOptions,
642
- onCurrencyChange = _ref.onCurrencyChange,
643
- _ref$isCurrencySelect = _ref.isCurrencySelectionDisabled,
644
- isCurrencySelectionDisabled = _ref$isCurrencySelect === void 0 ? false : _ref$isCurrencySelect,
645
- _ref$tooltipContent = _ref.tooltipContent,
646
- tooltipContent = _ref$tooltipContent === void 0 ? '' : _ref$tooltipContent;
609
+ currencyOptions = _ref.currencyOptions,
610
+ onCurrencyChange = _ref.onCurrencyChange,
611
+ _ref$isCurrencySelect = _ref.isCurrencySelectionDisabled,
612
+ isCurrencySelectionDisabled = _ref$isCurrencySelect === void 0 ? false : _ref$isCurrencySelect,
613
+ _ref$tooltipContent = _ref.tooltipContent,
614
+ tooltipContent = _ref$tooltipContent === void 0 ? '' : _ref$tooltipContent;
615
+
647
616
  if (!currencyOptions || currencyOptions.length === 0) {
648
617
  return null;
649
618
  }
619
+
650
620
  var selectedOption = currencyOptions.find(function (opt) {
651
621
  return opt.value === currency;
652
622
  });
623
+
653
624
  if (!selectedOption) {
654
625
  return null;
655
626
  }
627
+
656
628
  return /*#__PURE__*/React__default.createElement(Tooltip$1, {
657
629
  toolTipText: isCurrencySelectionDisabled ? tooltipContent : '',
658
630
  toolTipPosition: "bottom",
@@ -679,151 +651,323 @@
679
651
  }))));
680
652
  };
681
653
 
682
- var LuxityDesktopHeader = function LuxityDesktopHeader(_ref) {
683
- var accountIcon = _ref.accountIcon,
684
- cartIcon = _ref.cartIcon,
685
- interestIcon = _ref.interestIcon,
686
- cartCount = _ref.cartCount,
687
- logoSrc = _ref.logoSrc,
688
- categoryElements = _ref.categoryElements,
689
- newBrandsImage = _ref.newBrandsImage,
690
- bagsImage = _ref.bagsImage,
691
- shoesImage = _ref.shoesImage,
692
- clothingImage = _ref.clothingImage,
693
- accessoriesImage = _ref.accessoriesImage,
694
- watchesImage = _ref.watchesImage,
695
- stores = _ref.stores,
696
- contactNumber = _ref.contactNumber,
697
- productsUrl = _ref.productsUrl,
698
- LinkComponent = _ref.LinkComponent,
699
- onInterestClick = _ref.onInterestClick,
700
- onCartClick = _ref.onCartClick,
701
- onAccountClick = _ref.onAccountClick,
702
- inputSearchIcon = _ref.inputSearchIcon,
703
- onSearch = _ref.onSearch,
704
- onSellToUsClick = _ref.onSellToUsClick,
705
- contactUsLink = _ref.contactUsLink,
706
- ourStoryLink = _ref.ourStoryLink,
707
- onLogoClick = _ref.onLogoClick,
708
- endpoint = _ref.endpoint,
709
- menuData = _ref.menuData,
710
- onSearchSubmit = _ref.onSearchSubmit,
711
- onProductIdsReceived = _ref.onProductIdsReceived,
712
- currency = _ref.currency,
713
- currencyOptions = _ref.currencyOptions,
714
- onCurrencyChange = _ref.onCurrencyChange,
715
- isCurrencySelectionDisabled = _ref.isCurrencySelectionDisabled,
716
- tooltipContent = _ref.tooltipContent,
717
- earlyAccessIcon = _ref.earlyAccessIcon,
718
- exclusiveIcon = _ref.exclusiveIcon,
719
- name = _ref.name,
720
- isEarlyAccess = _ref.isEarlyAccess,
721
- isExclusive = _ref.isExclusive,
722
- shop = _ref.shop,
723
- app = _ref.app;
724
- var _useState = React.useState(''),
725
- _useState2 = _slicedToArray(_useState, 2),
726
- searchValue = _useState2[0],
727
- setSearchValue = _useState2[1];
728
- var _useState3 = React.useState(false),
729
- _useState4 = _slicedToArray(_useState3, 2),
730
- loading = _useState4[0],
731
- setLoading = _useState4[1];
732
- var _useState5 = React.useState({
733
- latestArrivals: [],
734
- bags: [],
735
- shoes: [],
736
- clothing: [],
737
- accessories: [],
738
- watches: [],
739
- accessoriesCategories: [],
740
- apparelStyles: []
741
- }),
742
- _useState6 = _slicedToArray(_useState5, 2),
743
- dropdownData = _useState6[0],
744
- setDropdownData = _useState6[1];
745
- var _useState7 = React.useState(false),
746
- _useState8 = _slicedToArray(_useState7, 2),
747
- hasError = _useState8[0],
748
- setHasError = _useState8[1];
749
- var _useState9 = React.useState(false),
750
- _useState10 = _slicedToArray(_useState9, 2),
751
- searchLoading = _useState10[0],
752
- setSearchLoading = _useState10[1];
753
- var _useState11 = React.useState({
754
- brands: [],
755
- products: []
756
- }),
757
- _useState12 = _slicedToArray(_useState11, 2),
758
- searchResults = _useState12[0],
759
- setSearchResults = _useState12[1];
760
- var searchResultsRef = React.useRef(null);
761
- var debounce = function debounce(func, wait) {
654
+ var searchProducts = function searchProducts(search, limit, currencyCode) {
655
+ return {
656
+ query: "\n query SearchProducts($search: String!, $limit: Int!, $currencyCode: String!) {\n luxity_products_serach_results(search: $search, limit: $limit, currency_code: $currencyCode) {\n brands {\n name\n link\n }\n products {\n name\n link\n price\n est_retail_price\n condition\n featured_image\n }\n luxity_product_ids\n }\n }\n ",
657
+ variables: {
658
+ search: search,
659
+ limit: limit,
660
+ currencyCode: currencyCode
661
+ }
662
+ };
663
+ };
664
+
665
+ var useSearch = function useSearch(_ref) {
666
+ var endpoint = _ref.endpoint,
667
+ onProductIdsReceived = _ref.onProductIdsReceived,
668
+ currency = _ref.currency;
669
+ var currentSearchRequestToken = React.useRef(null);
670
+ var debounce = React.useCallback(function (func, wait) {
762
671
  var timeout;
763
672
  return function executedFunction() {
764
673
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
765
674
  args[_key] = arguments[_key];
766
675
  }
676
+
767
677
  var later = function later() {
768
678
  clearTimeout(timeout);
769
679
  func.apply(void 0, args);
770
680
  };
681
+
771
682
  clearTimeout(timeout);
772
683
  timeout = setTimeout(later, wait);
773
684
  };
774
- };
775
- var debouncedSearch = React.useCallback(debounce(function (nextValue) {
776
- setSearchLoading(true);
777
- axios.post(endpoint, searchProducts(nextValue, 6)).then(function (response) {
778
- setSearchResults(response.data.data.luxity_products_serach_results);
779
- var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
780
- onProductIdsReceived(ids);
781
- setSearchLoading(false);
685
+ }, []);
686
+ var fetchInitialSearchData = React.useCallback(function (initialSearchDataUrl, setInitialSearchView) {
687
+ axios.get("".concat(initialSearchDataUrl)).then(function (_ref2) {
688
+ var data = _ref2.data;
689
+ setInitialSearchView({
690
+ trending_brands: data.trending_brands,
691
+ latest_products: data.latest_products
692
+ });
782
693
  }).catch(function () {
783
- setSearchLoading(false);
694
+ setInitialSearchView({
695
+ trending_brands: [],
696
+ latest_products: []
697
+ });
784
698
  });
785
- }, 500), [endpoint]);
786
- var immediateSearch = React.useCallback(function (value) {
787
- setSearchValue('');
788
- setSearchResults({
789
- brands: [],
790
- products: []
699
+ }, []);
700
+ var performSearch = React.useCallback(function (searchQuery, setSearchResults) {
701
+ if (!searchQuery || searchQuery.trim() === '') {
702
+ setSearchResults({
703
+ brands: [],
704
+ products: [],
705
+ luxity_product_ids: []
706
+ });
707
+ return;
708
+ } // Cancel any ongoing search request to prevent race conditions
709
+
710
+
711
+ if (currentSearchRequestToken.current) {
712
+ currentSearchRequestToken.current.cancel();
713
+ } // Create a new token for this specific search request
714
+
715
+
716
+ var newSearchToken = axios.CancelToken.source();
717
+ currentSearchRequestToken.current = newSearchToken;
718
+ axios.post(endpoint, searchProducts(searchQuery, 3, currency), {
719
+ cancelToken: newSearchToken.token
720
+ }).then(function (response) {
721
+ if (currentSearchRequestToken.current === newSearchToken) {
722
+ var searchResults = response.data.data.luxity_products_serach_results;
723
+ setSearchResults(searchResults);
724
+
725
+ if (searchResults && searchResults.luxity_product_ids) {
726
+ onProductIdsReceived(searchResults.luxity_product_ids);
727
+ }
728
+
729
+ currentSearchRequestToken.current = null;
730
+ }
731
+ }).catch(function (error) {
732
+ if (!axios.isCancel(error)) {
733
+ setSearchResults({
734
+ brands: [],
735
+ products: [],
736
+ luxity_product_ids: []
737
+ });
738
+ currentSearchRequestToken.current = null;
739
+ }
791
740
  });
792
- onSearchSubmit(value);
793
- }, [onSearchSubmit]);
794
- var handleChange = function handleChange(event) {
795
- var value = event.target.value;
796
- setSearchValue(value);
797
- if (value.trim().length >= 3) {
798
- debouncedSearch(value);
799
- } else {
741
+ }, [endpoint, currency, onProductIdsReceived]);
742
+ var debouncedSearch = React.useMemo(function () {
743
+ return debounce(function (searchQuery, setSearchResults) {
744
+ return performSearch(searchQuery, setSearchResults);
745
+ }, 500);
746
+ }, [debounce, performSearch]);
747
+ var createDebouncedSearch = React.useCallback(function (setSearchResults) {
748
+ return function (searchQuery) {
749
+ return debouncedSearch(searchQuery, setSearchResults);
750
+ };
751
+ }, [debouncedSearch]);
752
+ var createImmediateSearch = React.useCallback(function (setSearchValue, setSearchResults, onSearchSubmit) {
753
+ return function (searchQuery) {
754
+ /*
755
+ * Cancel any pending search request when immediate search is performed
756
+ * Immediate search is when the user types a search query and presses enter
757
+ */
758
+ if (currentSearchRequestToken.current) {
759
+ currentSearchRequestToken.current.cancel();
760
+ currentSearchRequestToken.current = null;
761
+ }
762
+
763
+ setSearchValue('');
800
764
  setSearchResults({
801
765
  brands: [],
802
766
  products: []
803
767
  });
804
- }
768
+ onSearchSubmit(searchQuery);
769
+ };
770
+ }, []);
771
+ return {
772
+ fetchInitialSearchData: fetchInitialSearchData,
773
+ createDebouncedSearch: createDebouncedSearch,
774
+ createImmediateSearch: createImmediateSearch
805
775
  };
776
+ };
777
+
778
+ var useSearchClickOutside = function useSearchClickOutside(ref, searchResults, setCachedResults, setIsSearchFocused, setSearchResults) {
806
779
  React.useEffect(function () {
807
780
  var handleClickOutside = function handleClickOutside(event) {
808
- if (searchResultsRef.current && !searchResultsRef.current.contains(event.target)) {
809
- setSearchValue('');
781
+ if (ref.current && !ref.current.contains(event.target)) {
782
+ setCachedResults(searchResults);
783
+ setIsSearchFocused(false);
784
+ setSearchResults({
785
+ brands: [],
786
+ products: []
787
+ });
810
788
  }
811
789
  };
790
+
812
791
  document.addEventListener('mousedown', handleClickOutside);
813
792
  return function () {
814
793
  document.removeEventListener('mousedown', handleClickOutside);
815
794
  };
816
- }, []);
817
- var handleKeyDown = function handleKeyDown(event) {
795
+ }, [ref, searchResults, setCachedResults, setIsSearchFocused, setSearchResults]);
796
+ };
797
+ var useSearchInputChange = function useSearchInputChange(setSearchValue, setIsSearchFocused, debouncedSearch, setSearchResults, setCachedResults) {
798
+ return React.useCallback(function (event) {
799
+ var value = event.target.value;
800
+ setSearchValue(value);
801
+ setIsSearchFocused(true);
802
+
803
+ if (value.trim().length >= 3) {
804
+ debouncedSearch(value);
805
+ } else {
806
+ setSearchResults({
807
+ brands: [],
808
+ products: []
809
+ });
810
+ setCachedResults({
811
+ brands: [],
812
+ products: []
813
+ });
814
+ }
815
+ }, [setSearchValue, setIsSearchFocused, debouncedSearch, setSearchResults, setCachedResults]);
816
+ };
817
+ var useSearchInputFocus = function useSearchInputFocus(searchValue, setIsSearchFocused, cachedResults, setSearchResults) {
818
+ var handleSearchClick = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;
819
+ return React.useCallback(function () {
820
+ setIsSearchFocused(true);
821
+
822
+ if (typeof handleSearchClick === 'function') {
823
+ handleSearchClick();
824
+ } else if (searchValue.trim().length >= 3) {
825
+ setSearchResults(cachedResults);
826
+ }
827
+ }, [searchValue, setIsSearchFocused, cachedResults, setSearchResults, handleSearchClick]);
828
+ };
829
+ var useSearchInputKeyDown = function useSearchInputKeyDown(searchValue, immediateSearch, setIsSearchFocused) {
830
+ var setSearchValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
831
+ return React.useCallback(function (event) {
818
832
  if (event.key === 'Enter') {
819
833
  event.preventDefault();
834
+
820
835
  if (searchValue.trim().length >= 3) {
821
836
  immediateSearch(searchValue);
822
837
  }
823
- } else if (event.key === 'Escape') {
838
+
839
+ setIsSearchFocused(false);
840
+ } else if (event.key === 'Escape' && setSearchValue) {
824
841
  setSearchValue('');
842
+ setIsSearchFocused(false);
825
843
  }
844
+ }, [searchValue, immediateSearch, setIsSearchFocused, setSearchValue]);
845
+ };
846
+
847
+ var removeCategoryByName = function removeCategoryByName(categories, name) {
848
+ var _categories$filter;
849
+
850
+ return (_categories$filter = categories === null || categories === void 0 ? void 0 : categories.filter(function (category) {
851
+ return category.name.toLowerCase() !== name.toLowerCase();
852
+ })) !== null && _categories$filter !== void 0 ? _categories$filter : [];
853
+ };
854
+
855
+ var LuxityDesktopHeader = function LuxityDesktopHeader(_ref) {
856
+ var accountIcon = _ref.accountIcon,
857
+ cartIcon = _ref.cartIcon,
858
+ interestIcon = _ref.interestIcon,
859
+ cartCount = _ref.cartCount,
860
+ logoSrc = _ref.logoSrc,
861
+ categoryElements = _ref.categoryElements,
862
+ stores = _ref.stores,
863
+ contactNumber = _ref.contactNumber,
864
+ productsUrl = _ref.productsUrl,
865
+ LinkComponent = _ref.LinkComponent,
866
+ onInterestClick = _ref.onInterestClick,
867
+ onCartClick = _ref.onCartClick,
868
+ onAccountClick = _ref.onAccountClick,
869
+ inputSearchIcon = _ref.inputSearchIcon,
870
+ onSellToUsClick = _ref.onSellToUsClick,
871
+ contactUsLink = _ref.contactUsLink,
872
+ ourStoryLink = _ref.ourStoryLink,
873
+ onLogoClick = _ref.onLogoClick,
874
+ endpoint = _ref.endpoint,
875
+ initialSearchData = _ref.initialSearchData,
876
+ onSearchSubmit = _ref.onSearchSubmit,
877
+ onSearchClick = _ref.onSearchClick,
878
+ onProductIdsReceived = _ref.onProductIdsReceived,
879
+ currency = _ref.currency,
880
+ currencySymbol = _ref.currencySymbol,
881
+ currencyOptions = _ref.currencyOptions,
882
+ onCurrencyChange = _ref.onCurrencyChange,
883
+ isCurrencySelectionDisabled = _ref.isCurrencySelectionDisabled,
884
+ tooltipContent = _ref.tooltipContent,
885
+ vipIcon = _ref.vipIcon,
886
+ name = _ref.name,
887
+ isVip = _ref.isVip,
888
+ shop = _ref.shop,
889
+ app = _ref.app,
890
+ categoryConfig = _ref.categoryConfig;
891
+
892
+ var _useSearch = useSearch({
893
+ endpoint: endpoint,
894
+ onProductIdsReceived: onProductIdsReceived,
895
+ currency: currency
896
+ }),
897
+ fetchInitialSearchData = _useSearch.fetchInitialSearchData,
898
+ createDebouncedSearch = _useSearch.createDebouncedSearch,
899
+ createImmediateSearch = _useSearch.createImmediateSearch;
900
+
901
+ var _useState = React.useState(''),
902
+ _useState2 = _slicedToArray(_useState, 2),
903
+ searchValue = _useState2[0],
904
+ setSearchValue = _useState2[1];
905
+
906
+ var _useState3 = React.useState(false),
907
+ _useState4 = _slicedToArray(_useState3, 2),
908
+ loading = _useState4[0],
909
+ setLoading = _useState4[1];
910
+
911
+ var _useState5 = React.useState(false),
912
+ _useState6 = _slicedToArray(_useState5, 2),
913
+ isSearchFocused = _useState6[0],
914
+ setIsSearchFocused = _useState6[1];
915
+
916
+ var _useState7 = React.useState({
917
+ trending_brands: [],
918
+ latest_products: []
919
+ }),
920
+ _useState8 = _slicedToArray(_useState7, 2),
921
+ initialSearchView = _useState8[0],
922
+ setInitialSearchView = _useState8[1];
923
+
924
+ var _useState9 = React.useState({}),
925
+ _useState10 = _slicedToArray(_useState9, 2),
926
+ dropdownData = _useState10[0],
927
+ setDropdownData = _useState10[1];
928
+
929
+ var _useState11 = React.useState(false),
930
+ _useState12 = _slicedToArray(_useState11, 2),
931
+ hasError = _useState12[0],
932
+ setHasError = _useState12[1];
933
+
934
+ var _useState13 = React.useState({
935
+ brands: [],
936
+ products: []
937
+ }),
938
+ _useState14 = _slicedToArray(_useState13, 2),
939
+ searchResults = _useState14[0],
940
+ setSearchResults = _useState14[1];
941
+
942
+ var _useState15 = React.useState({
943
+ brands: [],
944
+ products: []
945
+ }),
946
+ _useState16 = _slicedToArray(_useState15, 2),
947
+ cachedResults = _useState16[0],
948
+ setCachedResults = _useState16[1];
949
+
950
+ var searchResultsRef = React.useRef(null);
951
+ var debouncedSearch = createDebouncedSearch(function (results) {
952
+ setSearchResults(results);
953
+ setCachedResults(results);
954
+ });
955
+ var immediateSearch = createImmediateSearch(setSearchValue, setSearchResults, onSearchSubmit);
956
+ var handleChange = useSearchInputChange(setSearchValue, setIsSearchFocused, debouncedSearch, setSearchResults, setCachedResults);
957
+ useSearchClickOutside(searchResultsRef, searchResults, setCachedResults, setIsSearchFocused, setSearchResults);
958
+
959
+ var handleSearchClick = function handleSearchClick() {
960
+ if (typeof onSearchClick === 'function') {
961
+ onSearchClick();
962
+ return;
963
+ }
964
+
965
+ handleSearchFocus();
826
966
  };
967
+
968
+ var handleSearchFocus = useSearchInputFocus(searchValue, setIsSearchFocused, cachedResults, setSearchResults, onSearchClick);
969
+ var handleKeyDown = useSearchInputKeyDown(searchValue, immediateSearch, setIsSearchFocused);
970
+
827
971
  function addCategoryToElements(elements, categoryName) {
828
972
  return elements.map(function (element) {
829
973
  return _objectSpread2(_objectSpread2({}, element), {}, {
@@ -831,32 +975,67 @@
831
975
  });
832
976
  });
833
977
  }
978
+
834
979
  React.useMemo(function () {
835
980
  setLoading(true);
836
- axios.get("".concat(menuData)).then(function (_ref2) {
981
+ axios.get("".concat(categoryConfig.menuData)).then(function (_ref2) {
837
982
  var data = _ref2.data;
838
983
  setLoading(false);
839
- setDropdownData(function (prev) {
840
- return _objectSpread2(_objectSpread2({}, prev), {}, {
841
- latestArrivals: data.latest_arrivals,
842
- bags: data.bags,
843
- shoes: data.shoes,
844
- apparel: data.apparel,
845
- accessories: data.accessories,
846
- watches: data.watches,
847
- accessoriesCategories: data.accessories_categories,
848
- apparelStyles: data.apparel_styles
849
- });
850
- });
984
+ setDropdownData(data);
851
985
  }).catch(function () {
852
986
  return setHasError(true);
853
987
  });
854
- }, [menuData]);
855
- var getMarginRight = function getMarginRight(showLoyaltyIcon, userName) {
856
- if (showLoyaltyIcon) return '15px';
988
+ }, [categoryConfig.menuData]);
989
+ React.useMemo(function () {
990
+ if (!initialSearchData) {
991
+ return;
992
+ }
993
+
994
+ fetchInitialSearchData(initialSearchData, setInitialSearchView);
995
+ }, [initialSearchData, fetchInitialSearchData]);
996
+
997
+ var renderDropdownLinks = function renderDropdownLinks() {
998
+ return categoryConfig.categories.map(function (category) {
999
+ var title = category.title,
1000
+ imageSrc = category.imageSrc,
1001
+ categorySlug = category.categorySlug,
1002
+ categoryName = category.categoryName,
1003
+ elementsKey = category.elementsKey,
1004
+ subCategoryElementsKey = category.subCategoryElementsKey,
1005
+ styleElementsKey = category.styleElementsKey;
1006
+ var categoryElementsProcessed = categoryElements;
1007
+
1008
+ if (subCategoryElementsKey && dropdownData[subCategoryElementsKey]) {
1009
+ // show subcategory elements
1010
+ categoryElementsProcessed = removeCategoryByName(dropdownData[subCategoryElementsKey], categoryName);
1011
+ } else if (styleElementsKey && dropdownData[styleElementsKey]) {
1012
+ categoryElementsProcessed = addCategoryToElements(dropdownData[styleElementsKey], categorySlug);
1013
+ } else {
1014
+ categoryElementsProcessed = addCategoryToElements(categoryElementsProcessed, categorySlug);
1015
+ }
1016
+
1017
+ return /*#__PURE__*/React__default.createElement(DropdownLink, {
1018
+ key: categorySlug,
1019
+ title: title,
1020
+ imageSrc: imageSrc,
1021
+ categoryElements: categoryElementsProcessed,
1022
+ brandElements: dropdownData[elementsKey] || [],
1023
+ productsUrl: productsUrl,
1024
+ categorySlug: categorySlug,
1025
+ categoryTitle: categoryName,
1026
+ isLoading: loading,
1027
+ hasError: hasError,
1028
+ LinkComponent: LinkComponent
1029
+ });
1030
+ });
1031
+ };
1032
+
1033
+ var getMarginRight = function getMarginRight(userIsVip, userName) {
1034
+ if (userIsVip) return '15px';
857
1035
  if (userName) return '5px';
858
1036
  return '18px';
859
1037
  };
1038
+
860
1039
  return /*#__PURE__*/React__default.createElement("div", {
861
1040
  className: "navbar"
862
1041
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -869,7 +1048,8 @@
869
1048
  className: "navbar__logo"
870
1049
  }, /*#__PURE__*/React__default.createElement("img", {
871
1050
  src: logoSrc,
872
- alt: "luxity-logo"
1051
+ alt: "luxity-logo",
1052
+ loading: "eager"
873
1053
  }))), /*#__PURE__*/React__default.createElement("div", {
874
1054
  className: "navbar__section"
875
1055
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -887,93 +1067,33 @@
887
1067
  value: searchValue,
888
1068
  onChange: handleChange,
889
1069
  onKeyDown: handleKeyDown,
890
- onClick: onSearch
891
- }), searchLoading && /*#__PURE__*/React__default.createElement(BeatLoader, {
892
- color: "#000000",
893
- loading: searchLoading,
894
- size: 5,
895
- "aria-label": "Loading Spinner",
896
- "data-testid": "loader"
1070
+ onClick: handleSearchClick,
1071
+ onFocus: handleSearchFocus
897
1072
  })), /*#__PURE__*/React__default.createElement(SearchResults, {
898
1073
  searchValue: searchValue,
899
1074
  searchResults: searchResults,
900
1075
  onViewAll: function onViewAll() {
901
1076
  onSearchSubmit(searchValue);
902
1077
  setSearchValue('');
1078
+ setSearchResults({
1079
+ brands: [],
1080
+ products: []
1081
+ });
1082
+ setIsSearchFocused(false);
903
1083
  },
904
1084
  searchResultsRef: searchResultsRef,
905
1085
  onSearchSubmit: onSearchSubmit,
906
- setSearchValue: setSearchValue
1086
+ setSearchValue: setSearchValue,
1087
+ initialSearchData: initialSearchView,
1088
+ isSearchFocused: isSearchFocused,
1089
+ setIsSearchFocused: setIsSearchFocused,
1090
+ currency: currency,
1091
+ currencySymbol: currencySymbol
907
1092
  }), /*#__PURE__*/React__default.createElement("nav", {
908
1093
  className: "navbar__nav-links navbar__nav-links--wrap"
909
- }, /*#__PURE__*/React__default.createElement(DropdownLink, {
910
- title: "New",
911
- imageSrc: newBrandsImage,
912
- categoryElements: categoryElements,
913
- brandElements: dropdownData.latestArrivals,
914
- productsUrl: productsUrl,
915
- categorySlug: "brands",
916
- categoryTitle: "Brands",
917
- isLoading: loading,
918
- hasError: hasError,
919
- LinkComponent: LinkComponent
920
- }), /*#__PURE__*/React__default.createElement(DropdownLink, {
921
- title: "Bags",
922
- imageSrc: bagsImage,
923
- categoryElements: addCategoryToElements(categoryElements, categories.bags.slug),
924
- brandElements: dropdownData.bags,
925
- productsUrl: productsUrl,
926
- categorySlug: categories.bags.slug,
927
- categoryTitle: categories.bags.name,
928
- isLoading: loading,
929
- hasError: hasError,
930
- LinkComponent: LinkComponent
931
- }), /*#__PURE__*/React__default.createElement(DropdownLink, {
932
- title: "Shoes",
933
- imageSrc: shoesImage,
934
- categoryElements: addCategoryToElements(categoryElements, categories.shoes.slug),
935
- brandElements: dropdownData.shoes,
936
- productsUrl: productsUrl,
937
- categorySlug: categories.shoes.slug,
938
- categoryTitle: categories.shoes.name,
939
- isLoading: loading,
940
- hasError: hasError,
941
- LinkComponent: LinkComponent
942
- }), /*#__PURE__*/React__default.createElement(DropdownLink, {
943
- title: "Clothing",
944
- imageSrc: clothingImage,
945
- categoryElements: addCategoryToElements(dropdownData.apparelStyles, categories.clothing.slug),
946
- brandElements: dropdownData.apparel,
947
- productsUrl: productsUrl,
948
- categorySlug: categories.clothing.slug,
949
- categoryTitle: categories.clothing.name,
950
- isLoading: loading,
951
- hasError: hasError,
952
- LinkComponent: LinkComponent
953
- }), /*#__PURE__*/React__default.createElement(DropdownLink, {
954
- title: "Accessories",
955
- imageSrc: accessoriesImage,
956
- categoryElements: removeCategoryByName(dropdownData.accessoriesCategories, 'ACCESSORIES'),
957
- brandElements: dropdownData.accessories,
958
- productsUrl: productsUrl,
959
- categorySlug: categories.accessories.slug,
960
- categoryTitle: categories.accessories.name,
961
- isLoading: loading,
962
- hasError: hasError,
963
- LinkComponent: LinkComponent
964
- }), /*#__PURE__*/React__default.createElement(DropdownLink, {
965
- title: "Watches",
966
- imageSrc: watchesImage,
967
- categoryElements: addCategoryToElements(categoryElements, categories.watches.slug),
968
- brandElements: dropdownData.watches,
969
- productsUrl: productsUrl,
970
- categorySlug: categories.watches.slug,
971
- categoryTitle: categories.watches.name,
972
- isLoading: loading,
973
- hasError: hasError,
974
- LinkComponent: LinkComponent
975
- }), /*#__PURE__*/React__default.createElement("li", {
976
- className: "navbar__link"
1094
+ }, renderDropdownLinks(), !!stores.length && /*#__PURE__*/React__default.createElement("li", {
1095
+ className: "navbar__link",
1096
+ key: "Stores"
977
1097
  }, /*#__PURE__*/React__default.createElement(LinkComponent, {
978
1098
  href: contactUsLink,
979
1099
  className: "navbar__link-item navbar__link-item--desktop"
@@ -997,23 +1117,17 @@
997
1117
  className: "navbar__icon relative flex",
998
1118
  onClick: onAccountClick,
999
1119
  style: {
1000
- marginRight: getMarginRight(isEarlyAccess || isExclusive, name)
1120
+ marginRight: getMarginRight(isVip, name)
1001
1121
  }
1002
1122
  }, /*#__PURE__*/React__default.createElement("img", {
1003
1123
  src: accountIcon,
1004
1124
  alt: "account-icon",
1005
1125
  width: 20,
1006
1126
  height: 20
1007
- }), isEarlyAccess && /*#__PURE__*/React__default.createElement("img", {
1008
- src: earlyAccessIcon,
1009
- alt: "loyalty-icon",
1010
- className: "navbar__loyalty-icon",
1011
- width: 16,
1012
- height: 16
1013
- }), isExclusive && /*#__PURE__*/React__default.createElement("img", {
1014
- src: exclusiveIcon,
1015
- alt: "loyalty-icon",
1016
- className: "navbar__loyalty-icon",
1127
+ }), isVip && /*#__PURE__*/React__default.createElement("img", {
1128
+ src: vipIcon,
1129
+ alt: "vip-icon",
1130
+ className: "navbar__vip-icon",
1017
1131
  width: 16,
1018
1132
  height: 16
1019
1133
  })), name && /*#__PURE__*/React__default.createElement("button", {
@@ -1022,7 +1136,7 @@
1022
1136
  onClick: onAccountClick
1023
1137
  }, /*#__PURE__*/React__default.createElement("span", {
1024
1138
  className: "text-sm"
1025
- }, name))), /*#__PURE__*/React__default.createElement("button", {
1139
+ }, name))), onInterestClick && /*#__PURE__*/React__default.createElement("button", {
1026
1140
  type: "button",
1027
1141
  className: "".concat(app ? 'navbar__icon--app' : 'navbar__icon'),
1028
1142
  onClick: onInterestClick