@pisell/private-materials 6.12.364 → 6.12.366

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.
@@ -34,6 +34,7 @@ import { resolveKioskDeferredSubmission } from "./deferredCheckout.js";
34
34
  import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
35
35
  import { Alert, Button, Modal, Spin } from "antd";
36
36
  import { locales } from "@pisell/utils";
37
+ import { useToast } from "@pisell/materials";
37
38
  import { ArrowLeftOutlined, CheckCircleFilled, PercentageOutlined } from "@ant-design/icons";
38
39
  import "./index.less";
39
40
  //#region src/components/bigSale/templates/Kiosk/index.tsx
@@ -231,6 +232,7 @@ function createKioskLoginContinuationHandler(options) {
231
232
  function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesChannel, context, mode, variant, kioskShellLayout = "single-screen", productLoadParams, businessCode, productDisplayConfig, productCatalogSessionKey, orderId, saleDetailModuleConfig, locale, onOrderComplete }) {
232
233
  var _context$sales$bookin, _engineContext$appHel, _utils$getApp, _engineContext$appHel2;
233
234
  locales.init(locales_default, locale || "en");
235
+ const Toast = useToast();
234
236
  const engineContext = useEngineContext();
235
237
  const enginePlatform = usePlatform();
236
238
  const businessAvailability = useSalesSdkBusinessAvailability();
@@ -642,8 +644,24 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
642
644
  }));
643
645
  setView("failure");
644
646
  };
