thm-p3-configurator 0.0.397 → 0.0.399

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.
@@ -1,14 +1,15 @@
1
1
  "use strict";
2
2
 
3
3
  require("core-js/modules/es.symbol.description.js");
4
+ require("core-js/modules/es.array.includes.js");
4
5
  require("core-js/modules/es.array.sort.js");
5
6
  require("core-js/modules/es.json.stringify.js");
6
7
  require("core-js/modules/es.object.from-entries.js");
7
8
  require("core-js/modules/es.promise.js");
8
9
  require("core-js/modules/es.regexp.to-string.js");
10
+ require("core-js/modules/es.string.includes.js");
9
11
  require("core-js/modules/esnext.iterator.constructor.js");
10
12
  require("core-js/modules/esnext.iterator.filter.js");
11
- require("core-js/modules/esnext.iterator.find.js");
12
13
  require("core-js/modules/esnext.iterator.for-each.js");
13
14
  require("core-js/modules/esnext.iterator.map.js");
14
15
  require("core-js/modules/web.dom-collections.iterator.js");
@@ -18,14 +19,15 @@ Object.defineProperty(exports, "__esModule", {
18
19
  });
19
20
  exports.useSingleOrderCart = exports.useSingleOrderBranchesQuery = exports.useSingleOrderBranchTypes = exports.useSingleOrderArticles = exports.useQuestionsQuery = exports.useProductsQuery = exports.useProductFieldLabels = exports.usePrivateDossierByTypeAndIdQuery = exports.usePartBrands = exports.useOrderDataQuery = exports.useMyBranches = exports.useModelsQuery = exports.useMarketingChannels = exports.useCountriesQuery = exports.useConfiguratorLocationsQuery = exports.useBusinessBranches = exports.useBuildYearsQuery = exports.useBrandsQuery = exports.useBranchesQuery = exports.useBranchesByType = exports.useBranchTypes = exports.useBranchByIdOrWidgetId = exports.useArticleTypes = exports.useArticleSubGroups = exports.useArticleGroups = exports.useActiveDiscounts = void 0;
20
21
  require("core-js/modules/es.symbol.description.js");
22
+ require("core-js/modules/es.array.includes.js");
21
23
  require("core-js/modules/es.array.sort.js");
22
24
  require("core-js/modules/es.json.stringify.js");
23
25
  require("core-js/modules/es.object.from-entries.js");
24
26
  require("core-js/modules/es.promise.js");
25
27
  require("core-js/modules/es.regexp.to-string.js");
28
+ require("core-js/modules/es.string.includes.js");
26
29
  require("core-js/modules/esnext.iterator.constructor.js");
27
30
  require("core-js/modules/esnext.iterator.filter.js");
28
- require("core-js/modules/esnext.iterator.find.js");
29
31
  require("core-js/modules/esnext.iterator.for-each.js");
30
32
  require("core-js/modules/esnext.iterator.map.js");
31
33
  require("core-js/modules/web.dom-collections.iterator.js");
@@ -38,6 +40,7 @@ var _FormulaContext = require("../__context__/FormulaContext");
38
40
  var _OrderSessionContext = require("../__context__/OrderSessionContext");
39
41
  var _helpers__ = require("../__helpers__");
40
42
  var _singleOrderArticles = require("../__helpers__/singleOrderArticles");
43
+ var _singleOrderCartArticles = require("../__helpers__/singleOrderCartArticles");
41
44
  var _product = require("../__helpers__/product");
42
45
  var _useSessionContextReady = require("../__hooks__/useSessionContextReady");
43
46
  var _authenticatedProxyApi = require("./authenticatedProxyApi");
@@ -89,6 +92,21 @@ function _toPrimitive(t, r) {
89
92
  return ("string" === r ? String : Number)(t);
90
93
  }
91
94
  const ORDER_QUERY_STALE_TIME_MS = 5 * 60 * 1000;
