@bonlineza/luxity-lib 2.32.7 → 2.32.8

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.
@@ -107,6 +107,133 @@
107
107
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
108
108
  }
109
109
 
110
+ var cssUnit = {
111
+ cm: true,
112
+ mm: true,
113
+ in: true,
114
+ px: true,
115
+ pt: true,
116
+ pc: true,
117
+ em: true,
118
+ ex: true,
119
+ ch: true,
120
+ rem: true,
121
+ vw: true,
122
+ vh: true,
123
+ vmin: true,
124
+ vmax: true,
125
+ "%": true,
126
+ };
127
+ /**
128
+ * If size is a number, append px to the value as default unit.
129
+ * If size is a string, validate against list of valid units.
130
+ * If unit is valid, return size as is.
131
+ * If unit is invalid, console warn issue, replace with px as the unit.
132
+ *
133
+ * @param {(number | string)} size
134
+ * @return {LengthObject} LengthObject
135
+ */
136
+ function parseLengthAndUnit(size) {
137
+ if (typeof size === "number") {
138
+ return {
139
+ value: size,
140
+ unit: "px",
141
+ };
142
+ }
143
+ var value;
144
+ var valueString = (size.match(/^[0-9.]*/) || "").toString();
145
+ if (valueString.includes(".")) {
146
+ value = parseFloat(valueString);
147
+ }
148
+ else {
149
+ value = parseInt(valueString, 10);
150
+ }
151
+ var unit = (size.match(/[^0-9]*$/) || "").toString();
152
+ if (cssUnit[unit]) {
153
+ return {
154
+ value: value,
155
+ unit: unit,
156
+ };
157
+ }
158
+ console.warn("React Spinners: ".concat(size, " is not a valid css value. Defaulting to ").concat(value, "px."));
159
+ return {
160
+ value: value,
161
+ unit: "px",
162
+ };
163
+ }
164
+ /**
165
+ * Take value as an input and return valid css value
166
+ *
167
+ * @param {(number | string)} value
168
+ * @return {string} valid css value
169
+ */
170
+ function cssValue(value) {
171
+ var lengthWithunit = parseLengthAndUnit(value);
172
+ return "".concat(lengthWithunit.value).concat(lengthWithunit.unit);
173
+ }
174
+
175
+ var createAnimation = function (loaderName, frames, suffix) {
176
+ var animationName = "react-spinners-".concat(loaderName, "-").concat(suffix);
177
+ if (typeof window == "undefined" || !window.document) {
178
+ return animationName;
179
+ }
180
+ var styleEl = document.createElement("style");
181
+ document.head.appendChild(styleEl);
182
+ var styleSheet = styleEl.sheet;
183
+ var keyFrames = "\n @keyframes ".concat(animationName, " {\n ").concat(frames, "\n }\n ");
184
+ if (styleSheet) {
185
+ styleSheet.insertRule(keyFrames, 0);
186
+ }
187
+ return animationName;
188
+ };
189
+
190
+ var __assign = (undefined && undefined.__assign) || function () {
191
+ __assign = Object.assign || function(t) {
192
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
193
+ s = arguments[i];
194
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
195
+ t[p] = s[p];
196
+ }
197
+ return t;
198
+ };
199
+ return __assign.apply(this, arguments);
200
+ };
201
+ var __rest = (undefined && undefined.__rest) || function (s, e) {
202
+ var t = {};
203
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
204
+ t[p] = s[p];
205
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
206
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
207
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
208
+ t[p[i]] = s[p[i]];
209
+ }
210
+ return t;
211
+ };
212
+ var beat = createAnimation("BeatLoader", "50% {transform: scale(0.75);opacity: 0.2} 100% {transform: scale(1);opacity: 1}", "beat");
213
+ function BeatLoader(_a) {
214
+ 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"]);
215
+ var wrapper = __assign({ display: "inherit" }, cssOverride);
216
+ var style = function (i) {
217
+ return {
218
+ display: "inline-block",
219
+ backgroundColor: color,
220
+ width: cssValue(size),
221
+ height: cssValue(size),
222
+ margin: cssValue(margin),
223
+ borderRadius: "100%",
224
+ animation: "".concat(beat, " ").concat(0.7 / speedMultiplier, "s ").concat(i % 2 ? "0s" : "".concat(0.35 / speedMultiplier, "s"), " infinite linear"),
225
+ animationFillMode: "both",
226
+ };
227
+ };
228
+ if (!loading) {
229
+ return null;
230
+ }
231
+ return (React.createElement("span", __assign({ style: wrapper }, additionalprops),
232
+ React.createElement("span", { style: style(1) }),
233
+ React.createElement("span", { style: style(2) }),
234
+ React.createElement("span", { style: style(3) })));
235
+ }
236
+
110
237
  var getBrands = function getBrands() {
111
238
  return {
112
239
  query: "{\n latest_arrivals: luxity_brands(has_products: true, limit: 1000, page: 1, sort_by: \"name|asc\") {data {id name slug}}\n bags: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: BAGS, sort_by: \"name|asc\") {data {id name slug}}\n shoes: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: SHOES, sort_by: \"name|asc\") {data {id name slug}}\n apparel: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: APPAREL, sort_by: \"name|asc\") {data {id name slug}}\n accessories: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: ACCESSORIES, sort_by: \"name|asc\") {data {id name slug}}\n watches: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: WATCHES, sort_by: \"name|asc\") {data {id name slug}}\n accessories_categories: luxity_accessories_categories_list { id name slug }\n apparel_styles: luxity_apparel_styles_list { name slug }\n } "
@@ -259,22 +386,21 @@
259
386
 
260
387
  var SearchResults = function SearchResults(_ref) {
261
388
  var searchValue = _ref.searchValue,
262
- searchLoading = _ref.searchLoading,
263
389
  searchResults = _ref.searchResults,
264
390
  onViewAll = _ref.onViewAll,
265
391
  searchResultsRef = _ref.searchResultsRef,
266
392
  onSearchSubmit = _ref.onSearchSubmit,
267
393
  setSearchValue = _ref.setSearchValue;
268
394
 
269
- if (searchValue.trim() !== '') {
395
+ if (searchValue.trim().length >= 3) {
396
+ if (searchResults.brands.length === 0 && searchResults.products.length === 0) {
397
+ return null;
398
+ }
399
+
270
400
  return /*#__PURE__*/React__default.createElement("div", {
271
401
  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",
272
402
  ref: searchResultsRef
273
- }, searchLoading ? /*#__PURE__*/React__default.createElement("div", {
274
- className: "w-full py-20 flex items-center justify-center"
275
- }, "Searching ...") : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, searchResults.brands.length === 0 && searchResults.products.length === 0 ? /*#__PURE__*/React__default.createElement("div", {
276
- className: "w-full py-20 flex items-center justify-center"
277
- }, "No products found") : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
403
+ }, /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
278
404
  className: "w-full lg:w-1/3"
279
405
  }, /*#__PURE__*/React__default.createElement("p", {
280
406
  className: "font-bold p-2 px-4"
@@ -305,7 +431,7 @@
305
431
  setSearchValue('');
306
432
  },
307
433
  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"
308
- }, "View all")))));
434
+ }, "View all"))));
309
435
  }
