@bonlineza/luxity-lib 2.38.1 → 2.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -82,10 +82,22 @@
82
82
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
83
83
  }
84
84
 
85
+ function _toConsumableArray(arr) {
86
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
87
+ }
88
+
89
+ function _arrayWithoutHoles(arr) {
90
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
91
+ }
92
+
85
93
  function _arrayWithHoles(arr) {
86
94
  if (Array.isArray(arr)) return arr;
87
95
  }
88
96
 
97
+ function _iterableToArray(iter) {
98
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
99
+ }
100
+
89
101
  function _iterableToArrayLimit(arr, i) {
90
102
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
91
103
 
@@ -133,6 +145,10 @@
133
145
  return arr2;
134
146
  }
135
147
 
148
+ function _nonIterableSpread() {
149
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
150
+ }
151
+
136
152
  function _nonIterableRest() {
137
153
  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
154
  }
@@ -298,7 +314,7 @@
298
314
  };
299
315
 
300
316
  var SearchResults = function SearchResults(_ref) {
301
- var _searchResults$brands, _searchResults$produc, _initialSearchData$tr, _initialSearchData$la, _limitBrands, _limitBrands2, _initialSearchData$la2, _searchResults$produc2;
317
+ var _searchResults$brands, _searchResults$produc, _initialSearchData$tr, _initialSearchData$la;
302
318
 
303
319
  var searchValue = _ref.searchValue,
304
320
  searchResults = _ref.searchResults,
@@ -315,7 +331,9 @@
315
331
  onBrandSearchResultClick = _ref.onBrandSearchResultClick,
316
332
  onCreateInterests = _ref.onCreateInterests,
317
333
  noResultsImage = _ref.noResultsImage,
318
- showNoResults = _ref.showNoResults;
334
+ showNoResults = _ref.showNoResults,
335
+ _ref$isLoading = _ref.isLoading,
336
+ isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading;
319
337
 
320
338
  var _useState = React.useState(false),
321
339
  _useState2 = _slicedToArray(_useState, 2),
@@ -354,6 +372,39 @@
354
372
  return "".concat(currencySymbol).concat(formatter.format(price));
355
373
  };
356
374
 