95
+ const fetchCartArticleLookup = async function fetchCartArticleLookup() {
96
+ var _directResponse$artic, _directResponse$artic2, _partFallbackResponse;
97
+ let articleNumbers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
98
+ let formula = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
99
+ const directResponse = await (0, _singleOrderArticles.fetchArticlesByArticleNumbers)(articleNumbers, null, false, null, formula);
100
+ const {
101
+ mergedByArticleNumber,
102
+ missingArticleNumbers
103
+ } = (0, _singleOrderCartArticles.mergeCartArticlesWithPartFallback)(articleNumbers, (_directResponse$artic = directResponse === null || directResponse === void 0 ? void 0 : directResponse.articles) !== null && _directResponse$artic !== void 0 ? _directResponse$artic : []);
104
+ if (!missingArticleNumbers.length) {
105
+ return mergedByArticleNumber;
106
+ }
107
+ const partFallbackResponse = await (0, _singleOrderArticles.fetchArticlesByArticleNumbers)(missingArticleNumbers, null, true, null, formula);
108
+ return (0, _singleOrderCartArticles.mergeCartArticlesWithPartFallback)(articleNumbers, (_directResponse$artic2 = directResponse === null || directResponse === void 0 ? void 0 : directResponse.articles) !== null && _directResponse$artic2 !== void 0 ? _directResponse$artic2 : [], (_partFallbackResponse = partFallbackResponse === null || partFallbackResponse === void 0 ? void 0 : partFallbackResponse.articles) !== null && _partFallbackResponse !== void 0 ? _partFallbackResponse : []).mergedByArticleNumber;
109
+ };
92
110
  /**
93
111
  * @description Retrieves the car brand options
94
112
  */
@@ -308,7 +326,9 @@ const useSingleOrderArticles = exports.useSingleOrderArticles = function useSing
308
326
  totalArticles: 0
309
327
  };
310
328
  }