310
436
 
311
437
  return null;
@@ -372,7 +498,7 @@
372
498
  hasError = _useState8[0],
373
499
  setHasError = _useState8[1];
374
500
 
375
- var _useState9 = React.useState(true),
501
+ var _useState9 = React.useState(false),
376
502
  _useState10 = _slicedToArray(_useState9, 2),
377
503
  searchLoading = _useState10[0],
378
504
  setSearchLoading = _useState10[1];
@@ -386,6 +512,50 @@
386
512
  setSearchResults = _useState12[1];
387
513
 
388
514
  var searchResultsRef = React.useRef(null);
515
+
516
+ var debounce = function debounce(func, wait) {
517
+ var timeout;
518
+ return function executedFunction() {
519
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
520
+ args[_key] = arguments[_key];
521
+ }
522
+
523
+ var later = function later() {
524
+ clearTimeout(timeout);
525
+ func.apply(void 0, args);
526
+ };
527
+
528
+ clearTimeout(timeout);
529
+ timeout = setTimeout(later, wait);
530
+ };
531
+ };
532
+
533
+ var debouncedSearch = React.useCallback(debounce(function (nextValue) {
534
+ setSearchLoading(true);
535
+ axios.post(endpoint, searchProducts(nextValue, 6)).then(function (response) {
536
+ setSearchResults(response.data.data.luxity_products_serach_results);
537
+ var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
538
+ onProductIdsReceived(ids);
539
+ setSearchLoading(false);
540
+ }).catch(function () {
541
+ setSearchLoading(false);
542
+ });
543
+ }, 500), [endpoint]);
544
+
545
+ var handleChange = function handleChange(event) {
546
+ var value = event.target.value;
547
+ setSearchValue(value);
548
+
549
+ if (value.trim().length >= 3) {
550
+ debouncedSearch(value);
551
+ } else {
552
+ setSearchResults({
553
+ brands: [],
554
+ products: []
555
+ });
556
+ }
557
+ };
558
+
389
559
  React.useEffect(function () {
390
560
  var handleClickOutside = function handleClickOutside(event) {
391
561
  if (searchResultsRef.current && !searchResultsRef.current.contains(event.target)) {
@@ -437,30 +607,6 @@
437
607
  return setHasError(true);
438
608
  });
439
609
  }, [endpoint]);