647
+ const ensureRequiredProducts = function() {
648
+ var _ref5 = _asyncToGenerator(function* () {
649
+ const bookingTicket = context.sales.bookingTicket;
650
+ try {
651
+ if (bookingTicket === null || bookingTicket === void 0 ? void 0 : bookingTicket.validateRequiredProducts) yield bookingTicket.validateRequiredProducts();
652
+ return true;
653
+ } catch (error) {
654
+ Toast.info(error instanceof Error ? error.message : String(error));
655
+ setNavigableView("cart");
656
+ return false;
657
+ }
658
+ });
659
+ return function ensureRequiredProducts() {
660
+ return _ref5.apply(this, arguments);
661
+ };
662
+ }();
645
663
  const performCheckout = function() {
646
- var _ref22 = _asyncToGenerator(function* () {
664
+ var _ref23 = _asyncToGenerator(function* () {
647
665
  if (checkoutOpeningRef.current || !shouldUseFulfillmentCheckout && isPickupTimingPending || cartItemCount === 0) return;
648
666
  checkoutOpeningRef.current = true;
649
667
  const openingScope = fulfillmentCheckout.captureScope();
@@ -652,18 +670,22 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
652
670
  return isActiveRef.current && currentScope.handle === openingScope.handle && currentScope.scopeKey === openingScope.scopeKey && currentScope.identity === openingScope.identity;
653
671
  };
654
672
  const checkoutSubmitOptions = _objectSpread2(_objectSpread2({}, KIOSK_CHECKOUT_SUBMIT_OPTIONS), {}, { beforeSubmit: function() {
655
- var _ref5 = _asyncToGenerator(function* () {
673
+ var _ref6 = _asyncToGenerator(function* () {
674
+ if (!isCurrentCheckoutRequest() || !(yield ensureRequiredProducts())) return false;
656
675
  return isCurrentCheckoutRequest() && (yield businessAvailability.beginCheckout());
657
676
  });
658
677
  return function beforeSubmit() {
659
- return _ref5.apply(this, arguments);
678
+ return _ref6.apply(this, arguments);
660
679
  };
661
680
  }() });
662
681
  let deferredAttempt = false;
663
682
  setIsCheckoutLoading(true);
664
683
  try {
665
- var _ref6, _context$sales$bookin6, _context$sales$bookin7, _context$sales$bookin8, _ref14, _context$sales$bookin13, _context$sales$bookin14, _context$sales$bookin15, _ref15, _ref16, _result$payload$payme, _result$payload, _result$data6;
684
+ var _ref7, _context$sales$bookin6, _context$sales$bookin7, _context$sales$bookin8, _ref15, _context$sales$bookin13, _context$sales$bookin14, _context$sales$bookin15, _ref16, _ref17, _result$payload$payme, _result$payload, _result$data6;
666
685
  if (!(yield businessAvailability.ensureCanShop())) return;
686
+ yield context.cart.waitForCartConsistency();
687
+ if (!isCurrentCheckoutRequest() || !(yield ensureRequiredProducts())) return;
688
+ if (!isCurrentCheckoutRequest()) return;
667
689
  yield new Promise((resolve) => setTimeout(resolve, 0));
668
690
  setPickupTimingError(void 0);
669
691
  try {
@@ -687,7 +709,7 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
687
709
  }
688
710
  if (context.sales.contactInfo && !(yield context.sales.contactInfo.ensureComplete())) return;
689
711
  if (!isCurrentCheckoutRequest()) return;
690
- const liveTempOrder = (_ref6 = (_context$sales$bookin6 = (_context$sales$bookin7 = context.sales.bookingTicket) === null || _context$sales$bookin7 === void 0 || (_context$sales$bookin8 = _context$sales$bookin7.getTempOrder) === null || _context$sales$bookin8 === void 0 ? void 0 : _context$sales$bookin8.call(_context$sales$bookin7)) !== null && _context$sales$bookin6 !== void 0 ? _context$sales$bookin6 : context.sales.tempOrder) !== null && _ref6 !== void 0 ? _ref6 : null;
712
+ const liveTempOrder = (_ref7 = (_context$sales$bookin6 = (_context$sales$bookin7 = context.sales.bookingTicket) === null || _context$sales$bookin7 === void 0 || (_context$sales$bookin8 = _context$sales$bookin7.getTempOrder) === null || _context$sales$bookin8 === void 0 ? void 0 : _context$sales$bookin8.call(_context$sales$bookin7)) !== null && _context$sales$bookin6 !== void 0 ? _context$sales$bookin6 : context.sales.tempOrder) !== null && _ref7 !== void 0 ? _ref7 : null;
691
713
  if (businessAvailability.enabled && !businessAvailability.requirePaymentOnSubmit) {
692
714
  deferredAttempt = true;
693
715
  setSubmissionError(null);
@@ -696,8 +718,8 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
696
718
  if (!isCurrentCheckoutRequest()) return;
697
719
  const submitted = resolveKioskDeferredSubmission(result, liveTempOrder);
698
720
  if (!submitted) {
699
- var _ref7, _ref8, _result$message, _result$data;
700
- throw new Error(String((_ref7 = (_ref8 = (_result$message = result === null || result === void 0 ? void 0 : result.message) !== null && _result$message !== void 0 ? _result$message : result === null || result === void 0 ? void 0 : result.msg) !== null && _ref8 !== void 0 ? _ref8 : result === null || result === void 0 || (_result$data = result.data) === null || _result$data === void 0 ? void 0 : _result$data.message) !== null && _ref7 !== void 0 ? _ref7 : locales.getText("pisell2.big-sale.kiosk.submit-failure")));
721
+ var _ref8, _ref9, _result$message, _result$data;
722
+ throw new Error(String((_ref8 = (_ref9 = (_result$message = result === null || result === void 0 ? void 0 : result.message) !== null && _result$message !== void 0 ? _result$message : result === null || result === void 0 ? void 0 : result.msg) !== null && _ref9 !== void 0 ? _ref9 : result === null || result === void 0 || (_result$data = result.data) === null || _result$data === void 0 ? void 0 : _result$data.message) !== null && _ref8 !== void 0 ? _ref8 : locales.getText("pisell2.big-sale.kiosk.submit-failure")));
701
723
  }
702
724
  if (platform === "pc" || platform === "h5" || shouldUseConsumerPayment) {
703
725
  var _utils$history, _app$history3;
@@ -726,12 +748,12 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
726
748
  return;
727
749
  }
728
750
  if (shouldUseConsumerPayment && context.sales.enableMultiCurrencySettlement && isVirtualSettlementTempOrder(liveTempOrder)) {
729
- var _ref11, _ref12, _ref13, _result$data$total_am, _result$data3, _result$data4, _liveTempOrder$summar, _context$summary$summ, _context$sales$bookin11, _context$sales$bookin12, _utils$history2, _app$history4;
751
+ var _ref12, _ref13, _ref14, _result$data$total_am, _result$data3, _result$data4, _liveTempOrder$summar, _context$summary$summ, _context$sales$bookin11, _context$sales$bookin12, _utils$history2, _app$history4;
730
752
  yield context.cart.waitForCartConsistency();
731
753
  const result = yield context.cart.submit(void 0, checkoutSubmitOptions);
732
754
  if (!isSalesOrderSubmitSuccess(result)) {
733
- var _ref9, _ref10, _result$message2, _result$data2;
734
- showCheckoutFailure(String((_ref9 = (_ref10 = (_result$message2 = result === null || result === void 0 ? void 0 : result.message) !== null && _result$message2 !== void 0 ? _result$message2 : result === null || result === void 0 ? void 0 : result.msg) !== null && _ref10 !== void 0 ? _ref10 : result === null || result === void 0 || (_result$data2 = result.data) === null || _result$data2 === void 0 ? void 0 : _result$data2.message) !== null && _ref9 !== void 0 ? _ref9 : locales.getText("pisell2.big-sale.kiosk.payment-failure-description")));
755
+ var _ref10, _ref11, _result$message2, _result$data2;
756
+ showCheckoutFailure(String((_ref10 = (_ref11 = (_result$message2 = result === null || result === void 0 ? void 0 : result.message) !== null && _result$message2 !== void 0 ? _result$message2 : result === null || result === void 0 ? void 0 : result.msg) !== null && _ref11 !== void 0 ? _ref11 : result === null || result === void 0 || (_result$data2 = result.data) === null || _result$data2 === void 0 ? void 0 : _result$data2.message) !== null && _ref10 !== void 0 ? _ref10 : locales.getText("pisell2.big-sale.kiosk.payment-failure-description")));
735
757
  return;
736
758
  }
737
759
  const orderId = resolveSaleDetailOrderIdFromSalesResult(context.sales, result);
@@ -739,7 +761,7 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
739
761
  showCheckoutFailure(String(locales.getText("pisell2.big-sale.kiosk.payment-failure-description")));
740
762
  return;
741
763
  }
742
- const totalAmount = (_ref11 = (_ref12 = (_ref13 = (_result$data$total_am = result === null || result === void 0 || (_result$data3 = result.data) === null || _result$data3 === void 0 ? void 0 : _result$data3.total_amount) !== null && _result$data$total_am !== void 0 ? _result$data$total_am : result === null || result === void 0 || (_result$data4 = result.data) === null || _result$data4 === void 0 ? void 0 : _result$data4.expect_amount) !== null && _ref13 !== void 0 ? _ref13 : liveTempOrder === null || liveTempOrder === void 0 || (_liveTempOrder$summar = liveTempOrder.summary) === null || _liveTempOrder$summar === void 0 ? void 0 : _liveTempOrder$summar.total_amount) !== null && _ref12 !== void 0 ? _ref12 : (_context$summary$summ = context.summary.summary) === null || _context$summary$summ === void 0 ? void 0 : _context$summary$summ.total_amount) !== null && _ref11 !== void 0 ? _ref11 : 0;
764
+ const totalAmount = (_ref12 = (_ref13 = (_ref14 = (_result$data$total_am = result === null || result === void 0 || (_result$data3 = result.data) === null || _result$data3 === void 0 ? void 0 : _result$data3.total_amount) !== null && _result$data$total_am !== void 0 ? _result$data$total_am : result === null || result === void 0 || (_result$data4 = result.data) === null || _result$data4 === void 0 ? void 0 : _result$data4.expect_amount) !== null && _ref14 !== void 0 ? _ref14 : liveTempOrder === null || liveTempOrder === void 0 || (_liveTempOrder$summar = liveTempOrder.summary) === null || _liveTempOrder$summar === void 0 ? void 0 : _liveTempOrder$summar.total_amount) !== null && _ref13 !== void 0 ? _ref13 : (_context$summary$summ = context.summary.summary) === null || _context$summary$summ === void 0 ? void 0 : _context$summary$summ.total_amount) !== null && _ref12 !== void 0 ? _ref12 : 0;
743
765
  yield context.sales.clearCartAndReset();
744
766
  (_context$sales$bookin11 = context.sales.bookingTicket) === null || _context$sales$bookin11 === void 0 || (_context$sales$bookin12 = _context$sales$bookin11.clearSessionStorageOrderSnapshot) === null || _context$sales$bookin12 === void 0 || _context$sales$bookin12.call(_context$sales$bookin11);
745
767
  persistKioskSessionView(context.sales.bookingTicket, "catalog");
@@ -750,8 +772,8 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
750
772
  return;
751
773
  }
752
774
  yield context.cart.waitForCartConsistency();
753
- const currentTempOrder = (_ref14 = (_context$sales$bookin13 = (_context$sales$bookin14 = context.sales.bookingTicket) === null || _context$sales$bookin14 === void 0 || (_context$sales$bookin15 = _context$sales$bookin14.getTempOrder) === null || _context$sales$bookin15 === void 0 ? void 0 : _context$sales$bookin15.call(_context$sales$bookin14)) !== null && _context$sales$bookin13 !== void 0 ? _context$sales$bookin13 : context.sales.tempOrder) !== null && _ref14 !== void 0 ? _ref14 : null;
754
- const currentSummary = (_ref15 = (_ref16 = context.summary.summary) !== null && _ref16 !== void 0 ? _ref16 : currentTempOrder === null || currentTempOrder === void 0 ? void 0 : currentTempOrder.summary) !== null && _ref15 !== void 0 ? _ref15 : null;
775
+ const currentTempOrder = (_ref15 = (_context$sales$bookin13 = (_context$sales$bookin14 = context.sales.bookingTicket) === null || _context$sales$bookin14 === void 0 || (_context$sales$bookin15 = _context$sales$bookin14.getTempOrder) === null || _context$sales$bookin15 === void 0 ? void 0 : _context$sales$bookin15.call(_context$sales$bookin14)) !== null && _context$sales$bookin13 !== void 0 ? _context$sales$bookin13 : context.sales.tempOrder) !== null && _ref15 !== void 0 ? _ref15 : null;
776
+ const currentSummary = (_ref16 = (_ref17 = context.summary.summary) !== null && _ref17 !== void 0 ? _ref17 : currentTempOrder === null || currentTempOrder === void 0 ? void 0 : currentTempOrder.summary) !== null && _ref16 !== void 0 ? _ref16 : null;
755
777
  const shouldCompleteNoPaymentInPage = isKioskPlatformZeroAmountCheckout(platform, currentSummary);
756
778
  if (shouldUseConsumerPayment && !shouldCompleteNoPaymentInPage && typeof utils.action !== "function") throw new Error("[KioskBigSale] appHelper.utils.action is not available.");
757
779
  if (shouldSubmitKioskOrderBeforeCheckout({
@@ -759,7 +781,7 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
759
781
  summary: currentSummary,
760
782
  shouldUseConsumerPayment
761
783
  })) {
762
- var _context$sales$bookin16, _context$sales$bookin17, _ref19, _context$sales$bookin18, _context$sales$bookin19, _context$sales$bookin20;
784
+ var _context$sales$bookin16, _context$sales$bookin17, _ref20, _context$sales$bookin18, _context$sales$bookin19, _context$sales$bookin20;
763
785
  const walletAssetsState = (_context$sales$bookin16 = context.sales.bookingTicket) === null || _context$sales$bookin16 === void 0 || (_context$sales$bookin17 = _context$sales$bookin16.getWalletAssetsState) === null || _context$sales$bookin17 === void 0 ? void 0 : _context$sales$bookin17.call(_context$sales$bookin16);
764
786
  const deferredWalletPaymentPlan = resolveKioskDeferredWalletPaymentPlan({
765
787
  platform,
@@ -772,8 +794,8 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
772
794
  if (shouldCompleteNoPaymentInPage) publishKioskCollaborationPreviewStatus(app, "checkout");
773
795
  const result = yield context.cart.submit(submitParams, checkoutSubmitOptions);
774
796
  if (!isSalesOrderSubmitSuccess(result)) {
775
- var _ref17, _ref18, _result$message3, _result$data5;
776
- showCheckoutFailure(String((_ref17 = (_ref18 = (_result$message3 = result === null || result === void 0 ? void 0 : result.message) !== null && _result$message3 !== void 0 ? _result$message3 : result === null || result === void 0 ? void 0 : result.msg) !== null && _ref18 !== void 0 ? _ref18 : result === null || result === void 0 || (_result$data5 = result.data) === null || _result$data5 === void 0 ? void 0 : _result$data5.message) !== null && _ref17 !== void 0 ? _ref17 : locales.getText("pisell2.big-sale.kiosk.payment-failure-description")));
797
+ var _ref18, _ref19, _result$message3, _result$data5;
798
+ showCheckoutFailure(String((_ref18 = (_ref19 = (_result$message3 = result === null || result === void 0 ? void 0 : result.message) !== null && _result$message3 !== void 0 ? _result$message3 : result === null || result === void 0 ? void 0 : result.msg) !== null && _ref19 !== void 0 ? _ref19 : result === null || result === void 0 || (_result$data5 = result.data) === null || _result$data5 === void 0 ? void 0 : _result$data5.message) !== null && _ref18 !== void 0 ? _ref18 : locales.getText("pisell2.big-sale.kiosk.payment-failure-description")));
777
799
  return;
778
800
  }
779
801
  const orderId = resolveSaleDetailOrderIdFromSalesResult(context.sales, result);
@@ -781,10 +803,10 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
781
803
  showCheckoutFailure(String(locales.getText("pisell2.big-sale.kiosk.payment-failure-description")));
782
804
  return;
783
805
  }
784
- const tempOrder = (_ref19 = (_context$sales$bookin18 = (_context$sales$bookin19 = context.sales.bookingTicket) === null || _context$sales$bookin19 === void 0 || (_context$sales$bookin20 = _context$sales$bookin19.getTempOrder) === null || _context$sales$bookin20 === void 0 ? void 0 : _context$sales$bookin20.call(_context$sales$bookin19)) !== null && _context$sales$bookin18 !== void 0 ? _context$sales$bookin18 : context.sales.tempOrder) !== null && _ref19 !== void 0 ? _ref19 : null;
806
+ const tempOrder = (_ref20 = (_context$sales$bookin18 = (_context$sales$bookin19 = context.sales.bookingTicket) === null || _context$sales$bookin19 === void 0 || (_context$sales$bookin20 = _context$sales$bookin19.getTempOrder) === null || _context$sales$bookin20 === void 0 ? void 0 : _context$sales$bookin20.call(_context$sales$bookin19)) !== null && _context$sales$bookin18 !== void 0 ? _context$sales$bookin18 : context.sales.tempOrder) !== null && _ref20 !== void 0 ? _ref20 : null;
785
807
  const totalAmount = resolveKioskSubmittedPayableAmount(result, tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.summary, context.summary.summary);
786
808
  if (shouldCompleteNoPaymentInPage) {
787
- var _ref20;
809
+ var _ref21;
788
810
  const validation = validateKioskNoPaymentSubmitResult({
789
811
  result,
790
812
  orderId,
@@ -796,7 +818,7 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
796
818
  return;
797
819
  }
798
820
  setPaymentResult(resolveKioskNoPaymentResultViewModel({
799
- summary: (_ref20 = tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.summary) !== null && _ref20 !== void 0 ? _ref20 : currentSummary,
821
+ summary: (_ref21 = tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.summary) !== null && _ref21 !== void 0 ? _ref21 : currentSummary,
800
822
  currencySymbol: (tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.currency_symbol) || "$"
801
823
  }));
802
824
  persistKioskSessionView(context.sales.bookingTicket, "catalog");
@@ -868,8 +890,8 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
868
890
  if (nextPaymentResult.status !== "failed") persistKioskSessionView(context.sales.bookingTicket, "catalog");
869
891
  setView(nextPaymentResult.status === "failed" ? "failure" : "success");
870
892
  } else if ((result === null || result === void 0 ? void 0 : result.type) === "error" || (result === null || result === void 0 ? void 0 : result.status) === "failed") {
871
- var _ref21, _result$error, _result$payload2;
872
- showCheckoutFailure((_ref21 = (_result$error = result === null || result === void 0 ? void 0 : result.error) !== null && _result$error !== void 0 ? _result$error : result === null || result === void 0 || (_result$payload2 = result.payload) === null || _result$payload2 === void 0 ? void 0 : _result$payload2.message) !== null && _ref21 !== void 0 ? _ref21 : locales.getText("pisell2.big-sale.kiosk.payment-failure-description"));
893
+ var _ref22, _result$error, _result$payload2;
894
+ showCheckoutFailure((_ref22 = (_result$error = result === null || result === void 0 ? void 0 : result.error) !== null && _result$error !== void 0 ? _result$error : result === null || result === void 0 || (_result$payload2 = result.payload) === null || _result$payload2 === void 0 ? void 0 : _result$payload2.message) !== null && _ref22 !== void 0 ? _ref22 : locales.getText("pisell2.big-sale.kiosk.payment-failure-description"));
873
895
  }
874
896
  if (shouldCloseDialogAfterCheckout(result)) {
875
897
  var _result$data7;
@@ -901,7 +923,7 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
901
923
  }
902
924
  });
903
925
  return function performCheckout() {
904
- return _ref22.apply(this, arguments);
926
+ return _ref23.apply(this, arguments);
905
927
  };
906
928
  }();
907
929
  const hasSelectedCustomerVoucher = () => {
@@ -910,22 +932,22 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
910
932
  return (runtimeDiscountList.length > 0 ? runtimeDiscountList : context.cart.discountList || []).some((discount) => isCustomerVoucher(discount) && Boolean(discount === null || discount === void 0 ? void 0 : discount.isSelected));
911
933
  };
912
934
  const hasAppliedWalletAsset = () => {
913
- var _context$sales$bookin23, _context$sales$bookin24, _walletAssetsState$se, _walletAssetsState$se2, _walletAssetsState$se3, _walletAssetsState$se4, _walletAssetsState$co, _walletAssetsState$co2, _ref23, _context$sales$bookin25, _context$sales$bookin26, _context$sales$bookin27;
935
+ var _context$sales$bookin23, _context$sales$bookin24, _walletAssetsState$se, _walletAssetsState$se2, _walletAssetsState$se3, _walletAssetsState$se4, _walletAssetsState$co, _walletAssetsState$co2, _ref24, _context$sales$bookin25, _context$sales$bookin26, _context$sales$bookin27;
914
936
  const walletAssetsState = (_context$sales$bookin23 = context.sales.bookingTicket) === null || _context$sales$bookin23 === void 0 || (_context$sales$bookin24 = _context$sales$bookin23.getWalletAssetsState) === null || _context$sales$bookin24 === void 0 ? void 0 : _context$sales$bookin24.call(_context$sales$bookin23);
915
937
  if (((_walletAssetsState$se = walletAssetsState === null || walletAssetsState === void 0 || (_walletAssetsState$se2 = walletAssetsState.selectedIds) === null || _walletAssetsState$se2 === void 0 ? void 0 : _walletAssetsState$se2.length) !== null && _walletAssetsState$se !== void 0 ? _walletAssetsState$se : 0) > 0 || ((_walletAssetsState$se3 = walletAssetsState === null || walletAssetsState === void 0 || (_walletAssetsState$se4 = walletAssetsState.selectedItems) === null || _walletAssetsState$se4 === void 0 ? void 0 : _walletAssetsState$se4.length) !== null && _walletAssetsState$se3 !== void 0 ? _walletAssetsState$se3 : 0) > 0 || ((_walletAssetsState$co = walletAssetsState === null || walletAssetsState === void 0 || (_walletAssetsState$co2 = walletAssetsState.committedIds) === null || _walletAssetsState$co2 === void 0 ? void 0 : _walletAssetsState$co2.length) !== null && _walletAssetsState$co !== void 0 ? _walletAssetsState$co : 0) > 0) return true;
916
- const tempOrder = (_ref23 = (_context$sales$bookin25 = (_context$sales$bookin26 = context.sales.bookingTicket) === null || _context$sales$bookin26 === void 0 || (_context$sales$bookin27 = _context$sales$bookin26.getTempOrder) === null || _context$sales$bookin27 === void 0 ? void 0 : _context$sales$bookin27.call(_context$sales$bookin26)) !== null && _context$sales$bookin25 !== void 0 ? _context$sales$bookin25 : context.sales.tempOrder) !== null && _ref23 !== void 0 ? _ref23 : null;
938
+ const tempOrder = (_ref24 = (_context$sales$bookin25 = (_context$sales$bookin26 = context.sales.bookingTicket) === null || _context$sales$bookin26 === void 0 || (_context$sales$bookin27 = _context$sales$bookin26.getTempOrder) === null || _context$sales$bookin27 === void 0 ? void 0 : _context$sales$bookin27.call(_context$sales$bookin26)) !== null && _context$sales$bookin25 !== void 0 ? _context$sales$bookin25 : context.sales.tempOrder) !== null && _ref24 !== void 0 ? _ref24 : null;
917
939
  return ((tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.payments) || []).some((payment) => {
918
940
  const voucherId = payment === null || payment === void 0 ? void 0 : payment.voucher_id;
919
941
  return voucherId !== void 0 && voucherId !== null && String(voucherId).trim() !== "" && Number(voucherId) !== 0;
920
942
  });
921
943
  };
922
944
  const continueCheckout = () => {
923
- var _ref24, _context$sales$bookin28, _context$sales$bookin29, _context$sales$bookin30;
945
+ var _ref25, _context$sales$bookin28, _context$sales$bookin29, _context$sales$bookin30;
924
946
  if (businessAvailability.enabled && !businessAvailability.requirePaymentOnSubmit) {
925
947
  performCheckout();
926
948
  return;
927
949
  }
928
- const liveTempOrder = (_ref24 = (_context$sales$bookin28 = (_context$sales$bookin29 = context.sales.bookingTicket) === null || _context$sales$bookin29 === void 0 || (_context$sales$bookin30 = _context$sales$bookin29.getTempOrder) === null || _context$sales$bookin30 === void 0 ? void 0 : _context$sales$bookin30.call(_context$sales$bookin29)) !== null && _context$sales$bookin28 !== void 0 ? _context$sales$bookin28 : context.sales.tempOrder) !== null && _ref24 !== void 0 ? _ref24 : null;
950
+ const liveTempOrder = (_ref25 = (_context$sales$bookin28 = (_context$sales$bookin29 = context.sales.bookingTicket) === null || _context$sales$bookin29 === void 0 || (_context$sales$bookin30 = _context$sales$bookin29.getTempOrder) === null || _context$sales$bookin30 === void 0 ? void 0 : _context$sales$bookin30.call(_context$sales$bookin29)) !== null && _context$sales$bookin28 !== void 0 ? _context$sales$bookin28 : context.sales.tempOrder) !== null && _ref25 !== void 0 ? _ref25 : null;
929
951
  if (context.sales.enableMultiCurrencySettlement && isVirtualSettlementTempOrder(liveTempOrder)) {
930
952
  performCheckout();
931
953
  return;
@@ -939,7 +961,7 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
939
961
  setIsVoucherReminderOpen(true);
940
962
  };
941
963
  const beginCheckoutWithFulfillment = function() {
942
- var _ref25 = _asyncToGenerator(function* () {
964
+ var _ref26 = _asyncToGenerator(function* () {
943
965
  if (!(yield businessAvailability.ensureCanShop())) return;
944
966
  if (!shouldUseFulfillmentCheckout) {
945
967
  continueCheckout();
@@ -958,11 +980,11 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
958
980
  }
959
981
  });
960
982
  return function beginCheckoutWithFulfillment() {
961
- return _ref25.apply(this, arguments);
983
+ return _ref26.apply(this, arguments);
962
984
  };
963
985
  }();
964
986
  const handleCheckout = function() {
965
- var _ref26 = _asyncToGenerator(function* () {
987
+ var _ref27 = _asyncToGenerator(function* () {
966
988
  if (checkoutEntryOpeningRef.current || checkoutOpeningRef.current || checkoutLoginOpeningRef.current || fulfillmentOpeningRef.current) return;
967
989
  checkoutEntryOpeningRef.current = true;
968
990
  try {
@@ -1040,7 +1062,7 @@ function KioskBigSaleTemplate({ isActive = true, osKey, productListPreferencesCh
1040
1062
  }
1041
1063
  });
1042
1064
  return function handleCheckout() {
1043
- return _ref26.apply(this, arguments);
1065
+ return _ref27.apply(this, arguments);
1044
1066
  };
1045
1067
  }();
1046
1068
  const handleUseVoucherBeforeCheckout = () => {
@@ -0,0 +1,79 @@
1
+ const assert = require('node:assert/strict');
2
+ const { readFileSync } = require('node:fs');
3
+ const { join } = require('node:path');
4
+ const test = require('node:test');
5
+ const ts = require('typescript');
6
+
7
+ // Run with node --test; load the pure adapter in memory without a materials build.
8
+ const source = readFileSync(join(__dirname, 'toShoppingCartProducts.ts'), 'utf8');
9
+ const output = ts.transpileModule(source, {
10
+ compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
11
+ });
12
+ const adapter = { exports: {} };
13
+ new Function('exports', output.outputText)(adapter.exports);
14
+ const { toShoppingCartProducts } = adapter.exports;
15
+
16
+ const product = {
17
+ product_id: 477300,
18
+ product_variant_id: 493720,
19
+ product_title: 'Latte',
20
+ selling_price: '5.70',
21
+ num: 1,
22
+ product_sku: {
23
+ option: [{ product_option_item_id: 101, name: 'Almond Milk', add_price: 0.7, num: 1 }],
24
+ },
25
+ };
26
+ const toCart = (...products) => toShoppingCartProducts({ orderProducts: products });
27
+
28
+ test('current OS rows retain their metadata identity for cart delete and edit callbacks', () => {
29
+ const uid = '0dd325cf-545e-4665-bda0-d1a26046f78e';
30
+ const input = { ...product, metadata: { unique_identification_number: uid } };
31
+ const [row] = toCart(input);
32
+ assert.equal(row.identity_key, uid);
33
+ assert.equal(row.rowKey, uid);
34
+ assert.equal(row._id, uid);
35
+ assert.equal(row.price, 5.7);
36
+ assert.equal(row.options[0].name, 'Almond Milk');
37
+ assert.equal(input.identity_key, undefined);
38
+ });
39
+
40
+ test('same-SKU option rows remain independently addressable when cart order changes', () => {
41
+ const almond = { ...product, metadata: { unique_identification_number: 'almond-row' } };
42
+ const regular = {
43
+ ...product,
44
+ product_sku: { option: [] },
45
+ metadata: { unique_identification_number: 'regular-row' },
46
+ };
47
+ const original = toCart(almond, regular);
48
+ const reordered = toCart(regular, almond);
49
+ assert.notEqual(original[0].identity_key, original[1].identity_key);
50
+ assert.equal(original[0].identity_key, reordered[1].identity_key);
51
+ assert.equal(original[1].identity_key, reordered[0].identity_key);
52
+ });
53
+
54
+ test('metadata identity takes precedence over stale top-level compatibility fields', () => {
55
+ const [row] = toCart({
56
+ ...product,
57
+ metadata: { unique_identification_number: 'canonical-row' },
58
+ unique_identification_number: 'old-top-level-row',
59
+ identity_key: 'old-alias-row',
60
+ });
61
+ assert.equal(row.identity_key, 'canonical-row');
62
+ });
63
+
64
+ test('accepts top-level and legacy OS identities when metadata has no valid identity', () => {
65
+ for (const metadata of [undefined, {}, { unique_identification_number: '' }, { unique_identification_number: 123 }]) {
66
+ const [current, legacy] = toCart(
67
+ { ...product, metadata, unique_identification_number: 'top-level-row' },
68
+ { ...product, metadata, identity_key: 'legacy-row' },
69
+ );
70
+ assert.equal(current.identity_key, 'top-level-row');
71
+ assert.equal(legacy.identity_key, 'legacy-row');
72
+ }
73
+ });
74
+
75
+ test('a display-only row key never becomes a deletion identity', () => {
76
+ const [row] = toCart(product);
77
+ assert.equal(row.rowKey, '477300_493720_0');
78
+ assert.equal(row.identity_key, undefined);
79
+ });
@@ -174,11 +174,15 @@ function toShoppingCartProducts(params) {
174
174
  const { orderProducts, amountSymbol = "$" } = params;
175
175
  if (!Array.isArray(orderProducts)) return [];
176
176
  return orderProducts.map((productItem, index) => {
177
- var _productItem$_origin, _productItem$product_, _productItem$metadata;
177
+ var _productItem$_origin, _productItem$metadata, _productItem$product_, _productItem$metadata2;
178
178
  const productNum = toSafeNum(productItem === null || productItem === void 0 ? void 0 : productItem.num);
179
179
  const unitPrice = getUnitPrice(productItem);
180
180
  const callbackData = (productItem === null || productItem === void 0 || (_productItem$_origin = productItem._origin) === null || _productItem$_origin === void 0 ? void 0 : _productItem$_origin.callbackData) || {};
181
- const identityKey = typeof (productItem === null || productItem === void 0 ? void 0 : productItem.identity_key) === "string" && productItem.identity_key.length > 0 ? productItem.identity_key : void 0;
181
+ const identityKey = [
182
+ productItem === null || productItem === void 0 || (_productItem$metadata = productItem.metadata) === null || _productItem$metadata === void 0 ? void 0 : _productItem$metadata.unique_identification_number,
183
+ productItem === null || productItem === void 0 ? void 0 : productItem.unique_identification_number,
184
+ productItem === null || productItem === void 0 ? void 0 : productItem.identity_key
185
+ ].find((value) => typeof value === "string" && value.length > 0);
182
186
  const rowKey = identityKey !== null && identityKey !== void 0 ? identityKey : `${(_productItem$product_ = productItem.product_id) !== null && _productItem$product_ !== void 0 ? _productItem$product_ : "p"}_${productItem.product_variant_id}_${index}`;
183
187
  const productOptionString = (typeof (callbackData === null || callbackData === void 0 ? void 0 : callbackData.product_option_string) === "string" ? callbackData.product_option_string.trim() : "") || getVariantProductOptionString(productItem) || void 0;
184
188
  const base = _objectSpread2({
@@ -204,7 +208,7 @@ function toShoppingCartProducts(params) {
204
208
  if (productItem.product_sku) base.product_sku = productItem.product_sku;
205
209
  else if (Array.isArray(productItem.product_option_item) && productItem.product_option_item.length) base.product_option_item = productItem.product_option_item;
206
210
  if (Array.isArray(productItem.product_bundle) && productItem.product_bundle.length) base.product_bundle = productItem.product_bundle;
207
- if (productItem === null || productItem === void 0 || (_productItem$metadata = productItem.metadata) === null || _productItem$metadata === void 0 ? void 0 : _productItem$metadata.venue_booking) {
211
+ if (productItem === null || productItem === void 0 || (_productItem$metadata2 = productItem.metadata) === null || _productItem$metadata2 === void 0 ? void 0 : _productItem$metadata2.venue_booking) {
208
212
  var _origin$resources2;
209
213
  const origin = productItem._origin || {};
210
214
  const meta = productItem.metadata || {};
@@ -1,10 +1,10 @@
1
1
  import { _objectSpread2 } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
2
2
  import dayjs from "dayjs";
3
- import timezonePlugin from "dayjs/plugin/timezone";
4
- import utcPlugin from "dayjs/plugin/utc";
3
+ import timezone from "dayjs/plugin/timezone";
4
+ import utc from "dayjs/plugin/utc";
5
5
  //#region src/plus/saasDevice/devicePasscodes/model.ts
6
- dayjs.extend(utcPlugin);
7
- dayjs.extend(timezonePlugin);
6
+ dayjs.extend(utc);
7
+ dayjs.extend(timezone);
8
8
  const INITIAL_DEVICE_PASSCODE_STATE = {
9
9
  deviceIds: [],
10
10
  devicesById: {}
@@ -1080,6 +1080,8 @@ interface BookingTicketHandle extends PickupTimingHandle {
1080
1080
  getOpenData?: () => Promise<Record<string, any> | null>;
1081
1081
  getContactInfoConfig?: () => Promise<SalesContactInfoConfig>;
1082
1082
  validateContactInfo?: () => Promise<void>;
1083
+ /** Online venue-ticket checkout: reject missing configured required products. */
1084
+ validateRequiredProducts?: () => Promise<void>;
1083
1085
  /** 写入当前临时订单根字段 tempOrder.buzzer。 */
1084
1086
  setPickupRef?: (buzzer: string) => string;
1085
1087
  /** 将自助点餐固定为柜台取餐。 */
@@ -6,12 +6,12 @@ import React, { useCallback, useEffect, useMemo, useRef } from "react";
6
6
  import { locales } from "@pisell/utils";
7
7
  import { Button, PisellEmpty, PisellModal, PisellStatisticList, Skeleton, Timeline, usePisellConfig } from "@pisell/materials";
8
8
  import { useRequest } from "ahooks";
9
- import timezonePlugin from "dayjs/plugin/timezone";
10
- import utcPlugin from "dayjs/plugin/utc";
9
+ import timezone from "dayjs/plugin/timezone";
10
+ import utc from "dayjs/plugin/utc";
11
11
  import "./index.less";
12
12
  //#region src/plus/walletPassGallery/components/timelineSection/index.tsx
13
- dayjs.extend(timezonePlugin);
14
- dayjs.extend(utcPlugin);
13
+ dayjs.extend(timezone);
14
+ dayjs.extend(utc);
15
15
  const stateTimeUnix = 1723255863;
16
16
  const POLL_INTERVAL = 2e3;
17
17
  const POLL_MAX_TIMES = 5;