311
- const currentArticles = await (0, _singleOrderArticles.enrichArticlesWithBrandsAndPrices)(articles, branchId || null, branchId ? singleOrderFormula : singleOrderFormula || 'THL');
329
+ const currentArticles = await (0, _singleOrderArticles.enrichArticlesWithBrandsAndPrices)(articles, branchId || null, branchId ? singleOrderFormula : singleOrderFormula || 'THL', {
330
+ useArticleNumberForPricing: true
331
+ });
312
332
  const pricedArticles = currentArticles.filter(article => {
313
333
  const {
314
334
  priceExclVat,
@@ -392,23 +412,30 @@ const useSingleOrderCart = () => {
392
412
  })).toString();
393
413
  const cartQuery = (0, _reactQuery.useQuery)(['singleOrderCart', cartOrderQuery, webshop], {
394
414
  queryFn: async () => {
395
- var _articles$articles2;
415
+ const emptyTotals = {
416
+ totalQuantity: 0,
417
+ totalBtw: 0,
418
+ totalExclVat: 0,
419
+ totalInclVat: 0
420
+ };
396
421
  if (!singleOrderCart.length) {
397
422
  return {
398
423
  articles: [],
399
- totals: []
424
+ totals: emptyTotals,
425
+ validationError: null
400
426
  };
401
427
  }
402
428
 
403
429
  // If webshop is selected, use Shopify prices directly without API call
404
430
  if (webshop) {
405
- var _articles$articles;
406
- const articles = await (0, _singleOrderArticles.fetchArticlesByArticleNumbers)(singleOrderCart.map(article => article.articleNumber), null, false, null, singleOrderFormula);
407
- const articlesWithPrice = articles === null || articles === void 0 || (_articles$articles = articles.articles) === null || _articles$articles === void 0 ? void 0 : _articles$articles.map(article => {
408
- var _cartItem$brandNumber;
409
- const cartItem = singleOrderCart.find(item => item.articleNumber === article.articleNumber);
410
- const totals = cartTotalsLookup[article.articleNumber];
431
+ const articleLookup = await fetchCartArticleLookup(singleOrderCart.map(article => article.articleNumber), singleOrderFormula);
432
+ const articlesWithPrice = singleOrderCart.map(cartItem => {
433
+ var _articleLookup$cartIt, _article$name, _cartItem$brandNumber;
434
+ const article = (_articleLookup$cartIt = articleLookup[cartItem.articleNumber]) !== null && _articleLookup$cartIt !== void 0 ? _articleLookup$cartIt : {};
435
+ const totals = cartTotalsLookup[cartItem.articleNumber];
411
436
  return _objectSpread(_objectSpread({}, article), {}, {
437
+ articleNumber: cartItem.articleNumber,
438
+ name: (_article$name = article === null || article === void 0 ? void 0 : article.name) !== null && _article$name !== void 0 ? _article$name : cartItem.articleNumber,
412
439
  price: cartItem !== null && cartItem !== void 0 && cartItem.productPriceInclVat ? Math.round(Number(cartItem === null || cartItem === void 0 ? void 0 : cartItem.productPriceInclVat) * 100) / 100 : 0,
413
440
  quantity: Number(cartItem === null || cartItem === void 0 ? void 0 : cartItem.quantity),
414
441
  // Add the calculated totals using Shopify prices
@@ -429,25 +456,46 @@ const useSingleOrderCart = () => {
429
456
  totalBtw: Math.round(totalBtw * 100) / 100,
430
457
  totalExclVat: Math.round(totalExclVat * 100) / 100,
431
458
  totalInclVat: Math.round(totalInclVat * 100) / 100
432
- }
459
+ },
460
+ validationError: null
433
461
  };
434
462
  }
435
463
 
436
- // Original logic for non-webshop orders
437
- const orderResults = await _authenticatedProxyApi.authenticatedProxyApi.getOrder(cartOrderQuery).then(res => res.data);
438
- if (!orderResults.data.cart) {
464
+ // Original logic for non-webshop orders.
465
+ // If Hyper rejects a cart with ARTICLES_NOT_FOUND (404), keep rendering
466
+ // from the local session cart instead of breaking the entire cart query.
467
+ let cart = [];
468
+ let validationError = null;
469
+ try {
470
+ var _orderResults$data$ca, _orderResults$data;
471
+ const orderResults = await _authenticatedProxyApi.authenticatedProxyApi.getOrder(cartOrderQuery).then(res => res.data);
472
+ cart = (_orderResults$data$ca = orderResults === null || orderResults === void 0 || (_orderResults$data = orderResults.data) === null || _orderResults$data === void 0 ? void 0 : _orderResults$data.cart) !== null && _orderResults$data$ca !== void 0 ? _orderResults$data$ca : [];
473
+ } catch (error) {
474
+ var _error$response, _error$response2, _error$response3;
475
+ const isCartOrderLookup = cartOrderQuery.includes('cart=');
476
+ const isArticlesNotFoundError = (error === null || error === void 0 || (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 404 && (error === null || error === void 0 || (_error$response2 = error.response) === null || _error$response2 === void 0 || (_error$response2 = _error$response2.data) === null || _error$response2 === void 0 ? void 0 : _error$response2.code) === 'ARTICLES_NOT_FOUND';
477
+ const isGenericNotFoundError = (error === null || error === void 0 || (_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.status) === 404;
478
+ if (!isCartOrderLookup || !isArticlesNotFoundError && !isGenericNotFoundError) {
479
+ throw error;
480
+ }
481
+ cart = apiCart;
482
+ validationError = 'Een of meer artikelen in de winkelwagen zijn momenteel niet bestelbaar voor deze formule.';
483
+ }
484
+ if (!cart.length) {
439
485
  return {
440
- cart: []
486
+ articles: [],
487
+ totals: emptyTotals,
488
+ validationError
441
489
  };
442
490
  }
443
- const cart = orderResults.data.cart;
444
- const articles = await (0, _singleOrderArticles.fetchArticlesByArticleNumbers)(cart.map(article => article.articleNumber), null, false, null, singleOrderFormula);
445
- const cartLookup = Object.fromEntries(cart.map(item => [item.articleNumber, item]));
446
- const articlesWithPrice = articles === null || articles === void 0 || (_articles$articles2 = articles.articles) === null || _articles$articles2 === void 0 ? void 0 : _articles$articles2.map(article => {
447
- var _cartItem$brandNumber2;
448
- const cartItem = cartLookup[article.articleNumber];
449
- const totals = cartTotalsLookup[article.articleNumber];
491
+ const articleLookup = await fetchCartArticleLookup(cart.map(article => article.articleNumber), singleOrderFormula);
492
+ const articlesWithPrice = cart.map(cartItem => {
493
+ var _articleLookup$cartIt2, _article$name2, _cartItem$brandNumber2;
494
+ const article = (_articleLookup$cartIt2 = articleLookup[cartItem.articleNumber]) !== null && _articleLookup$cartIt2 !== void 0 ? _articleLookup$cartIt2 : {};
495
+ const totals = cartTotalsLookup[cartItem.articleNumber];
450
496
  return _objectSpread(_objectSpread({}, article), {}, {
497
+ articleNumber: cartItem.articleNumber,
498
+ name: (_article$name2 = article === null || article === void 0 ? void 0 : article.name) !== null && _article$name2 !== void 0 ? _article$name2 : cartItem.articleNumber,
451
499
  price: cartItem !== null && cartItem !== void 0 && cartItem.consumerTotal ? Math.round(Number(cartItem === null || cartItem === void 0 ? void 0 : cartItem.consumerTotal) * 100) / 100 : 0,
452
500
  quantity: Number(cartItem === null || cartItem === void 0 ? void 0 : cartItem.quantity),
453
501
  // Add the calculated totals
@@ -468,7 +516,8 @@ const useSingleOrderCart = () => {
468
516
  totalBtw: Math.round(totalBtw * 100) / 100,
469
517
  totalExclVat: Math.round(totalExclVat * 100) / 100,
470
518
  totalInclVat: Math.round(totalInclVat * 100) / 100
471
- }
519
+ },
520
+ validationError
472
521
  };
473
522
  }
474
523
  });
@@ -12,6 +12,7 @@ var _react = _interopRequireDefault(require("react"));
12
12
  var _queries = require("../../__api__/queries");
13
13
  var _LinkButton = _interopRequireDefault(require("../../__components__/Buttons/LinkButton"));
14
14
  var _PrimaryButton = _interopRequireDefault(require("../../__components__/Buttons/PrimaryButton"));
15
+ var _DangerAlert = _interopRequireDefault(require("../../__components__/DangerAlert"));
15
16
  var _ExpandableCard = _interopRequireDefault(require("../../__components__/Cards/ExpandableCard"));
16
17
  var _SingleOrderCartCard = _interopRequireDefault(require("../../__components__/SingleOrderCartCard"));
17
18
  var _helpers__ = require("../../__helpers__");
@@ -29,7 +30,7 @@ const EmptyState = _ref => {
29
30
  }, message));
30
31
  };
31
32
  const InternalSingleOrderCart = _ref2 => {
32
- var _cart$articles, _cart$totals$totalExc, _cart$totals, _cart$totals$totalBtw, _cart$totals2, _cart$totals$totalInc, _cart$totals3;
33
+ var _cart$validationError, _cart$articles, _cart$totals$totalExc, _cart$totals, _cart$totals$totalBtw, _cart$totals2, _cart$totals$totalInc, _cart$totals3;
33
34
  let {
34
35
  handleQuantityChange,
35
36
  removeFromCart: _removeFromCart,
@@ -43,6 +44,7 @@ const InternalSingleOrderCart = _ref2 => {
43
44
  cart,
44
45
  isLoadingCart
45
46
  } = (0, _queries.useSingleOrderCart)();
47
+ const cartValidationError = (_cart$validationError = cart === null || cart === void 0 ? void 0 : cart.validationError) !== null && _cart$validationError !== void 0 ? _cart$validationError : null;
46
48
  const confirmButtonClicked = () => {
47
49
  if (showProductOverview) {
48
50
  toggleOverview();
@@ -89,8 +91,11 @@ const InternalSingleOrderCart = _ref2 => {
89
91
  }, /*#__PURE__*/_react.default.createElement(_LinkButton.default, {
90
92
  label: "Bestelling herstarten",
91
93
  onClick: () => resetOrderSession()
94
+ }), cartValidationError && /*#__PURE__*/_react.default.createElement(_DangerAlert.default, {
95
+ className: "mx-2 mb-0",
96
+ message: "".concat(cartValidationError, " Pas de artikelen aan voordat je kunt bevestigen.")
92
97
  }), /*#__PURE__*/_react.default.createElement(_PrimaryButton.default, {
93
- isDisabled: disabledCreateOrder,
98
+ isDisabled: disabledCreateOrder || Boolean(cartValidationError),
94
99
  label: !showProductOverview ? 'Bevestigen' : 'Bestellen',
95
100
  onClick: confirmButtonClicked
96
101
  })));
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.object.from-entries.js");
4
+ require("core-js/modules/esnext.iterator.constructor.js");
5
+ require("core-js/modules/esnext.iterator.filter.js");
6
+ require("core-js/modules/esnext.iterator.for-each.js");
7
+ require("core-js/modules/esnext.iterator.map.js");
8
+ require("core-js/modules/web.dom-collections.iterator.js");
9
+ require("core-js/modules/esnext.iterator.for-each.js");
10
+ Object.defineProperty(exports, "__esModule", {
11
+ value: true
12
+ });
13
+ exports.mergeCartArticlesWithPartFallback = void 0;
14
+ require("core-js/modules/es.object.from-entries.js");
15
+ require("core-js/modules/esnext.iterator.constructor.js");
16
+ require("core-js/modules/esnext.iterator.filter.js");
17
+ require("core-js/modules/esnext.iterator.map.js");
18
+ require("core-js/modules/web.dom-collections.iterator.js");
19
+ function ownKeys(e, r) {
20
+ var t = Object.keys(e);
21
+ if (Object.getOwnPropertySymbols) {
22
+ var o = Object.getOwnPropertySymbols(e);
23
+ r && (o = o.filter(function (r) {
24
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
25
+ })), t.push.apply(t, o);
26
+ }
27
+ return t;
28
+ }
29
+ function _objectSpread(e) {
30
+ for (var r = 1; r < arguments.length; r++) {
31
+ var t = null != arguments[r] ? arguments[r] : {};
32
+ r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
33
+ _defineProperty(e, r, t[r]);
34
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
35
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
36
+ });
37
+ }
38
+ return e;
39
+ }
40
+ function _defineProperty(e, r, t) {
41
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
42
+ value: t,
43
+ enumerable: !0,
44
+ configurable: !0,
45
+ writable: !0
46
+ }) : e[r] = t, e;
47
+ }
48
+ function _toPropertyKey(t) {
49
+ var i = _toPrimitive(t, "string");
50
+ return "symbol" == typeof i ? i : i + "";
51
+ }
52
+ function _toPrimitive(t, r) {
53
+ if ("object" != typeof t || !t) return t;
54
+ var e = t[Symbol.toPrimitive];
55
+ if (void 0 !== e) {
56
+ var i = e.call(t, r || "default");
57
+ if ("object" != typeof i) return i;
58
+ throw new TypeError("@@toPrimitive must return a primitive value.");
59
+ }
60
+ return ("string" === r ? String : Number)(t);
61
+ }
62
+ const toArticleLookup = function toArticleLookup() {
63
+ let articles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
64
+ return Object.fromEntries(articles.filter(article => article === null || article === void 0 ? void 0 : article.articleNumber).map(article => [article.articleNumber, article]));
65
+ };
66
+ const mergeCartArticlesWithPartFallback = exports.mergeCartArticlesWithPartFallback = function mergeCartArticlesWithPartFallback() {
67
+ let cartArticleNumbers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
68
+ let directMatches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
69
+ let partFallbackMatches = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
70
+ const uniqueCartArticleNumbers = [...new Set(cartArticleNumbers.filter(Boolean))];
71
+ const directLookup = toArticleLookup(directMatches);
72
+ const fallbackLookup = toArticleLookup(partFallbackMatches);
73
+ const missingArticleNumbers = uniqueCartArticleNumbers.filter(articleNumber => !directLookup[articleNumber]);
74
+ const mergedByArticleNumber = _objectSpread(_objectSpread({}, directLookup), Object.fromEntries(missingArticleNumbers.filter(articleNumber => fallbackLookup[articleNumber]).map(articleNumber => [articleNumber, fallbackLookup[articleNumber]])));
75
+ return {
76
+ mergedByArticleNumber,
77
+ missingArticleNumbers
78
+ };
79
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thm-p3-configurator",
3
- "version": "0.0.397",
3
+ "version": "0.0.399",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "author": "EnoRm.",