440
-
441
- var handleChange = function handleChange(event) {
442
- var value = event.target.value;
443
- setSearchValue(value);
444
- onSearch(value);
445
-
446
- if (value.trim() !== '') {
447
- setSearchLoading(true);
448
- axios.post(endpoint, searchProducts(value, 6)).then(function (response) {
449
- setSearchResults(response.data.data.luxity_products_serach_results);
450
- var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
451
- onProductIdsReceived(ids);
452
- setSearchLoading(false);
453
- }).catch(function () {
454
- setSearchLoading(false);
455
- });
456
- } else {
457
- setSearchResults({
458
- brands: [],
459
- products: []
460
- });
461
- }
462
- };
463
-
464
610
  return /*#__PURE__*/React__default.createElement("div", {
465
611
  className: "navbar"
466
612
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -492,9 +638,14 @@
492
638
  onChange: handleChange,
493
639
  onKeyDown: handleKeyDown,
494
640
  onClick: onSearch
641
+ }), searchLoading && /*#__PURE__*/React__default.createElement(BeatLoader, {
642
+ color: "#000000",
643
+ loading: searchLoading,
644
+ size: 5,
645
+ "aria-label": "Loading Spinner",
646
+ "data-testid": "loader"
495
647
  })), /*#__PURE__*/React__default.createElement(SearchResults, {
496
648
  searchValue: searchValue,
497
- searchLoading: searchLoading,
498
649
  searchResults: searchResults,
499
650
  onViewAll: function onViewAll() {
500
651
  onSearchSubmit(searchValue);
@@ -107,6 +107,133 @@
107
107
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
108
108
  }
109
109
 
110
+ var cssUnit = {
111
+ cm: true,
112
+ mm: true,
113
+ in: true,
114
+ px: true,
115
+ pt: true,
116
+ pc: true,
117
+ em: true,
118
+ ex: true,
119
+ ch: true,
120
+ rem: true,
121
+ vw: true,
122
+ vh: true,
123
+ vmin: true,
124
+ vmax: true,
125
+ "%": true,
126
+ };
127
+ /**
128
+ * If size is a number, append px to the value as default unit.
129
+ * If size is a string, validate against list of valid units.
130
+ * If unit is valid, return size as is.
131
+ * If unit is invalid, console warn issue, replace with px as the unit.
132
+ *
133
+ * @param {(number | string)} size
134
+ * @return {LengthObject} LengthObject
135
+ */
136
+ function parseLengthAndUnit(size) {
137
+ if (typeof size === "number") {
138
+ return {
139
+ value: size,
140
+ unit: "px",
141
+ };
142
+ }
143
+ var value;
144
+ var valueString = (size.match(/^[0-9.]*/) || "").toString();
145
+ if (valueString.includes(".")) {
146
+ value = parseFloat(valueString);
147
+ }
148
+ else {
149
+ value = parseInt(valueString, 10);
150
+ }
151
+ var unit = (size.match(/[^0-9]*$/) || "").toString();
152
+ if (cssUnit[unit]) {
153
+ return {
154
+ value: value,
155
+ unit: unit,
156
+ };
157
+ }
158
+ console.warn("React Spinners: ".concat(size, " is not a valid css value. Defaulting to ").concat(value, "px."));
159
+ return {
160
+ value: value,
161
+ unit: "px",
162
+ };
163
+ }
164
+ /**
165
+ * Take value as an input and return valid css value
166
+ *
167
+ * @param {(number | string)} value
168
+ * @return {string} valid css value
169
+ */
170
+ function cssValue(value) {
171
+ var lengthWithunit = parseLengthAndUnit(value);
172
+ return "".concat(lengthWithunit.value).concat(lengthWithunit.unit);
173
+ }
174
+
175
+ var createAnimation = function (loaderName, frames, suffix) {
176
+ var animationName = "react-spinners-".concat(loaderName, "-").concat(suffix);
177
+ if (typeof window == "undefined" || !window.document) {
178
+ return animationName;
179
+ }
180
+ var styleEl = document.createElement("style");
181
+ document.head.appendChild(styleEl);
182
+ var styleSheet = styleEl.sheet;
183
+ var keyFrames = "\n @keyframes ".concat(animationName, " {\n ").concat(frames, "\n }\n ");
184
+ if (styleSheet) {
185
+ styleSheet.insertRule(keyFrames, 0);
186
+ }
187
+ return animationName;
188
+ };
189
+
190
+ var __assign = (undefined && undefined.__assign) || function () {
191
+ __assign = Object.assign || function(t) {
192
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
193
+ s = arguments[i];
194
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
195
+ t[p] = s[p];
196
+ }
197
+ return t;
198
+ };
199
+ return __assign.apply(this, arguments);
200
+ };
201
+ var __rest = (undefined && undefined.__rest) || function (s, e) {
202
+ var t = {};
203
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
204
+ t[p] = s[p];
205
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
206
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
207
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
208
+ t[p[i]] = s[p[i]];
209
+ }
210
+ return t;
211
+ };
212
+ var beat = createAnimation("BeatLoader", "50% {transform: scale(0.75);opacity: 0.2} 100% {transform: scale(1);opacity: 1}", "beat");
213
+ function BeatLoader(_a) {
214
+ 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"]);
215
+ var wrapper = __assign({ display: "inherit" }, cssOverride);
216
+ var style = function (i) {
217
+ return {
218
+ display: "inline-block",
219
+ backgroundColor: color,
220
+ width: cssValue(size),
221
+ height: cssValue(size),
222
+ margin: cssValue(margin),
223
+ borderRadius: "100%",
224
+ animation: "".concat(beat, " ").concat(0.7 / speedMultiplier, "s ").concat(i % 2 ? "0s" : "".concat(0.35 / speedMultiplier, "s"), " infinite linear"),
225
+ animationFillMode: "both",
226
+ };
227
+ };
228
+ if (!loading) {
229
+ return null;
230
+ }
231
+ return (React.createElement("span", __assign({ style: wrapper }, additionalprops),
232
+ React.createElement("span", { style: style(1) }),
233
+ React.createElement("span", { style: style(2) }),
234
+ React.createElement("span", { style: style(3) })));
235
+ }
236
+
110
237
  var LuxityAppSideNav = function LuxityAppSideNav(_ref) {
111
238
  var closeIcon = _ref.closeIcon,
112
239
  accountIcon = _ref.accountIcon,
@@ -362,7 +489,7 @@
362
489
  className: "side-nav__elements"
363
490
  }, categoryElements.map(function (category) {
364
491
  return /*#__PURE__*/React__default.createElement("a", {
365
- href: "".concat(productUrl, "/").concat(category.slug),
492
+ href: "".concat(productUrl, "/").concat(['new', 'apparel', 'accessories'].includes(categorySlug) ? category.slug : "".concat(categorySlug, "/").concat(category.slug)),
366
493
  className: "side-nav__element"
367
494
  }, category.name.toLowerCase());
368
495
  })), /*#__PURE__*/React__default.createElement("br", null), /*#__PURE__*/React__default.createElement("div", {
@@ -374,7 +501,7 @@
374
501
  className: "side-nav__element"
375
502
  }, "All Brands"), !!brandsList.length && brandsList.map(function (brand) {
376
503
  return /*#__PURE__*/React__default.createElement("a", {
377
- href: "".concat(productUrl, "/").concat(categorySlug, "/").concat(brand.slug),
504
+ href: "".concat(productUrl, "/").concat(categorySlug === 'new' ? 'brands' : categorySlug, "/").concat(brand.slug),
378
505
  className: "side-nav__element"
379
506
  }, brand.name);
380
507
  })))));