375
+ var renderBrandSkeleton = function renderBrandSkeleton() {
376
+ return /*#__PURE__*/React__default.createElement("div", {
377
+ className: "brand-skeleton"
378
+ }, /*#__PURE__*/React__default.createElement("div", {
379
+ className: "brand-skeleton__item shimmer"
380
+ }), /*#__PURE__*/React__default.createElement("div", {
381
+ className: "brand-skeleton__item shimmer"
382
+ }), /*#__PURE__*/React__default.createElement("div", {
383
+ className: "brand-skeleton__item shimmer"
384
+ }), /*#__PURE__*/React__default.createElement("div", {
385
+ className: "brand-skeleton__item shimmer"
386
+ }));
387
+ };
388
+
389
+ var renderProductSkeleton = function renderProductSkeleton() {
390
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, _toConsumableArray(Array(3)).map(function (_, index) {
391
+ return /*#__PURE__*/React__default.createElement("div", {
392
+ key: index,
393
+ className: "product-skeleton"
394
+ }, /*#__PURE__*/React__default.createElement("div", {
395
+ className: "product-skeleton__image shimmer"
396
+ }), /*#__PURE__*/React__default.createElement("div", {
397
+ className: "product-skeleton__content"
398
+ }, /*#__PURE__*/React__default.createElement("div", {
399
+ className: "product-skeleton__title shimmer"
400
+ }), /*#__PURE__*/React__default.createElement("div", {
401
+ className: "product-skeleton__subtitle shimmer"
402
+ }), /*#__PURE__*/React__default.createElement("div", {
403
+ className: "product-skeleton__price shimmer"
404
+ })));
405
+ }));
406
+ };
407
+
357
408
  var renderProductCard = function renderProductCard(product) {
358
409
  var selectedPrice = product.prices ? product.prices.find(function (p) {
359
410
  return p.currency === currency;
@@ -423,6 +474,70 @@
423
474
  }
424
475
 
425
476
  return brands;
477
+ };
478
+
479
+ var renderBrandsList = function renderBrandsList() {
480
+ var _limitBrands2;
481
+
482
+ if (isLoading) {
483
+ return renderBrandSkeleton();
484
+ }
485
+
486
+ if (shouldShowInitialData) {
487
+ var _limitBrands;
488
+
489
+ return (_limitBrands = limitBrands(initialSearchData === null || initialSearchData === void 0 ? void 0 : initialSearchData.trending_brands)) === null || _limitBrands === void 0 ? void 0 : _limitBrands.map(function (brand) {
490
+ return /*#__PURE__*/React__default.createElement("a", {
491
+ key: brand.id,
492
+ href: getBrandLink(brand),
493
+ className: "search-results__item",
494
+ onClick: function onClick() {
495
+ if (typeof onBrandSearchResultClick === 'function') {
496
+ onBrandSearchResultClick({
497
+ brand_name: brand.name,
498
+ brand_link: getBrandLink(brand),
499
+ search_string: searchValue,
500
+ is_trending: true
501
+ });
502
+ }
503
+ }
504
+ }, brand.name);
505
+ });
506
+ }
507
+
508
+ return (_limitBrands2 = limitBrands(searchResults === null || searchResults === void 0 ? void 0 : searchResults.brands)) === null || _limitBrands2 === void 0 ? void 0 : _limitBrands2.map(function (brand) {
509
+ return /*#__PURE__*/React__default.createElement("a", {
510
+ key: brand.link,
511
+ href: brand.link,
512
+ className: "search-results__item",
513
+ onClick: function onClick() {
514
+ if (typeof onBrandSearchResultClick === 'function') {
515
+ onBrandSearchResultClick({
516
+ brand_name: brand.name,
517
+ brand_link: brand.link,
518
+ search_string: searchValue,
519
+ is_trending: false
520
+ });
521
+ }
522
+ }
523
+ }, brand.name);
524
+ });
525
+ };
526
+
527
+ var renderProductsList = function renderProductsList() {
528
+ var _searchResults$produc2;
529
+
530
+ if (isLoading) {
531
+ return renderProductSkeleton();
532
+ }
533
+
534
+ if (shouldShowInitialData) {
535
+ var _initialSearchData$la2;
536
+
537
+ return initialSearchData === null || initialSearchData === void 0 ? void 0 : (_initialSearchData$la2 = initialSearchData.latest_products) === null || _initialSearchData$la2 === void 0 ? void 0 : _initialSearchData$la2.map(renderProductCard);
538
+ }
539
+
540
+ return searchResults === null || searchResults === void 0 ? void 0 : (_searchResults$produc2 = searchResults.products) === null || _searchResults$produc2 === void 0 ? void 0 : _searchResults$produc2.map(renderProductCard);
426
541
  }; // Show no results state
427
542
 
428
543
 
@@ -463,39 +578,7 @@
463
578
  className: "search-results__header"
464
579
  }, shouldShowInitialData ? 'TRENDING SEARCHES' : 'BRANDS'), /*#__PURE__*/React__default.createElement("div", {
465
580
  className: "search-results__list"
466
- }, shouldShowInitialData ? (_limitBrands = limitBrands(initialSearchData === null || initialSearchData === void 0 ? void 0 : initialSearchData.trending_brands)) === null || _limitBrands === void 0 ? void 0 : _limitBrands.map(function (brand) {
467
- return /*#__PURE__*/React__default.createElement("a", {
468
- key: brand.id,
469
- href: getBrandLink(brand),
470
- className: "search-results__item",
471
- onClick: function onClick() {
472
- if (typeof onBrandSearchResultClick === 'function') {
473
- onBrandSearchResultClick({
474
- brand_name: brand.name,
475
- brand_link: getBrandLink(brand),
476
- search_string: searchValue,
477
- is_trending: true
478
- });
479
- }
480
- }
481
- }, brand.name);
482
- }) : (_limitBrands2 = limitBrands(searchResults === null || searchResults === void 0 ? void 0 : searchResults.brands)) === null || _limitBrands2 === void 0 ? void 0 : _limitBrands2.map(function (brand) {
483
- return /*#__PURE__*/React__default.createElement("a", {
484
- key: brand.link,
485
- href: brand.link,
486
- className: "search-results__item",
487
- onClick: function onClick() {
488
- if (typeof onBrandSearchResultClick === 'function') {
489
- onBrandSearchResultClick({
490
- brand_name: brand.name,
491
- brand_link: brand.link,
492
- search_string: searchValue,
493
- is_trending: false
494
- });
495
- }
496
- }
497
- }, brand.name);
498
- }))), /*#__PURE__*/React__default.createElement("div", {
581
+ }, renderBrandsList())), /*#__PURE__*/React__default.createElement("div", {
499
582
  className: "search-results__section"
500
583
  }, /*#__PURE__*/React__default.createElement("div", {
501
584
  className: "search-results__section-header"
@@ -509,7 +592,7 @@
509
592
  }
510
593
  }, "View all items")), /*#__PURE__*/React__default.createElement("div", {
511
594
  className: "search-results__product-list"
512
- }, 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$produc2 = searchResults.products) === null || _searchResults$produc2 === void 0 ? void 0 : _searchResults$produc2.map(renderProductCard)), /*#__PURE__*/React__default.createElement("button", {
595
+ }, renderProductsList()), /*#__PURE__*/React__default.createElement("button", {
513
596
  type: "button",
514
597
  className: "search-results__view-all-button",
515
598
  onClick: function onClick() {
@@ -739,7 +822,7 @@
739
822
 
740
823
  var searchProductsFilter = function searchProductsFilter(search, limit, currencyCode) {
741
824
  return {
742
- query: "\n query LUXITY_PRODUCTS_FILTER(\n $search: String!\n $limit: Int!\n $page: Int!\n $sort_by: String!\n $with_sold: Boolean!\n $currency_code: String!\n ) {\n luxity_products_filter(\n search: $search\n limit: $limit\n page: $page\n sort_by: $sort_by\n with_sold: $with_sold\n ) {\n data {\n id\n product {\n sku\n name\n price(currency_code: $currency_code)\n promotion_price(currency_code: $currency_code)\n est_retail_price(currency_code: $currency_code)\n condition\n currency_symbol(currency_code: $currency_code)\n }\n category_type\n gender\n status\n featured_image\n on_promotion\n promotion_discount\n luxity_brand {\n id\n name\n slug\n }\n }\n total\n }\n }\n ",
825
+ query: "\n query LUXITY_PRODUCTS_FILTER(\n $search: String!\n $limit: Int!\n $page: Int!\n $sort_by: String!\n $with_sold: Boolean!\n $currency_code: String!\n ) {\n luxity_products_filter(\n search: $search\n limit: $limit\n page: $page\n sort_by: $sort_by\n with_sold: $with_sold\n ) {\n data {\n id\n product {\n sku\n name\n price(currency_code: $currency_code)\n promotion_price(currency_code: $currency_code)\n est_retail_price(currency_code: $currency_code)\n condition\n currency_symbol(currency_code: $currency_code)\n }\n product_slug\n category_type\n gender\n status\n featured_image\n on_promotion\n promotion_discount\n luxity_brand {\n id\n name\n slug\n }\n }\n total\n }\n }\n ",
743
826
  variables: {
744
827
  search: search,
745
828
  limit: limit,
@@ -835,7 +918,12 @@
835
918
  if (currentSearchRequestToken.current === newSearchToken) {
836
919
  var _brandsResponse$data$, _productsResponse$dat, _productsResponse$dat2;
837
920
 
838
- // Extract brands from aggregations
921
+ // Set loading to false when search completes
922
+ if (typeof onSearchLoading === 'function') {
923
+ onSearchLoading(false);
924
+ } // Extract brands from aggregations
925
+
926
+
839
927
  var brandsData = ((_brandsResponse$data$ = brandsResponse.data.data.luxity_products_aggregations) === null || _brandsResponse$data$ === void 0 ? void 0 : _brandsResponse$data$.luxity_brand) || []; // Extract products from filter
840
928
 
841
929
  var productsData = ((_productsResponse$dat = productsResponse.data.data.luxity_products_filter) === null || _productsResponse$dat === void 0 ? void 0 : _productsResponse$dat.data) || [];
@@ -850,11 +938,15 @@
850
938
  }); // Map products to old structure with prices
851
939
 
852
940
  var products = productsData.map(function (product) {
941
+ // Generate product link: /products/{category_type}/{brand_slug}/{product_slug}
942
+ var categorySlug = product.category_type.toLowerCase().replace(/\s+/g, '-');
943
+ var brandSlug = product.luxity_brand.slug;
944
+ var productSlug = product.product_slug;
945
+ var link = "/products/".concat(categorySlug, "/").concat(brandSlug, "/").concat(productSlug);
853
946
  return {
854
947
  name: product.product.name,
855
948
  brand: product.luxity_brand.name,
856
- link: "/products/".concat(product.id),
857
- // Using product ID for link
949
+ link: link,
858
950
  price: product.product.price || 0,
859
951
  promotion_price: product.product.promotion_price || null,
860
952
  est_retail_price: product.product.est_retail_price || 0,
@@ -863,9 +955,9 @@
863
955
  featured_image: product.featured_image,
864
956
  on_promotion: product.on_promotion || false,
865
957
  promotion_discount: product.promotion_discount || 0,
866
- // Keep new fields for potential future use
867
958
  id: product.id,
868
959
  category_type: product.category_type,
960
+ product_slug: product.product_slug,
869
961
  luxity_brand: product.luxity_brand
870
962
  };
871
963
  });
@@ -894,6 +986,11 @@
894
986
  }
895
987
  }).catch(function (error) {
896
988
  if (!axios.isCancel(error)) {
989
+ // Set loading to false when search fails
990
+ if (typeof onSearchLoading === 'function') {
991
+ onSearchLoading(false);
992
+ }
993
+
897
994
  setSearchResults({
898
995
  brands: [],
899
996
  products: []
@@ -1041,7 +1138,7 @@
1041
1138
  onSearchPreview = _ref.onSearchPreview,
1042
1139
  onProductSearchResultClick = _ref.onProductSearchResultClick,
1043
1140
  onBrandSearchResultClick = _ref.onBrandSearchResultClick,
1044
- onSearchLoading = _ref.onSearchLoading,
1141
+ _onSearchLoading = _ref.onSearchLoading,
1045
1142
  currency = _ref.currency,
1046
1143
  currencySymbol = _ref.currencySymbol,
1047
1144
  currencyOptions = _ref.currencyOptions,
@@ -1071,53 +1168,64 @@
1071
1168
 
1072
1169
  var _useState5 = React.useState(false),
1073
1170
  _useState6 = _slicedToArray(_useState5, 2),
1074
- isSearchFocused = _useState6[0],
1075
- setIsSearchFocused = _useState6[1];
1171
+ searchLoading = _useState6[0],
1172
+ setSearchLoading = _useState6[1];
1173
+
1174
+ var _useState7 = React.useState(false),
1175
+ _useState8 = _slicedToArray(_useState7, 2),
1176
+ isSearchFocused = _useState8[0],
1177
+ setIsSearchFocused = _useState8[1];
1076
1178
 
1077
- var _useState7 = React.useState({
1179
+ var _useState9 = React.useState({
1078
1180
  trending_brands: [],
1079
1181
  latest_products: []
1080
1182
  }),
1081
- _useState8 = _slicedToArray(_useState7, 2),
1082
- initialSearchView = _useState8[0],
1083
- setInitialSearchView = _useState8[1];
1084
-
1085
- var _useState9 = React.useState({}),
1086
1183
  _useState10 = _slicedToArray(_useState9, 2),
1087
- dropdownData = _useState10[0],
1088
- setDropdownData = _useState10[1];
1184
+ initialSearchView = _useState10[0],
1185
+ setInitialSearchView = _useState10[1];
1089
1186
 
1090
- var _useState11 = React.useState(false),
1187
+ var _useState11 = React.useState({}),
1091
1188
  _useState12 = _slicedToArray(_useState11, 2),
1092
- hasError = _useState12[0],
1093
- setHasError = _useState12[1];
1189
+ dropdownData = _useState12[0],
1190
+ setDropdownData = _useState12[1];
1094
1191
 
1095
- var _useState13 = React.useState({
1096
- brands: [],
1097
- products: []
1098
- }),
1192
+ var _useState13 = React.useState(false),
1099
1193
  _useState14 = _slicedToArray(_useState13, 2),
1100
- searchResults = _useState14[0],
1101
- setSearchResults = _useState14[1];
1194
+ hasError = _useState14[0],
1195
+ setHasError = _useState14[1];
1102
1196
 
1103
1197
  var _useState15 = React.useState({
1104
1198
  brands: [],
1105
1199
  products: []
1106
1200
  }),
1107
1201
  _useState16 = _slicedToArray(_useState15, 2),
1108
- cachedResults = _useState16[0],
1109
- setCachedResults = _useState16[1];
1202
+ searchResults = _useState16[0],
1203
+ setSearchResults = _useState16[1];
1110
1204
 
1111
- var _useState17 = React.useState(false),
1205
+ var _useState17 = React.useState({
1206
+ brands: [],
1207
+ products: []
1208
+ }),
1112
1209
  _useState18 = _slicedToArray(_useState17, 2),
1113
- showNoResults = _useState18[0],
1114
- setShowNoResults = _useState18[1];
1210
+ cachedResults = _useState18[0],
1211
+ setCachedResults = _useState18[1];
1212
+
1213
+ var _useState19 = React.useState(false),
1214
+ _useState20 = _slicedToArray(_useState19, 2),
1215
+ showNoResults = _useState20[0],
1216
+ setShowNoResults = _useState20[1];
1115
1217
 
1116
1218
  var searchResultsRef = React.useRef(null);
1117
1219
 
1118
1220
  var _useSearch = useSearch({
1119
1221
  endpoint: endpoint,
1120
- onSearchLoading: onSearchLoading,
1222
+ onSearchLoading: function onSearchLoading(isLoading) {
1223
+ setSearchLoading(isLoading);
1224
+
1225
+ if (typeof _onSearchLoading === 'function') {
1226
+ _onSearchLoading(isLoading);
1227
+ }
1228
+ },
1121
1229
  currency: currency,
1122
1230
  onSearchPreview: onSearchPreview,
1123
1231
  onNoResults: setShowNoResults
@@ -1272,7 +1380,8 @@
1272
1380
  onBrandSearchResultClick: onBrandSearchResultClick,
1273
1381
  onCreateInterests: onCreateInterests,
1274
1382
  noResultsImage: noResultsImage,
1275
- showNoResults: showNoResults
1383
+ showNoResults: showNoResults,
1384
+ isLoading: searchLoading
1276
1385
  }), /*#__PURE__*/React__default.createElement("nav", {
1277
1386
  className: "navbar__nav-links navbar__nav-links--wrap"
1278
1387
  }, renderDropdownLinks(), !!stores.length && /*#__PURE__*/React__default.createElement("li", {