@@ -733,22 +860,21 @@
733
860
 
734
861
  var SearchResults = function SearchResults(_ref) {
735
862
  var searchValue = _ref.searchValue,
736
- searchLoading = _ref.searchLoading,
737
863
  searchResults = _ref.searchResults,
738
864
  onViewAll = _ref.onViewAll,
739
865
  searchResultsRef = _ref.searchResultsRef,
740
866
  onSearchSubmit = _ref.onSearchSubmit,
741
867
  setSearchValue = _ref.setSearchValue;
742
868
 
743
- if (searchValue.trim() !== '') {
869
+ if (searchValue.trim().length >= 3) {
870
+ if (searchResults.brands.length === 0 && searchResults.products.length === 0) {
871
+ return null;
872
+ }
873
+
744
874
  return /*#__PURE__*/React__default.createElement("div", {
745
875
  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",
746
876
  ref: searchResultsRef
747
- }, searchLoading ? /*#__PURE__*/React__default.createElement("div", {
748
- className: "w-full py-20 flex items-center justify-center"
749
- }, "Searching ...") : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, searchResults.brands.length === 0 && searchResults.products.length === 0 ? /*#__PURE__*/React__default.createElement("div", {
750
- className: "w-full py-20 flex items-center justify-center"
751
- }, "No products found") : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
877
+ }, /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
752
878
  className: "w-full lg:w-1/3"
753
879
  }, /*#__PURE__*/React__default.createElement("p", {
754
880
  className: "font-bold p-2 px-4"
@@ -779,7 +905,7 @@
779
905
  setSearchValue('');
780
906
  },
781
907
  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"
782
- }, "View all")))));
908
+ }, "View all"))));
783
909
  }
784
910
 
785
911
  return null;
@@ -789,7 +915,6 @@
789
915
  var logoSrc = _ref.logoSrc,
790
916
  menuIcon = _ref.menuIcon,
791
917
  inputSearchIcon = _ref.inputSearchIcon,
792
- onSearch = _ref.onSearch,
793
918
  onCartClick = _ref.onCartClick,
794
919
  cartIcon = _ref.cartIcon,
795
920
  cartCount = _ref.cartCount,
@@ -841,7 +966,7 @@
841
966
  showSideNav = _useState6[0],
842
967
  setShowSideNav = _useState6[1];
843
968
 
844
- var _useState7 = React.useState(true),
969
+ var _useState7 = React.useState(false),
845
970
  _useState8 = _slicedToArray(_useState7, 2),
846
971
  searchLoading = _useState8[0],
847
972
  setSearchLoading = _useState8[1];
@@ -854,21 +979,41 @@
854
979
  searchResults = _useState10[0],
855
980
  setSearchResults = _useState10[1];
856
981
 
982
+ var debounce = function debounce(func, wait) {
983
+ var timeout;
984
+ return function executedFunction() {
985
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
986
+ args[_key] = arguments[_key];
987
+ }
988
+
989
+ var later = function later() {
990
+ clearTimeout(timeout);
991
+ func.apply(void 0, args);
992
+ };
993
+
994
+ clearTimeout(timeout);
995
+ timeout = setTimeout(later, wait);
996
+ };
997
+ };
998
+
999
+ var debouncedSearch = React.useCallback(debounce(function (nextValue) {
1000
+ setSearchLoading(true);
1001
+ axios.post(endpoint, searchProducts(nextValue, 6)).then(function (response) {
1002
+ setSearchResults(response.data.data.luxity_products_serach_results);
1003
+ var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
1004
+ onProductIdsReceived(ids);
1005
+ setSearchLoading(false);
1006
+ }).catch(function () {
1007
+ setSearchLoading(false);
1008
+ });
1009
+ }, 500), [endpoint]);
1010
+
857
1011
  var handleChange = function handleChange(event) {
858
1012
  var value = event.target.value;
859
1013
  setSearchValue(value);
860
- onSearch(value);
861
-
862
- if (value.trim() !== '') {
863
- setSearchLoading(true);
864
- axios.post(endpoint, searchProducts(value, 6)).then(function (response) {
865
- setSearchResults(response.data.data.luxity_products_serach_results);
866
- var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
867
- onProductIdsReceived(ids);
868
- setSearchLoading(false);
869
- }).catch(function () {
870
- setSearchLoading(false);
871
- });
1014
+
1015
+ if (value.trim().length >= 3) {
1016
+ debouncedSearch(value);
872
1017
  } else {
873
1018
  setSearchResults({
874
1019
  brands: [],
@@ -1012,6 +1157,12 @@
1012
1157
  value: searchValue,
1013
1158
  onChange: handleChange,
1014
1159
  onKeyDown: handleKeyDown
1160
+ }), searchLoading && /*#__PURE__*/React__default.createElement(BeatLoader, {
1161
+ color: "#000000",
1162
+ loading: searchLoading,
1163
+ size: 5,
1164
+ "aria-label": "Loading Spinner",
1165
+ "data-testid": "loader"
1015
1166
  })), /*#__PURE__*/React__default.createElement("button", {
1016
1167
  type: "button",
1017
1168
  onClick: onSearchClick
package/LuxitySideNav.js CHANGED
@@ -187,7 +187,7 @@
187
187
  className: "side-nav__elements"
188
188
  }, categoryElements.map(function (category) {
189
189
  return /*#__PURE__*/React__default.createElement("a", {
190
- href: "".concat(productUrl, "/").concat(category.slug),
190
+ href: "".concat(productUrl, "/").concat(['new', 'apparel', 'accessories'].includes(categorySlug) ? category.slug : "".concat(categorySlug, "/").concat(category.slug)),
191
191
  className: "side-nav__element"
192
192
  }, category.name.toLowerCase());
193
193
  })), /*#__PURE__*/React__default.createElement("br", null), /*#__PURE__*/React__default.createElement("div", {
@@ -199,7 +199,7 @@
199
199
  className: "side-nav__element"
200
200
  }, "All Brands"), !!brandsList.length && brandsList.map(function (brand) {
201
201
  return /*#__PURE__*/React__default.createElement("a", {
202
- href: "".concat(productUrl, "/").concat(categorySlug, "/").concat(brand.slug),
202
+ href: "".concat(productUrl, "/").concat(categorySlug === 'new' ? 'brands' : categorySlug, "/").concat(brand.slug),
203
203
  className: "side-nav__element"
204
204
  }, brand.name);
205
205
  })))));
package/build/bundle.js CHANGED
@@ -14400,6 +14400,133 @@
14400
14400
 
14401
14401
  var index$6 = themed(LuxityFooter);
14402
14402
 
14403
+ var cssUnit = {
14404
+ cm: true,
14405
+ mm: true,
14406
+ in: true,
14407
+ px: true,
14408
+ pt: true,
14409
+ pc: true,
14410
+ em: true,
14411
+ ex: true,
14412
+ ch: true,
14413
+ rem: true,
14414
+ vw: true,
14415
+ vh: true,
14416
+ vmin: true,
14417
+ vmax: true,
14418
+ "%": true,
14419
+ };
14420
+ /**
14421
+ * If size is a number, append px to the value as default unit.
14422
+ * If size is a string, validate against list of valid units.
14423
+ * If unit is valid, return size as is.
14424
+ * If unit is invalid, console warn issue, replace with px as the unit.
14425
+ *
14426
+ * @param {(number | string)} size
14427
+ * @return {LengthObject} LengthObject
14428
+ */
14429
+ function parseLengthAndUnit(size) {
14430
+ if (typeof size === "number") {
14431
+ return {
14432
+ value: size,
14433
+ unit: "px",
14434
+ };
14435
+ }
14436
+ var value;
14437
+ var valueString = (size.match(/^[0-9.]*/) || "").toString();
14438
+ if (valueString.includes(".")) {
14439
+ value = parseFloat(valueString);
14440
+ }
14441
+ else {
14442
+ value = parseInt(valueString, 10);
14443
+ }
14444
+ var unit = (size.match(/[^0-9]*$/) || "").toString();
14445
+ if (cssUnit[unit]) {
14446
+ return {
14447
+ value: value,
14448
+ unit: unit,
14449
+ };
14450
+ }
14451
+ console.warn("React Spinners: ".concat(size, " is not a valid css value. Defaulting to ").concat(value, "px."));
14452
+ return {
14453
+ value: value,
14454
+ unit: "px",
14455
+ };
14456
+ }
14457
+ /**
14458
+ * Take value as an input and return valid css value
14459
+ *
14460
+ * @param {(number | string)} value
14461
+ * @return {string} valid css value
14462
+ */
14463
+ function cssValue(value) {
14464
+ var lengthWithunit = parseLengthAndUnit(value);
14465
+ return "".concat(lengthWithunit.value).concat(lengthWithunit.unit);
14466
+ }
14467
+
14468
+ var createAnimation = function (loaderName, frames, suffix) {
14469
+ var animationName = "react-spinners-".concat(loaderName, "-").concat(suffix);
14470
+ if (typeof window == "undefined" || !window.document) {
14471
+ return animationName;
14472
+ }
14473
+ var styleEl = document.createElement("style");
14474
+ document.head.appendChild(styleEl);
14475
+ var styleSheet = styleEl.sheet;
14476
+ var keyFrames = "\n @keyframes ".concat(animationName, " {\n ").concat(frames, "\n }\n ");
14477
+ if (styleSheet) {
14478
+ styleSheet.insertRule(keyFrames, 0);
14479
+ }
14480
+ return animationName;
14481
+ };
14482
+
14483
+ var __assign = (undefined && undefined.__assign) || function () {
14484
+ __assign = Object.assign || function(t) {
14485
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
14486
+ s = arguments[i];
14487
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
14488
+ t[p] = s[p];
14489
+ }
14490
+ return t;
14491
+ };
14492
+ return __assign.apply(this, arguments);
14493
+ };
14494
+ var __rest = (undefined && undefined.__rest) || function (s, e) {
14495
+ var t = {};
14496
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14497
+ t[p] = s[p];
14498
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
14499
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
14500
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
14501
+ t[p[i]] = s[p[i]];
14502
+ }
14503
+ return t;
14504
+ };
14505
+ var beat = createAnimation("BeatLoader", "50% {transform: scale(0.75);opacity: 0.2} 100% {transform: scale(1);opacity: 1}", "beat");
14506
+ function BeatLoader(_a) {
14507
+ 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"]);
14508
+ var wrapper = __assign({ display: "inherit" }, cssOverride);
14509
+ var style = function (i) {
14510
+ return {
14511
+ display: "inline-block",
14512
+ backgroundColor: color,
14513
+ width: cssValue(size),
14514
+ height: cssValue(size),
14515
+ margin: cssValue(margin),
14516
+ borderRadius: "100%",
14517
+ animation: "".concat(beat, " ").concat(0.7 / speedMultiplier, "s ").concat(i % 2 ? "0s" : "".concat(0.35 / speedMultiplier, "s"), " infinite linear"),
14518
+ animationFillMode: "both",
14519
+ };
14520
+ };
14521
+ if (!loading) {
14522
+ return null;
14523
+ }
14524
+ return (React.createElement("span", __assign({ style: wrapper }, additionalprops),
14525
+ React.createElement("span", { style: style(1) }),
14526
+ React.createElement("span", { style: style(2) }),
14527
+ React.createElement("span", { style: style(3) })));
14528
+ }
14529
+
14403
14530
  var getBrands = function getBrands() {
14404
14531
  return {
14405
14532
  query: "{\n latest_arrivals: luxity_brands(has_products: true, limit: 1000, page: 1, sort_by: \"name|asc\") {data {id name slug}}\n bags: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: BAGS, sort_by: \"name|asc\") {data {id name slug}}\n shoes: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: SHOES, sort_by: \"name|asc\") {data {id name slug}}\n apparel: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: APPAREL, sort_by: \"name|asc\") {data {id name slug}}\n accessories: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: ACCESSORIES, sort_by: \"name|asc\") {data {id name slug}}\n watches: luxity_brands(has_products: true, limit: 1000, page: 1, category_type: WATCHES, sort_by: \"name|asc\") {data {id name slug}}\n accessories_categories: luxity_accessories_categories_list { id name slug }\n apparel_styles: luxity_apparel_styles_list { name slug }\n } "
@@ -14552,22 +14679,21 @@
14552
14679
 
14553
14680
  var SearchResults = function SearchResults(_ref) {
14554
14681
  var searchValue = _ref.searchValue,
14555
- searchLoading = _ref.searchLoading,
14556
14682
  searchResults = _ref.searchResults,
14557
14683
  onViewAll = _ref.onViewAll,
14558
14684
  searchResultsRef = _ref.searchResultsRef,
14559
14685
  onSearchSubmit = _ref.onSearchSubmit,
14560
14686
  setSearchValue = _ref.setSearchValue;
14561
14687
 
14562
- if (searchValue.trim() !== '') {
14688
+ if (searchValue.trim().length >= 3) {
14689
+ if (searchResults.brands.length === 0 && searchResults.products.length === 0) {
14690
+ return null;
14691
+ }
14692
+
14563
14693
  return /*#__PURE__*/React__default.createElement("div", {
14564
14694
  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",
14565
14695
  ref: searchResultsRef
14566
- }, searchLoading ? /*#__PURE__*/React__default.createElement("div", {
14567
- className: "w-full py-20 flex items-center justify-center"
14568
- }, "Searching ...") : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, searchResults.brands.length === 0 && searchResults.products.length === 0 ? /*#__PURE__*/React__default.createElement("div", {
14569
- className: "w-full py-20 flex items-center justify-center"
14570
- }, "No products found") : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
14696
+ }, /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
14571
14697
  className: "w-full lg:w-1/3"
14572
14698
  }, /*#__PURE__*/React__default.createElement("p", {
14573
14699
  className: "font-bold p-2 px-4"
@@ -14598,7 +14724,7 @@
14598
14724
  setSearchValue('');
14599
14725
  },
14600
14726
  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"
14601
- }, "View all")))));
14727
+ }, "View all"))));
14602
14728
  }
14603
14729
 
14604
14730
  return null;
@@ -14665,7 +14791,7 @@
14665
14791
  hasError = _useState8[0],
14666
14792
  setHasError = _useState8[1];
14667
14793
 
14668
- var _useState9 = React.useState(true),
14794
+ var _useState9 = React.useState(false),
14669
14795
  _useState10 = _slicedToArray(_useState9, 2),
14670
14796
  searchLoading = _useState10[0],
14671
14797
  setSearchLoading = _useState10[1];
@@ -14679,6 +14805,50 @@
14679
14805
  setSearchResults = _useState12[1];
14680
14806
 
14681
14807
  var searchResultsRef = React.useRef(null);
14808
+
14809
+ var debounce = function debounce(func, wait) {
14810
+ var timeout;
14811
+ return function executedFunction() {
14812
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
14813
+ args[_key] = arguments[_key];
14814
+ }
14815
+
14816
+ var later = function later() {
14817
+ clearTimeout(timeout);
14818
+ func.apply(void 0, args);
14819
+ };
14820
+
14821
+ clearTimeout(timeout);
14822
+ timeout = setTimeout(later, wait);
14823
+ };
14824
+ };
14825
+
14826
+ var debouncedSearch = React.useCallback(debounce(function (nextValue) {
14827
+ setSearchLoading(true);
14828
+ axios.post(endpoint, searchProducts(nextValue, 6)).then(function (response) {
14829
+ setSearchResults(response.data.data.luxity_products_serach_results);
14830
+ var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
14831
+ onProductIdsReceived(ids);
14832
+ setSearchLoading(false);
14833
+ }).catch(function () {
14834
+ setSearchLoading(false);
14835
+ });
14836
+ }, 500), [endpoint]);
14837
+
14838
+ var handleChange = function handleChange(event) {
14839
+ var value = event.target.value;
14840
+ setSearchValue(value);
14841
+
14842
+ if (value.trim().length >= 3) {
14843
+ debouncedSearch(value);
14844
+ } else {
14845
+ setSearchResults({
14846
+ brands: [],
14847
+ products: []
14848
+ });
14849
+ }
14850
+ };
14851
+
14682
14852
  React.useEffect(function () {
14683
14853
  var handleClickOutside = function handleClickOutside(event) {
14684
14854
  if (searchResultsRef.current && !searchResultsRef.current.contains(event.target)) {
@@ -14730,30 +14900,6 @@
14730
14900
  return setHasError(true);
14731
14901
  });
14732
14902
  }, [endpoint]);
14733
-
14734
- var handleChange = function handleChange(event) {
14735
- var value = event.target.value;
14736
- setSearchValue(value);
14737
- onSearch(value);
14738
-
14739
- if (value.trim() !== '') {
14740
- setSearchLoading(true);
14741
- axios.post(endpoint, searchProducts(value, 6)).then(function (response) {
14742
- setSearchResults(response.data.data.luxity_products_serach_results);
14743
- var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
14744
- onProductIdsReceived(ids);
14745
- setSearchLoading(false);
14746
- }).catch(function () {
14747
- setSearchLoading(false);
14748
- });
14749
- } else {
14750
- setSearchResults({
14751
- brands: [],
14752
- products: []
14753
- });
14754
- }
14755
- };
14756
-
14757
14903
  return /*#__PURE__*/React__default.createElement("div", {
14758
14904
  className: "navbar"
14759
14905
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -14785,9 +14931,14 @@
14785
14931
  onChange: handleChange,
14786
14932
  onKeyDown: handleKeyDown,
14787
14933
  onClick: onSearch
14934
+ }), searchLoading && /*#__PURE__*/React__default.createElement(BeatLoader, {
14935
+ color: "#000000",
14936
+ loading: searchLoading,
14937
+ size: 5,
14938
+ "aria-label": "Loading Spinner",
14939
+ "data-testid": "loader"
14788
14940
  })), /*#__PURE__*/React__default.createElement(SearchResults, {
14789
14941
  searchValue: searchValue,
14790
- searchLoading: searchLoading,
14791
14942
  searchResults: searchResults,
14792
14943
  onViewAll: function onViewAll() {
14793
14944
  onSearchSubmit(searchValue);
@@ -15043,7 +15194,7 @@
15043
15194
  className: "side-nav__elements"
15044
15195
  }, categoryElements.map(function (category) {
15045
15196
  return /*#__PURE__*/React__default.createElement("a", {
15046
- href: "".concat(productUrl, "/").concat(category.slug),
15197
+ href: "".concat(productUrl, "/").concat(['new', 'apparel', 'accessories'].includes(categorySlug) ? category.slug : "".concat(categorySlug, "/").concat(category.slug)),
15047
15198
  className: "side-nav__element"
15048
15199
  }, category.name.toLowerCase());
15049
15200
  })), /*#__PURE__*/React__default.createElement("br", null), /*#__PURE__*/React__default.createElement("div", {
@@ -15055,7 +15206,7 @@
15055
15206
  className: "side-nav__element"
15056
15207
  }, "All Brands"), !!brandsList.length && brandsList.map(function (brand) {
15057
15208
  return /*#__PURE__*/React__default.createElement("a", {
15058
- href: "".concat(productUrl, "/").concat(categorySlug, "/").concat(brand.slug),
15209
+ href: "".concat(productUrl, "/").concat(categorySlug === 'new' ? 'brands' : categorySlug, "/").concat(brand.slug),
15059
15210
  className: "side-nav__element"
15060
15211
  }, brand.name);
15061
15212
  })))));
@@ -15568,7 +15719,6 @@
15568
15719
  var logoSrc = _ref.logoSrc,
15569
15720
  menuIcon = _ref.menuIcon,
15570
15721
  inputSearchIcon = _ref.inputSearchIcon,
15571
- onSearch = _ref.onSearch,
15572
15722
  onCartClick = _ref.onCartClick,
15573
15723
  cartIcon = _ref.cartIcon,
15574
15724
  cartCount = _ref.cartCount,
@@ -15620,7 +15770,7 @@
15620
15770
  showSideNav = _useState6[0],
15621
15771
  setShowSideNav = _useState6[1];
15622
15772
 
15623
- var _useState7 = React.useState(true),
15773
+ var _useState7 = React.useState(false),
15624
15774
  _useState8 = _slicedToArray(_useState7, 2),
15625
15775
  searchLoading = _useState8[0],
15626
15776
  setSearchLoading = _useState8[1];
@@ -15633,21 +15783,41 @@
15633
15783
  searchResults = _useState10[0],
15634
15784
  setSearchResults = _useState10[1];
15635
15785
 
15786
+ var debounce = function debounce(func, wait) {
15787
+ var timeout;
15788
+ return function executedFunction() {
15789
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
15790
+ args[_key] = arguments[_key];
15791
+ }
15792
+
15793
+ var later = function later() {
15794
+ clearTimeout(timeout);
15795
+ func.apply(void 0, args);
15796
+ };
15797
+
15798
+ clearTimeout(timeout);
15799
+ timeout = setTimeout(later, wait);
15800
+ };
15801
+ };
15802
+
15803
+ var debouncedSearch = React.useCallback(debounce(function (nextValue) {
15804
+ setSearchLoading(true);
15805
+ axios.post(endpoint, searchProducts(nextValue, 6)).then(function (response) {
15806
+ setSearchResults(response.data.data.luxity_products_serach_results);
15807
+ var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
15808
+ onProductIdsReceived(ids);
15809
+ setSearchLoading(false);
15810
+ }).catch(function () {
15811
+ setSearchLoading(false);
15812
+ });
15813
+ }, 500), [endpoint]);
15814
+
15636
15815
  var handleChange = function handleChange(event) {
15637
15816
  var value = event.target.value;
15638
15817
  setSearchValue(value);
15639
- onSearch(value);
15640
-
15641
- if (value.trim() !== '') {
15642
- setSearchLoading(true);
15643
- axios.post(endpoint, searchProducts(value, 6)).then(function (response) {
15644
- setSearchResults(response.data.data.luxity_products_serach_results);
15645
- var ids = response.data.data.luxity_products_serach_results.luxity_product_ids;
15646
- onProductIdsReceived(ids);
15647
- setSearchLoading(false);
15648
- }).catch(function () {
15649
- setSearchLoading(false);
15650
- });
15818
+
15819
+ if (value.trim().length >= 3) {
15820
+ debouncedSearch(value);
15651
15821
  } else {
15652
15822
  setSearchResults({
15653
15823
  brands: [],
@@ -15791,6 +15961,12 @@
15791
15961
  value: searchValue,
15792
15962
  onChange: handleChange,
15793
15963
  onKeyDown: handleKeyDown
15964
+ }), searchLoading && /*#__PURE__*/React__default.createElement(BeatLoader, {
15965
+ color: "#000000",
15966
+ loading: searchLoading,
15967
+ size: 5,
15968
+ "aria-label": "Loading Spinner",
15969
+ "data-testid": "loader"
15794
15970
  })), /*#__PURE__*/React__default.createElement("button", {
15795
15971
  type: "button",
15796
15972
  onClick: onSearchClick
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bonlineza/luxity-lib",
3
- "version": "2.32.7",
3
+ "version": "2.32.8",
4
4
  "scripts": {
5
5
  "start": "start-storybook -p 9001 -c .storybook -s ./public",
6
6
  "clean": "rimraf ./build/*.*",
@@ -31,6 +31,7 @@
31
31
  "dependencies": {
32
32
  "@bonlineza/b-lib": "^4.0.0",
33
33
  "js-cookie": "^2.2.0",
34
+ "lodash.debounce": "^4.0.8",
34
35
  "numeral": "^2.0.6",
35
36
  "polished": "^3.6.5",
36
37
  "prop-types": "^15.7.2",
@@ -42,6 +43,7 @@
42
43
  "react-is": "^16.13.1",
43
44
  "react-notify-toast": "^0.5.1",
44
45
  "react-select": "^2.3.0",
46
+ "react-spinners": "^0.13.8",
45
47
  "regenerator-runtime": "^0.13.7",
46
48
  "styled-system": "^5.1.5"
47
49
  },
package/build/.gitignore DELETED
@@ -1,3 +0,0 @@
1
- bundle.css
2
- bundle.js
3
- constants.js
package/build/.npmignore DELETED
File without changes