@zonos/elements 1.3.106 → 1.3.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/cjs/{cart-31e4e866.js → cart-d25b699a.js} +244 -2
  2. package/dist/cjs/{createCustomEvent-18fbf653.js → createCustomEvent-4ea7b6dc.js} +1 -1
  3. package/dist/cjs/index.cjs.js +7 -7
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/{paypal-a101e3ca.js → paypal-fd423375.js} +7 -1
  6. package/dist/cjs/zonos-address_7.cjs.entry.js +1 -1
  7. package/dist/cjs/zonos-cart-items_13.cjs.entry.js +36 -13
  8. package/dist/cjs/zonos-checkout.cjs.entry.js +90 -5
  9. package/dist/cjs/zonos-controller.cjs.entry.js +1 -1
  10. package/dist/cjs/zonos-country-flag.cjs.entry.js +1 -1
  11. package/dist/cjs/zonos-country-select_4.cjs.entry.js +1 -1
  12. package/dist/cjs/zonos-elements.cjs.js +1 -1
  13. package/dist/cjs/zonos-hello-dialog.cjs.entry.js +1 -1
  14. package/dist/cjs/zonos-hello.cjs.entry.js +1 -1
  15. package/dist/cjs/zonos-language-select_2.cjs.entry.js +1 -1
  16. package/dist/cjs/zonos-notification_3.cjs.entry.js +2 -2
  17. package/dist/collection/components/checkout/zonos-checkout/zonos-checkout-finish/zonos-checkout-finish.js +28 -5
  18. package/dist/collection/components/checkout/zonos-checkout/zonos-checkout.js +91 -4
  19. package/dist/collection/components/common/zonos-confirm-dialog/zonos-confirm-dialog.css +1 -1
  20. package/dist/collection/components/common/zonos-confirm-dialog/zonos-confirm-dialog.js +26 -3
  21. package/dist/collection/components/store/checkout/paypal.js +3 -1
  22. package/dist/collection/components/store/checkout/stripe.js +4 -2
  23. package/dist/collection/components/store/translationStore/strings.arabic.js +12 -0
  24. package/dist/collection/components/store/translationStore/strings.base.js +12 -0
  25. package/dist/collection/components/store/translationStore/strings.chinese.js +12 -0
  26. package/dist/collection/components/store/translationStore/strings.danish.js +12 -0
  27. package/dist/collection/components/store/translationStore/strings.dutch.js +12 -0
  28. package/dist/collection/components/store/translationStore/strings.french.js +12 -0
  29. package/dist/collection/components/store/translationStore/strings.german.js +12 -0
  30. package/dist/collection/components/store/translationStore/strings.hebrew.js +12 -0
  31. package/dist/collection/components/store/translationStore/strings.indonesian.js +12 -0
  32. package/dist/collection/components/store/translationStore/strings.italian.js +12 -0
  33. package/dist/collection/components/store/translationStore/strings.japanese.js +12 -0
  34. package/dist/collection/components/store/translationStore/strings.korean.js +12 -0
  35. package/dist/collection/components/store/translationStore/strings.norwegian.js +12 -0
  36. package/dist/collection/components/store/translationStore/strings.polish.js +12 -0
  37. package/dist/collection/components/store/translationStore/strings.portuguese.js +12 -0
  38. package/dist/collection/components/store/translationStore/strings.russian.js +12 -0
  39. package/dist/collection/components/store/translationStore/strings.spanish.js +12 -0
  40. package/dist/collection/components/store/translationStore/strings.swedish.js +12 -0
  41. package/dist/collection/components/store/translationStore/strings.turkish.js +12 -0
  42. package/dist/collection/components/store/translationStore/strings.vietnamese.js +12 -0
  43. package/dist/collection/types/checkout/OrderPlacedInfo.js +1 -0
  44. package/dist/collection/utils/generateCloudflareDeployUrl.js +2 -1
  45. package/dist/esm/{cart-5621d0fe.js → cart-911ba5dd.js} +244 -2
  46. package/dist/esm/{createCustomEvent-a9206df5.js → createCustomEvent-6ba5bcde.js} +1 -1
  47. package/dist/esm/index.js +7 -7
  48. package/dist/esm/loader.js +1 -1
  49. package/dist/esm/{paypal-869c30e1.js → paypal-04a10fc2.js} +7 -2
  50. package/dist/esm/zonos-address_7.entry.js +1 -1
  51. package/dist/esm/zonos-cart-items_13.entry.js +37 -14
  52. package/dist/esm/zonos-checkout.entry.js +91 -6
  53. package/dist/esm/zonos-controller.entry.js +1 -1
  54. package/dist/esm/zonos-country-flag.entry.js +1 -1
  55. package/dist/esm/zonos-country-select_4.entry.js +1 -1
  56. package/dist/esm/zonos-elements.js +1 -1
  57. package/dist/esm/zonos-hello-dialog.entry.js +1 -1
  58. package/dist/esm/zonos-hello.entry.js +1 -1
  59. package/dist/esm/zonos-language-select_2.entry.js +1 -1
  60. package/dist/esm/zonos-notification_3.entry.js +2 -2
  61. package/dist/esm-es5/cart-911ba5dd.js +1 -0
  62. package/dist/esm-es5/{createCustomEvent-a9206df5.js → createCustomEvent-6ba5bcde.js} +1 -1
  63. package/dist/esm-es5/index.js +1 -1
  64. package/dist/esm-es5/loader.js +1 -1
  65. package/dist/esm-es5/{paypal-869c30e1.js → paypal-04a10fc2.js} +2 -2
  66. package/dist/esm-es5/zonos-address_7.entry.js +1 -1
  67. package/dist/esm-es5/zonos-cart-items_13.entry.js +1 -1
  68. package/dist/esm-es5/zonos-checkout.entry.js +1 -1
  69. package/dist/esm-es5/zonos-controller.entry.js +1 -1
  70. package/dist/esm-es5/zonos-country-flag.entry.js +1 -1
  71. package/dist/esm-es5/zonos-country-select_4.entry.js +1 -1
  72. package/dist/esm-es5/zonos-elements.js +1 -1
  73. package/dist/esm-es5/zonos-hello-dialog.entry.js +1 -1
  74. package/dist/esm-es5/zonos-hello.entry.js +1 -1
  75. package/dist/esm-es5/zonos-language-select_2.entry.js +1 -1
  76. package/dist/esm-es5/zonos-notification_3.entry.js +1 -1
  77. package/dist/scripts/index.d.ts +10 -0
  78. package/dist/scripts/index.js +1 -1
  79. package/dist/scripts/loadZonos.js +1 -1
  80. package/dist/scripts/zonos.js +1 -1
  81. package/dist/types/components/checkout/zonos-checkout/zonos-checkout-finish/zonos-checkout-finish.d.ts +1 -0
  82. package/dist/types/components/checkout/zonos-checkout/zonos-checkout.d.ts +10 -0
  83. package/dist/types/components/common/zonos-confirm-dialog/zonos-confirm-dialog.d.ts +5 -0
  84. package/dist/types/components/store/checkout/stripe.d.ts +1 -0
  85. package/dist/types/components/store/translationStore/strings.arabic.d.ts +12 -0
  86. package/dist/types/components/store/translationStore/strings.base.d.ts +12 -0
  87. package/dist/types/components/store/translationStore/strings.chinese.d.ts +12 -0
  88. package/dist/types/components/store/translationStore/strings.danish.d.ts +12 -0
  89. package/dist/types/components/store/translationStore/strings.dutch.d.ts +12 -0
  90. package/dist/types/components/store/translationStore/strings.french.d.ts +12 -0
  91. package/dist/types/components/store/translationStore/strings.german.d.ts +12 -0
  92. package/dist/types/components/store/translationStore/strings.hebrew.d.ts +12 -0
  93. package/dist/types/components/store/translationStore/strings.indonesian.d.ts +12 -0
  94. package/dist/types/components/store/translationStore/strings.italian.d.ts +12 -0
  95. package/dist/types/components/store/translationStore/strings.japanese.d.ts +12 -0
  96. package/dist/types/components/store/translationStore/strings.korean.d.ts +12 -0
  97. package/dist/types/components/store/translationStore/strings.norwegian.d.ts +12 -0
  98. package/dist/types/components/store/translationStore/strings.polish.d.ts +12 -0
  99. package/dist/types/components/store/translationStore/strings.portuguese.d.ts +12 -0
  100. package/dist/types/components/store/translationStore/strings.russian.d.ts +12 -0
  101. package/dist/types/components/store/translationStore/strings.spanish.d.ts +12 -0
  102. package/dist/types/components/store/translationStore/strings.swedish.d.ts +12 -0
  103. package/dist/types/components/store/translationStore/strings.turkish.d.ts +12 -0
  104. package/dist/types/components/store/translationStore/strings.vietnamese.d.ts +12 -0
  105. package/dist/types/components/store/translationStore.d.ts +1 -1
  106. package/dist/types/components.d.ts +10 -0
  107. package/dist/types/types/checkout/OrderPlacedInfo.d.ts +19 -0
  108. package/dist/zonos-elements/index.esm.js +1 -1
  109. package/dist/zonos-elements/{p-523c0f7d.js → p-018a4b36.js} +1 -1
  110. package/dist/zonos-elements/{p-82fec811.system.entry.js → p-123cabaa.system.entry.js} +1 -1
  111. package/dist/zonos-elements/{p-2babfaa4.system.js → p-14de27ff.system.js} +1 -1
  112. package/dist/zonos-elements/{p-23b042ad.entry.js → p-1e1397fe.entry.js} +1 -1
  113. package/dist/zonos-elements/{p-e3b110c7.system.entry.js → p-24813754.system.entry.js} +1 -1
  114. package/dist/zonos-elements/p-27188a22.system.entry.js +1 -0
  115. package/dist/zonos-elements/p-39c09f18.system.entry.js +1 -0
  116. package/dist/zonos-elements/{p-7f93ce41.system.entry.js → p-45323a2f.system.entry.js} +1 -1
  117. package/dist/zonos-elements/p-60303c84.js +1 -0
  118. package/dist/zonos-elements/{p-1c295409.system.js → p-631570f0.system.js} +1 -1
  119. package/dist/zonos-elements/{p-5b6fa002.system.entry.js → p-6927d227.system.entry.js} +1 -1
  120. package/dist/zonos-elements/{p-c2e463b7.system.entry.js → p-76a4a647.system.entry.js} +1 -1
  121. package/dist/zonos-elements/{p-7152f8ca.entry.js → p-8632c8f1.entry.js} +1 -1
  122. package/dist/zonos-elements/{p-7562828c.entry.js → p-8b0feb0e.entry.js} +1 -1
  123. package/dist/zonos-elements/p-8d98fed0.entry.js +1 -0
  124. package/dist/zonos-elements/{p-65512b26.entry.js → p-a0af6dc1.entry.js} +1 -1
  125. package/dist/zonos-elements/{p-f5e54692.entry.js → p-adbcf21c.entry.js} +1 -1
  126. package/dist/zonos-elements/{p-cfda42ba.entry.js → p-ba3d2965.entry.js} +1 -1
  127. package/dist/zonos-elements/p-c78dd680.system.js +1 -1
  128. package/dist/zonos-elements/{p-139e32ba.system.entry.js → p-c9e8f159.system.entry.js} +1 -1
  129. package/dist/zonos-elements/{p-43ef8bf8.entry.js → p-d6de8661.entry.js} +1 -1
  130. package/dist/zonos-elements/p-e2fa7600.entry.js +1 -0
  131. package/dist/zonos-elements/{p-21586642.system.entry.js → p-e5d1d031.system.entry.js} +1 -1
  132. package/dist/zonos-elements/{p-062b6df4.system.js → p-e880ab28.system.js} +2 -2
  133. package/dist/zonos-elements/p-e9771827.system.js +1 -0
  134. package/dist/zonos-elements/{p-a8b27301.entry.js → p-eaf09ccb.entry.js} +1 -1
  135. package/dist/zonos-elements/{p-1bb59ce2.system.entry.js → p-ee14ba06.system.entry.js} +1 -1
  136. package/dist/zonos-elements/p-ef9d6106.js +17 -0
  137. package/dist/zonos-elements/zonos-elements.esm.js +1 -1
  138. package/package.json +1 -1
  139. package/dist/esm-es5/cart-5621d0fe.js +0 -1
  140. package/dist/zonos-elements/p-239331fa.system.js +0 -1
  141. package/dist/zonos-elements/p-39346436.js +0 -1
  142. package/dist/zonos-elements/p-5a704905.system.entry.js +0 -1
  143. package/dist/zonos-elements/p-6a310417.js +0 -17
  144. package/dist/zonos-elements/p-a0c012a5.system.entry.js +0 -1
  145. package/dist/zonos-elements/p-d002dd35.entry.js +0 -1
  146. package/dist/zonos-elements/p-fb624d44.entry.js +0 -1
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-d56e0a8b.js');
6
- const cart = require('./cart-31e4e866.js');
6
+ const cart = require('./cart-d25b699a.js');
7
7
  const zonosStore = require('./zonosStore-b18fe6b6.js');
8
8
  const ILanguage = require('./ILanguage-98b04442.js');
9
9
  require('./handleFetch-aa729c61.js');
@@ -5,9 +5,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  const index = require('./index-d56e0a8b.js');
6
6
  const zonosStore = require('./zonosStore-b18fe6b6.js');
7
7
  const classes = require('./classes-b7918f56.js');
8
- const cart = require('./cart-31e4e866.js');
8
+ const cart = require('./cart-d25b699a.js');
9
9
  const handleFetch = require('./handleFetch-aa729c61.js');
10
- const paypal = require('./paypal-a101e3ca.js');
10
+ const paypal = require('./paypal-fd423375.js');
11
11
  require('./isDarkColor-87ee1eb7.js');
12
12
  require('./getBorderRadius-53c35cd1.js');
13
13
 
@@ -9,9 +9,9 @@ import { getIsTestMode } from "../../../utils/checkout/getIsTestMode";
9
9
  import { createCustomEvent } from "../../../utils/createCustomEvent";
10
10
  import { getBorderRadius } from "../../../utils/getBorderRadius";
11
11
  import { handleFetch } from "../../../utils/handleFetch";
12
+ import { jsonParse } from "../../../utils/jsonParse";
12
13
  import { sendErrorLog } from "../../../utils/logging/sendErrorLog";
13
14
  import { submitGtag } from "../../../utils/submitGtag";
14
- import { getGraphQlShortId } from "../../../../utils/getGraphQlShort";
15
15
  // eslint-disable-next-line no-relative-import-paths/no-relative-import-paths
16
16
  import RemoveIcon from "./assets/RemoveIcon.svg";
17
17
  /* Need to use relative import because inline-svg-stencil couldn't resolve absolute path */
@@ -53,6 +53,10 @@ export class ZonosCheckoutFinish {
53
53
  };
54
54
  this.handleSuccessBehavior = () => {
55
55
  var _a, _b, _c, _d, _e;
56
+ /**
57
+ * Save placed order info so we can show order info if they try to place the order again
58
+ */
59
+ this.saveOrderIdForDuplicationIssue();
56
60
  const { successBehavior } = zonosStore.checkoutSettings;
57
61
  const legacyOrderNumber = ((_c = (_b = (_a = this.order) === null || _a === void 0 ? void 0 : _a.references) === null || _b === void 0 ? void 0 : _b.find(entry => (entry === null || entry === void 0 ? void 0 : entry.key) === 'zonosOrderNumber')) === null || _c === void 0 ? void 0 : _c.value) || null;
58
62
  if (cartStore.externalConfirmationPageURL) {
@@ -138,6 +142,7 @@ export class ZonosCheckoutFinish {
138
142
  else {
139
143
  // Set loading to false to display generic success page and log error
140
144
  this.isLoading = false;
145
+ void trackConversionEvent('checkout_orderCompleted');
141
146
  const checkoutSessionId = cartStore.checkoutSessionId;
142
147
  void sendErrorLog({
143
148
  endpoint: `${baseUrl}/api/zonos-elements/get-order?checkoutSessionId=${checkoutSessionId}`,
@@ -236,6 +241,20 @@ export class ZonosCheckoutFinish {
236
241
  this.closeClickHandler = () => {
237
242
  this.closeClick.emit();
238
243
  };
244
+ this.saveOrderIdForDuplicationIssue = () => {
245
+ var _a, _b, _c, _d;
246
+ const existingPlacedOrderInfo = jsonParse(localStorage.getItem('zonos--placed-order-info'));
247
+ const placedOrderTime = {
248
+ cartId: window.Zonos.cartId || null,
249
+ checkoutSessionId: (existingPlacedOrderInfo === null || existingPlacedOrderInfo === void 0 ? void 0 : existingPlacedOrderInfo.checkoutSessionId) ||
250
+ cartStore.checkoutSessionId ||
251
+ '',
252
+ orderId: ((_a = this.order) === null || _a === void 0 ? void 0 : _a.id) || null,
253
+ time: (existingPlacedOrderInfo === null || existingPlacedOrderInfo === void 0 ? void 0 : existingPlacedOrderInfo.time) || Date.now(),
254
+ zonosOrderNumber: ((_d = (_c = (_b = this.order) === null || _b === void 0 ? void 0 : _b.references) === null || _c === void 0 ? void 0 : _c.find(ref => ref.key === 'zonosOrderNumber')) === null || _d === void 0 ? void 0 : _d.value) || null,
255
+ };
256
+ localStorage.setItem('zonos--placed-order-info', JSON.stringify(placedOrderTime));
257
+ };
239
258
  this.borderRadius = 'ROUNDED';
240
259
  this.storybookForceStatus = undefined;
241
260
  this.overrideNotification = undefined;
@@ -255,6 +274,8 @@ export class ZonosCheckoutFinish {
255
274
  this.isLoading = false;
256
275
  return;
257
276
  }
277
+ // Save order info in case the user reloads before we get order info
278
+ this.saveOrderIdForDuplicationIssue();
258
279
  if (paypalStore.orderIdCreated) {
259
280
  void this.checkPaypalPaymentStatus();
260
281
  }
@@ -263,14 +284,16 @@ export class ZonosCheckoutFinish {
263
284
  }
264
285
  }
265
286
  render() {
266
- var _a, _b;
267
- const orderId = ((_a = this.order) === null || _a === void 0 ? void 0 : _a.accountOrderNumber) || getGraphQlShortId((_b = this.order) === null || _b === void 0 ? void 0 : _b.id);
287
+ var _a, _b, _c, _d;
288
+ const orderId = ((_a = this.order) === null || _a === void 0 ? void 0 : _a.accountOrderNumber) ||
289
+ ((_d = (_c = (_b = this.order) === null || _b === void 0 ? void 0 : _b.references) === null || _c === void 0 ? void 0 : _c.find(ref => ref.key === 'zonosOrderNumber')) === null || _d === void 0 ? void 0 : _d.value) ||
290
+ null;
268
291
  const isTestMode = getIsTestMode();
269
- return (h(Host, { key: '162478c7ac7da04594a380ceae7356ebde6d378d', class: "zonos--checkout-finish zonos--elements", style: {
292
+ return (h(Host, { key: '60abe11ec6d33ac9f390735b2343dc73ba323e0e', class: "zonos--checkout-finish zonos--elements", style: {
270
293
  '--border-radius': getBorderRadius({
271
294
  overrideBorderStyle: this.borderRadius,
272
295
  }),
273
- } }, this.isLoading && (h("div", { key: 'e05786eb66ae570afc1c88dc4205c629e0dbcd2f', class: "loading-wrapper" }, h("zonos-spinner", { key: '9fe20969025c8c327629f9e8f1dac89fb372470e' }))), !this.isLoading && (h("div", { key: '950ac9037ae2ecf7a865be3bb6177aed9ed7d45d', class: "zonos--finish-details" }, h("div", { key: '48e9f3764e1cfdee5b163ad9503f1e43bb2000cc', class: "zonos--group" }, this.notificationType === 'success' ? (h("zonos-icon", { "aria-label": "Order success", content: SuccessIcon, iconColor: 'blue-800', size: 50 })) : (h("zonos-icon", { "aria-label": "Order failed", content: RemoveIcon, iconColor: 'red-800', size: 50 })), h("zonos-text", { key: 'd0e1812004b9bf001a97128b7413fce6c97c3813', class: "zonos--title", type: "semiBoldSubheader" }, this.notificationTitle), orderId && (h("div", { key: 'fc8ffd74fcbee39481c49d082a25eeab2ead9f92', class: "zonos--order-number" }, "Order #", orderId)), h("zonos-text", { key: 'b2fb81b4341f74fb78c2c48b037f8834ac70f296', textColor: "gray-600" }, this.notificationMessages.map(message => (h(Fragment, null, message, h("br", null))))), h("zonos-button", { key: 'df12d3dc5b98e8dd0ead987b30acd5806d93b7ec', onClick: () => this.closeClickHandler(), size: "md", variant: "primary" }, this.notificationActionText)), isTestMode && cartStore.step === 'finish' && (h("div", { key: 'b16aa575056c6c388e04eb162727d3caed12cd41', class: "zonos--finish-button-wrapper" }, h("zonos-button", { key: 'caf4423148cd072bf2c916d71d84fba6d4c0b5ea', backgroundColor: "gray-0", buttonColor: "gray-1000", onClick: () => this.closeClickHandler(), size: "lg", variant: "outline" }, "New test cart"), h("zonos-button", { key: '168f2c10cec8f4002b9c114b5d858314559f6efb', onClick: () => this.redirectToUrl(`/orders/all`), size: "lg", variant: "primary" }, "View order in Dashboard")))))));
296
+ } }, this.isLoading && (h("div", { key: 'f3ca53a787f738a34d376fd48cb880ecd3344073', class: "loading-wrapper" }, h("zonos-spinner", { key: 'bc2ad04b786a98a8a87c4b5317aa88acc9770580' }))), !this.isLoading && (h("div", { key: '6578b0007e35062b11d71a498f78fee56b1175e6', class: "zonos--finish-details" }, h("div", { key: 'f1fc14ffeff3628fa8066e0386c37c66bd3fb8e1', class: "zonos--group" }, this.notificationType === 'success' ? (h("zonos-icon", { "aria-label": "Order success", content: SuccessIcon, iconColor: 'blue-800', size: 50 })) : (h("zonos-icon", { "aria-label": "Order failed", content: RemoveIcon, iconColor: 'red-800', size: 50 })), h("zonos-text", { key: 'a59f4022483e49b6ee9a4f3c0676e2f3d043ccae', class: "zonos--title", type: "semiBoldSubheader" }, this.notificationTitle), orderId && (h("div", { key: '2032bc6031c42463a5896d43f49517489cf38734', class: "zonos--order-number" }, "Order #", orderId)), h("zonos-text", { key: 'da9f7af5b3db16551bd6389c1c92322be8d57aa0', textColor: "gray-600" }, this.notificationMessages.map(message => (h(Fragment, null, message, h("br", null))))), h("zonos-button", { key: '6a8503a7231cb66196919aeb6c6d1f84576e2577', onClick: () => this.closeClickHandler(), size: "md", variant: "primary" }, this.notificationActionText)), isTestMode && cartStore.step === 'finish' && (h("div", { key: '80631312aa8ef98dd36cfda1e62f0274afc48002', class: "zonos--finish-button-wrapper" }, h("zonos-button", { key: 'e1fa412928b1292f09956613f9464e5fc32528e1', backgroundColor: "gray-0", buttonColor: "gray-1000", onClick: () => this.closeClickHandler(), size: "lg", variant: "outline" }, "New test cart"), h("zonos-button", { key: '8d1708a411f334b9cf5a07d142d2d8aa9bddf29b', onClick: () => this.redirectToUrl(`/orders/all`), size: "lg", variant: "primary" }, "View order in Dashboard")))))));
274
297
  }
275
298
  static get is() { return "zonos-checkout-finish"; }
276
299
  static get encapsulation() { return "shadow"; }
@@ -1,6 +1,6 @@
1
1
  import { Fragment, h, Host, } from "@stencil/core";
2
2
  import { cartStore, cartStoreClearCheckoutInterval, cartStoreNextStep, cartStoreReset, cartStoreResetTabItems, cartStoreSetCheckoutSession, cartStoreStartCheckoutInterval, cartStoreUpdateItems, cartStoreUpdateToErrorState, } from "../../store/checkout/cart";
3
- import { paypalInitScript } from "../../store/checkout/paypal";
3
+ import { paypalInitScript, paypalStoreHasPaypalEnabled, } from "../../store/checkout/paypal";
4
4
  import { initStripeElements, stripeStore, stripeStoreCleanupDomesticShippingSession, stripeStoreConfirmPayment, stripeStoreHandleInventoryCheck, stripeStoreInitCheckoutSession, stripeStorePrefetchLandedCost, stripeStoreReset, } from "../../store/checkout/stripe";
5
5
  import { localizationStore, localizationStoreOnUpdate, } from "../../store/hello/localization";
6
6
  import { translate } from "../../store/translationStore";
@@ -18,6 +18,7 @@ import { createCustomEvent } from "../../utils/createCustomEvent";
18
18
  import { getBorderRadius } from "../../utils/getBorderRadius";
19
19
  import { getZCountryUrlParam } from "../../utils/hello/getZCountryUrlParam";
20
20
  import { isDarkColor } from "../../utils/isDarkColor";
21
+ import { jsonParse } from "../../utils/jsonParse";
21
22
  import { allLogs, log } from "../../utils/logging/log";
22
23
  import { logError } from "../../utils/logging/logError";
23
24
  import { sendErrorLog } from "../../utils/logging/sendErrorLog";
@@ -33,6 +34,8 @@ import MessageIcon from "./assets/MessageIcon.svg";
33
34
  import RemoveIcon from "./assets/RemoveIcon.svg";
34
35
  // 90 minutes
35
36
  const CHECKOUT_SESSION_TIMEOUT = 90 * 60 * 1000;
37
+ // 10 minutes
38
+ const ORDER_DUPLICATION_NOTIFICATION_EXPIRATION = 10 * 60 * 1000;
36
39
  export class ZonosCheckout {
37
40
  constructor() {
38
41
  /**
@@ -48,8 +51,25 @@ export class ZonosCheckout {
48
51
  overrideSecondaryColor: (_d = this.appearanceSettingsOverride) === null || _d === void 0 ? void 0 : _d.colorSecondary,
49
52
  // only override theme or theme from appearance if it's mobile
50
53
  overrideTheme: this.isMobile ? theme : undefined,
54
+ paypalEnabled: paypalStoreHasPaypalEnabled(),
51
55
  });
52
56
  };
57
+ this.formatDate = (timestamp) => {
58
+ if (!timestamp) {
59
+ return '';
60
+ }
61
+ // get date in 24/12/2024 format (without time)
62
+ const date = new Date(timestamp);
63
+ return date.toLocaleDateString();
64
+ };
65
+ this.formatTime = (timestamp) => {
66
+ if (!timestamp) {
67
+ return '';
68
+ }
69
+ // get date in 24/12/2024 format (without time)
70
+ const date = new Date(timestamp);
71
+ return date.toLocaleTimeString();
72
+ };
53
73
  this.getCurrentLocalePageEnum = () => {
54
74
  switch (cartStore.step) {
55
75
  case 'customer-info':
@@ -78,6 +98,7 @@ export class ZonosCheckout {
78
98
  this.isLegacyCheckout = window.Zonos.isLegacyCheckout;
79
99
  this.confirmDialogOpen = false;
80
100
  this.inventoryCheckErrorMessage = null;
101
+ this.placedOrderInfo = null;
81
102
  }
82
103
  /**
83
104
  * Init cart info handler event
@@ -172,6 +193,50 @@ export class ZonosCheckout {
172
193
  reloadCheckoutSession() {
173
194
  window.location.reload();
174
195
  }
196
+ handleOrderDuplication() {
197
+ const existingPlacedOrderInfo = jsonParse(localStorage.getItem('zonos--placed-order-info'));
198
+ if (!existingPlacedOrderInfo) {
199
+ localStorage.removeItem('zonos--placed-order-info');
200
+ return;
201
+ }
202
+ const elapsed = Date.now() - existingPlacedOrderInfo.time;
203
+ log(`=== Existing placed order info: ${existingPlacedOrderInfo.orderId} - ${this.formatDate(existingPlacedOrderInfo.time)} - elapsed in hh:ss format: ${new Date(elapsed)
204
+ .toISOString()
205
+ .substring(11, 8)}`, 'warn');
206
+ const overrideExpiredDuplication = parseFloat(new URLSearchParams(window.location.search).get('zonosOverrideExpiredDuplication') || '0') || ORDER_DUPLICATION_NOTIFICATION_EXPIRATION;
207
+ // if the order is placed within 5 minutes, confirm with the user to proceed with the order duplication
208
+ if (elapsed > overrideExpiredDuplication) {
209
+ log(`=== Existing placed order info is older than ${overrideExpiredDuplication}ms, cleaning localStorage`, 'warn');
210
+ // remove the placed order info if it's older than 5 minutes and do nothing.
211
+ localStorage.removeItem('zonos--placed-order-info');
212
+ return;
213
+ }
214
+ // Set placed order info to show the confirm notification to the user
215
+ this.placedOrderInfo = existingPlacedOrderInfo;
216
+ log('=== Showing order duplication confirmation', 'warn');
217
+ }
218
+ confirmProceedWithOrderDuplication() {
219
+ // Reset the placed order info
220
+ this.placedOrderInfo = null;
221
+ }
222
+ handleCancelOrderDuplication() {
223
+ var _a;
224
+ // Reset the placed order info
225
+ this.placedOrderInfo = null;
226
+ // Redirect to the vendor store url if this is legacy checkout
227
+ if (this.isLegacyCheckout) {
228
+ const storeBaseUrl = (_a = window.Zonos.cartData) === null || _a === void 0 ? void 0 : _a.storeBaseUrl;
229
+ if (!storeBaseUrl) {
230
+ return;
231
+ }
232
+ if (window.parent) {
233
+ window.parent.location.href = storeBaseUrl;
234
+ }
235
+ window.location.href = storeBaseUrl;
236
+ return;
237
+ }
238
+ void this.closeDialogHandler({ confirmed: true });
239
+ }
175
240
  attachCheckout() {
176
241
  const buttonAnchorSelector = zonosStore.checkoutSettings.placeOrderButtonSelector;
177
242
  log(`attach checkout ${buttonAnchorSelector}`);
@@ -228,6 +293,7 @@ export class ZonosCheckout {
228
293
  cartStore.shouldHideDiscountInput = !enabled;
229
294
  submitGtag('zonos-checkout-start');
230
295
  void trackConversionEvent('checkout_open');
296
+ this.handleOrderDuplication();
231
297
  if (window.Zonos.isLegacyCheckout) {
232
298
  void sendLoadCheckoutFacadeLog();
233
299
  }
@@ -569,7 +635,7 @@ export class ZonosCheckout {
569
635
  this.onChangeLocaleListener();
570
636
  }
571
637
  render() {
572
- var _a;
638
+ var _a, _b, _c, _d;
573
639
  const dialogLoading =
574
640
  // if it's last step, don't need to check stripe elements
575
641
  (cartStore.step !== 'finish' &&
@@ -643,7 +709,27 @@ export class ZonosCheckout {
643
709
  this.confirmDialogOpen = false;
644
710
  },
645
711
  // Mark user selected confirm to close the dialog
646
- onConfirmClicked: () => this.closeDialogHandler({ confirmed: true }) }), h("zonos-confirm-dialog", { class: "zonos--inventory-check-failure-dialog", dialogConfirmBtnText: translate('Return to cart'), dialogIntent: "danger",
712
+ onConfirmClicked: () => this.closeDialogHandler({ confirmed: true }) }), h("zonos-confirm-dialog", { class: "zonos--order-duplication-dialog", dialogCancelBtnText: translate('Return to merchant site'), dialogConfirmBtnText: translate('Proceed with order'), dialogIntent: "warn", dialogOpen: !!this.placedOrderInfo, dialogSubtitle:
713
+ /**
714
+ * Show order number if it's available, otherwise just show the time
715
+ */
716
+ ((_b = this.placedOrderInfo) === null || _b === void 0 ? void 0 : _b.zonosOrderNumber)
717
+ ? translate('It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?', {
718
+ date: this.formatDate(this.placedOrderInfo.time),
719
+ orderNumber: this.placedOrderInfo.zonosOrderNumber,
720
+ time: this.formatTime(this.placedOrderInfo.time),
721
+ })
722
+ : translate('It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?', {
723
+ date: this.formatDate(((_c = this.placedOrderInfo) === null || _c === void 0 ? void 0 : _c.time) || null),
724
+ time: this.formatTime(((_d = this.placedOrderInfo) === null || _d === void 0 ? void 0 : _d.time) || null),
725
+ }), dialogTitle: translate('Are you sure?'), dialogWidth: 450, onCancelClicked: () => {
726
+ this.handleCancelOrderDuplication();
727
+ },
728
+ // Mark user selected confirm to close the dialog
729
+ onConfirmClicked: () => {
730
+ // Reset the placed order info and close the dialog
731
+ this.confirmProceedWithOrderDuplication();
732
+ } }), h("zonos-confirm-dialog", { class: "zonos--inventory-check-failure-dialog", dialogConfirmBtnText: translate('Return to cart'), dialogIntent: "danger",
647
733
  // Show dialog if inventory check error message is not null
648
734
  dialogOpen: !!cartStore.inventoryCheckErrorMessage,
649
735
  // If dialog is in open state, the message should not be null
@@ -783,7 +869,8 @@ export class ZonosCheckout {
783
869
  "storybookPaymentStatusOverride": {},
784
870
  "isLegacyCheckout": {},
785
871
  "confirmDialogOpen": {},
786
- "inventoryCheckErrorMessage": {}
872
+ "inventoryCheckErrorMessage": {},
873
+ "placedOrderInfo": {}
787
874
  };
788
875
  }
789
876
  static get methods() {
@@ -62,7 +62,7 @@
62
62
  background: var(--zonos-elements-gray-0);
63
63
  max-width: 90vw;
64
64
  max-height: 90vh;
65
- width: 350px;
65
+ width: var(--dialog-width);
66
66
  border-radius: var(--border-radius, 10px);
67
67
  outline: none;
68
68
  box-shadow: var(--zonos-elements-v3-shadow-xxl);
@@ -21,6 +21,7 @@ export class ZonosConfirmDialog {
21
21
  this.dialogSubtitle = null;
22
22
  this.submitBtnColor = undefined;
23
23
  this.dialogConfirmBtnText = undefined;
24
+ this.dialogWidth = 350;
24
25
  this.dialogCancelBtnText = undefined;
25
26
  this.dialogType = 'confirm';
26
27
  this.isMobile = false;
@@ -82,12 +83,13 @@ export class ZonosConfirmDialog {
82
83
  const borderStyle = getBorderRadius();
83
84
  // Get theme for the update dialog, inherit from the theme, no from this component theme
84
85
  const theme = getZonosStoreTheme(zonosStore.appearance.theme);
85
- return (h(Host, { key: '77cc26ec971a528d2f5115168c716de59440e5e3', class: classes([this.dialogOpen && 'open', 'zonos--elements']), "data-dialog-type": this.dialogType, "data-theme": theme, style: {
86
+ return (h(Host, { key: '3ce72ff0cc986ba772ccd376d5619587f14fd3ea', class: classes([this.dialogOpen && 'open', 'zonos--elements']), "data-dialog-type": this.dialogType, "data-theme": theme, style: {
86
87
  '--border-radius': borderStyle,
88
+ '--dialog-width': `${this.dialogWidth}px`,
87
89
  '--font-family': zonosStoreFontFamily(),
88
- } }, h("div", { key: '6120bd47e631be5d2300a8a996fef355f6b1b269', class: "zonos--backdrop", tabIndex: -1 }), h("div", { key: '5cf784224ade84189f87059a6923ed6e31c01903', "aria-hidden": "true", class: classes(['zonos--confirm-layout', this.dialogIntent]), onClick: e => this.clickOutsideDialogHandler(e) }, h("div", { key: '506707fbae72411df534b98dd9a6d1ed4b15787b', class: "zonos--confirm-dialog", onBlur: () => {
90
+ } }, h("div", { key: '2963b8604b543e3c36c1079db78fe77dceaed215', class: "zonos--backdrop", tabIndex: -1 }), h("div", { key: '3a5b515ca3d88b7ae78f0d81ad7127c610ab786e', "aria-hidden": "true", class: classes(['zonos--confirm-layout', this.dialogIntent]), onClick: e => this.clickOutsideDialogHandler(e) }, h("div", { key: 'b6070c25fefc396e5303240d58ae809dee4f8548', class: "zonos--confirm-dialog", onBlur: () => {
89
91
  this.focusDialog();
90
- } }, h("div", { key: '0926f36a825557de771abe24369e4ec4d77a1b41', class: "wrapper" }, h("div", { key: 'dc260b08ba1635a2d3bdd3533e9ea49e042db36c', class: "icon-wrapper" }, this.renderIcon()), h("div", { key: 'abec0bf3234dc00d331bd364e28cfe47c5e0f93e', class: "content" }, h("div", { key: '58547007970d8be7b1fb5c9b4e1f3ed0d4d82420', class: "title" }, h("zonos-text", { key: '4759fe0b09f10ba8501d78a70b1e06ee55af12c0', type: "subheader" }, this.dialogTitle)), this.dialogSubtitle && (h("div", { key: 'd0144f944516b491494f0016d5ece673546ee4bf', class: "subtitle" }, h("zonos-text", { key: 'aa4b392f133c62a4f2aad40761fae713cc348c55', textColor: "gray-800" }, this.dialogSubtitle)))), h("div", { key: 'ed8bfb3286e0109c4cd3cea1635cb701d1aa5a45', class: "footer" }, this.dialogType === 'confirm' && (h("zonos-button", { key: '63a79f239cda9b934ff497d449626aa44f4c058a', backgroundColor: "gray-0", class: "cancel-button", onClick: () => this.closeDialogHandler(), size: "lg", withBoxShadow: true }, this.dialogCancelBtnText || translate('Cancel'))), h("zonos-button", { key: '70b1f265a31b1e8645ad1b386193b6785756bb09', class: "confirm-button", onClick: () => this.confirmDialogHandler(), size: "lg", variant: this.getButtonConfirmVariant() }, this.dialogConfirmBtnText)))))));
92
+ } }, h("div", { key: 'cd67ad63f17ba734a417ffed3899044c70cfa16c', class: "wrapper" }, h("div", { key: '2801b0ab1e0931c00a103cc9fc2e983a7cb73452', class: "icon-wrapper" }, this.renderIcon()), h("div", { key: '9ab775b2c8fc9e042d92cddbee72cab31ebde7a3', class: "content" }, h("div", { key: '4a884d0d55bc4dde0d24d5d51328c0f27d221dae', class: "title" }, h("zonos-text", { key: '465ccc7a97b7192f1b1c4810627db583c95cd9c0', type: "subheader" }, this.dialogTitle)), this.dialogSubtitle && (h("div", { key: '4ef4d0544128c4a3c87521aa509b28d42e6f2a25', class: "subtitle" }, h("zonos-text", { key: '484e097b9fa41ddabcbb2c8e350c0cdbb232887b', textColor: "gray-800" }, this.dialogSubtitle)))), h("div", { key: '364b576633445f8b58e3824a817ff157950e8505', class: "footer" }, this.dialogType === 'confirm' && (h("zonos-button", { key: 'f483efb2564f687ad664aed0e7f578b7187f9c15', backgroundColor: "gray-0", class: "cancel-button", onClick: () => this.closeDialogHandler(), size: "lg", withBoxShadow: true }, this.dialogCancelBtnText || translate('Cancel'))), h("zonos-button", { key: 'c0329025de32980a7a3478ad32153f9b5e90c16c', class: "confirm-button", onClick: () => this.confirmDialogHandler(), size: "lg", variant: this.getButtonConfirmVariant() }, this.dialogConfirmBtnText)))))));
91
93
  }
92
94
  static get is() { return "zonos-confirm-dialog"; }
93
95
  static get encapsulation() { return "shadow"; }
@@ -201,6 +203,27 @@ export class ZonosConfirmDialog {
201
203
  "attribute": "dialog-confirm-btn-text",
202
204
  "reflect": false
203
205
  },
206
+ "dialogWidth": {
207
+ "type": "number",
208
+ "mutable": false,
209
+ "complexType": {
210
+ "original": "number",
211
+ "resolved": "number",
212
+ "references": {}
213
+ },
214
+ "required": false,
215
+ "optional": false,
216
+ "docs": {
217
+ "tags": [{
218
+ "name": "default",
219
+ "text": "350 px"
220
+ }],
221
+ "text": "Dialog width"
222
+ },
223
+ "attribute": "dialog-width",
224
+ "reflect": false,
225
+ "defaultValue": "350"
226
+ },
204
227
  "dialogCancelBtnText": {
205
228
  "type": "string",
206
229
  "mutable": false,
@@ -214,6 +214,8 @@ const paypalStoreInitButtons = (props) => {
214
214
  return paypalStore.paypalButtons;
215
215
  };
216
216
  const paypalStoreHasPaypalEnabled = () => {
217
- return !!paypalStore.paypalButtons.length;
217
+ var _a, _b;
218
+ const paypalEnabledInSetting = ((_b = (_a = zonosStore.checkoutSettings.externalPaymentMethods) === null || _a === void 0 ? void 0 : _a.find(payment => payment.type === 'PAYPAL')) === null || _b === void 0 ? void 0 : _b.status) === 'ENABLED';
219
+ return paypalEnabledInSetting || !!paypalStore.paypalButtons.length;
218
220
  };
219
221
  export { paypalInitScript, paypalStore, paypalStoreCreaterOrder, paypalStoreHasPaypalEnabled, paypalStoreInitButtons, paypalStoreReset, };
@@ -45,12 +45,13 @@ const { onChange, reset, state: stripeStore, } = createStore(() => ({
45
45
  name: {},
46
46
  },
47
47
  }));
48
- const getStripeOptions = ({ clientSecret, overrideBorderRadius, overridePrimaryColor, overrideSecondaryColor, overrideTheme, }) => {
48
+ const getStripeOptions = ({ clientSecret, overrideBorderRadius, overridePrimaryColor, overrideSecondaryColor, overrideTheme, paypalEnabled, }) => {
49
49
  const primaryColor = overridePrimaryColor || zonosStore.appearance.colorPrimary;
50
50
  const secondaryColor = overrideSecondaryColor || zonosStore.appearance.colorSecondary;
51
51
  const themeBasedColor = primaryColor && isDarkColor(primaryColor) ? 'night' : 'flat';
52
52
  // if overrideTheme is provided, use it. Otherwise, use theme based on primary color
53
53
  const theme = overrideTheme === 'DARK' ? 'night' : 'flat';
54
+ const paypalPaymenType = paypalEnabled ? ['external_paypal'] : [];
54
55
  return {
55
56
  appearance: {
56
57
  labels: 'floating',
@@ -66,7 +67,7 @@ const getStripeOptions = ({ clientSecret, overrideBorderRadius, overridePrimaryC
66
67
  }),
67
68
  },
68
69
  clientSecret,
69
- externalPaymentMethodTypes: ['external_paypal'],
70
+ externalPaymentMethodTypes: [...paypalPaymenType],
70
71
  locale: localizationStore.selectedLocale,
71
72
  };
72
73
  };
@@ -95,6 +96,7 @@ const initStripeElements = async (props) => {
95
96
  overridePrimaryColor: props === null || props === void 0 ? void 0 : props.overridePrimaryColor,
96
97
  overrideSecondaryColor: props === null || props === void 0 ? void 0 : props.overrideSecondaryColor,
97
98
  overrideTheme: props === null || props === void 0 ? void 0 : props.overrideTheme,
99
+ paypalEnabled: props === null || props === void 0 ? void 0 : props.paypalEnabled,
98
100
  });
99
101
  // compare with the previous options to see if we need to update
100
102
  const isSameOptions = JSON.stringify(stripeOptions) ===
@@ -143,6 +143,12 @@ export const stringsArabic = {
143
143
  'Invalid promo code': {
144
144
  value: 'رمز ترويجي غير صالح',
145
145
  },
146
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?': {
147
+ value: 'يبدو أنك قدمت طلبًا قبل بضع دقائق فقط ([date] في [time]) تحت رقم الطلب #[orderNumber]. تحقق من بريدك الإلكتروني لتأكيد الطلب. هل أنت متأكد أنك تريد تقديم طلب آخر؟',
148
+ },
149
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?': {
150
+ value: 'يبدو أنك قدمت طلبًا قبل بضع دقائق فقط ([date] في [time]). تحقق من بريدك الإلكتروني لتأكيد الطلب. هل أنت متأكد أنك تريد تقديم طلب آخر؟',
151
+ },
146
152
  'Keep shopping': {
147
153
  value: 'متابعة التسوق',
148
154
  },
@@ -221,6 +227,9 @@ export const stringsArabic = {
221
227
  'Prepay duties and taxes at checkout': {
222
228
  value: 'دفع الرسوم والضرائب مقدمًا عند الدفع',
223
229
  },
230
+ 'Proceed with order': {
231
+ value: 'المتابعة مع الطلب',
232
+ },
224
233
  'Product prices already include duties and fees. No additional duties or fees will be added at checkout, with rare exceptions.': {
225
234
  value: 'أسعار المنتجات تشمل بالفعل الرسوم والضرائب. لن يتم إضافة أي رسوم أو ضرائب إضافية عند الدفع، باستثناءات نادرة.',
226
235
  },
@@ -257,6 +266,9 @@ export const stringsArabic = {
257
266
  'Return to cart': {
258
267
  value: 'العودة إلى العربة',
259
268
  },
269
+ 'Return to merchant site': {
270
+ value: 'العودة إلى موقع التاجر',
271
+ },
260
272
  'Search countries': {
261
273
  value: 'ابحث عن الدول',
262
274
  },
@@ -143,6 +143,12 @@ export const stringsBase = {
143
143
  'Invalid promo code': {
144
144
  value: 'Invalid promo code',
145
145
  },
146
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?': {
147
+ value: 'It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?',
148
+ },
149
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?': {
150
+ value: 'It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?',
151
+ },
146
152
  'Keep shopping': {
147
153
  value: 'Keep shopping',
148
154
  },
@@ -221,6 +227,9 @@ export const stringsBase = {
221
227
  'Prepay duties and taxes at checkout': {
222
228
  value: 'Prepay duties and taxes at checkout',
223
229
  },
230
+ 'Proceed with order': {
231
+ value: 'Proceed with order',
232
+ },
224
233
  'Product prices already include duties and fees. No additional duties or fees will be added at checkout, with rare exceptions.': {
225
234
  value: 'Product prices already include duties and fees. No additional duties or fees will be added at checkout, with rare exceptions.',
226
235
  },
@@ -257,6 +266,9 @@ export const stringsBase = {
257
266
  'Return to cart': {
258
267
  value: 'Return to cart',
259
268
  },
269
+ 'Return to merchant site': {
270
+ value: 'Return to merchant site',
271
+ },
260
272
  'Search countries': {
261
273
  value: 'Search countries',
262
274
  },
@@ -143,6 +143,12 @@ export const stringsChinese = {
143
143
  'Invalid promo code': {
144
144
  value: '无效的促销代码',
145
145
  },
146
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?': {
147
+ value: '您似乎在几分钟前下了一个订单([date] [time]),订单号为#[orderNumber]。请检查您的电子邮件以获取订单确认。您确定要下另一个订单吗?',
148
+ },
149
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?': {
150
+ value: '您似乎在几分钟前下了订单([date] [time])。请检查您的电子邮件以获取订单确认。您确定要再下一个订单吗?',
151
+ },
146
152
  'Keep shopping': {
147
153
  value: '继续购物',
148
154
  },
@@ -221,6 +227,9 @@ export const stringsChinese = {
221
227
  'Prepay duties and taxes at checkout': {
222
228
  value: '在结账时预付关税和税款',
223
229
  },
230
+ 'Proceed with order': {
231
+ value: '继续订单',
232
+ },
224
233
  'Product prices already include duties and fees. No additional duties or fees will be added at checkout, with rare exceptions.': {
225
234
  value: '产品价格已包含关税和费用。结账时不会增加额外的关税或费用,极少数情况除外。',
226
235
  },
@@ -257,6 +266,9 @@ export const stringsChinese = {
257
266
  'Return to cart': {
258
267
  value: '返回购物车',
259
268
  },
269
+ 'Return to merchant site': {
270
+ value: '返回商家网站',
271
+ },
260
272
  'Search countries': {
261
273
  value: '搜索国家',
262
274
  },
@@ -143,6 +143,12 @@ export const stringsDanish = {
143
143
  'Invalid promo code': {
144
144
  value: 'Ugyldig kampagnekode',
145
145
  },
146
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?': {
147
+ value: 'Det ser ud til, at du afgav en ordre for få minutter siden ([date] kl. [time]) under ordrenummer #[orderNumber]. Tjek din e-mail for ordrebekræftelsen. Er du sikker på, at du vil afgive en ny ordre?',
148
+ },
149
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?': {
150
+ value: 'Det ser ud til, at du har afgivet en ordre for få minutter siden ([date] kl. [time]). Tjek din e-mail for ordrebekræftelsen. Er du sikker på, at du vil afgive en til?',
151
+ },
146
152
  'Keep shopping': {
147
153
  value: 'Fortsæt med at handle',
148
154
  },
@@ -221,6 +227,9 @@ export const stringsDanish = {
221
227
  'Prepay duties and taxes at checkout': {
222
228
  value: 'Betal told og skatter på forhånd ved kassen',
223
229
  },
230
+ 'Proceed with order': {
231
+ value: 'Fortsæt med ordren',
232
+ },
224
233
  'Product prices already include duties and fees. No additional duties or fees will be added at checkout, with rare exceptions.': {
225
234
  value: 'Produktpriser inkluderer allerede told og gebyrer. Ingen yderligere told eller gebyrer vil blive tilføjet ved kassen, med sjældne undtagelser.',
226
235
  },
@@ -257,6 +266,9 @@ export const stringsDanish = {
257
266
  'Return to cart': {
258
267
  value: 'Tilbage til kurven',
259
268
  },
269
+ 'Return to merchant site': {
270
+ value: 'Vend tilbage til forhandlersiden',
271
+ },
260
272
  'Search countries': {
261
273
  value: 'Søg lande',
262
274
  },
@@ -143,6 +143,12 @@ export const stringsDutch = {
143
143
  'Invalid promo code': {
144
144
  value: 'Ongeldige promotiecode',
145
145
  },
146
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?': {
147
+ value: 'Het lijkt erop dat je een paar minuten geleden een bestelling hebt geplaatst ([date] om [time]) onder bestelnummer #[orderNumber]. Controleer je e-mail voor de orderbevestiging. Weet je zeker dat je nog een bestelling wilt plaatsen?',
148
+ },
149
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?': {
150
+ value: 'Het lijkt erop dat je een paar minuten geleden een bestelling hebt geplaatst ([date] om [time]). Controleer je e-mail voor de orderbevestiging. Weet je zeker dat je er nog een wilt plaatsen?',
151
+ },
146
152
  'Keep shopping': {
147
153
  value: 'Blijf winkelen',
148
154
  },
@@ -221,6 +227,9 @@ export const stringsDutch = {
221
227
  'Prepay duties and taxes at checkout': {
222
228
  value: 'Heffingen en belastingen vooraf betalen bij het afrekenen',
223
229
  },
230
+ 'Proceed with order': {
231
+ value: 'Doorgaan met de bestelling',
232
+ },
224
233
  'Product prices already include duties and fees. No additional duties or fees will be added at checkout, with rare exceptions.': {
225
234
  value: 'Productprijzen zijn inclusief belastingen en heffingen. Er worden geen extra belastingen of heffingen toegevoegd bij het afrekenen, met zeldzame uitzonderingen.',
226
235
  },
@@ -257,6 +266,9 @@ export const stringsDutch = {
257
266
  'Return to cart': {
258
267
  value: 'Terug naar winkelwagen',
259
268
  },
269
+ 'Return to merchant site': {
270
+ value: 'Terug naar de handelaarssite',
271
+ },
260
272
  'Search countries': {
261
273
  value: 'Zoek landen',
262
274
  },
@@ -143,6 +143,12 @@ export const stringsFrench = {
143
143
  'Invalid promo code': {
144
144
  value: 'Code promo invalide',
145
145
  },
146
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?': {
147
+ value: 'Il semble que vous ayez passé une commande il y a quelques minutes ([date] à [time]) sous le numéro de commande #[orderNumber]. Vérifiez votre e-mail pour la confirmation de commande. Êtes-vous sûr de vouloir passer une autre commande?',
148
+ },
149
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?': {
150
+ value: 'Il semble que vous ayez passé une commande il y a quelques minutes ([date] à [time]). Vérifiez votre e-mail pour la confirmation de commande. Êtes-vous sûr de vouloir en passer une autre?',
151
+ },
146
152
  'Keep shopping': {
147
153
  value: 'Continuer à faire du shopping',
148
154
  },
@@ -221,6 +227,9 @@ export const stringsFrench = {
221
227
  'Prepay duties and taxes at checkout': {
222
228
  value: "Payez les droits et taxes à l'avance lors du checkout",
223
229
  },
230
+ 'Proceed with order': {
231
+ value: 'Procéder à la commande',
232
+ },
224
233
  'Product prices already include duties and fees. No additional duties or fees will be added at checkout, with rare exceptions.': {
225
234
  value: 'Les prix des produits incluent déjà les droits et les frais. Aucun droit ou frais supplémentaire ne sera ajouté lors du paiement, sauf rares exceptions.',
226
235
  },
@@ -257,6 +266,9 @@ export const stringsFrench = {
257
266
  'Return to cart': {
258
267
  value: 'Retour au panier',
259
268
  },
269
+ 'Return to merchant site': {
270
+ value: 'Retourner sur le site du marchand',
271
+ },
260
272
  'Search countries': {
261
273
  value: 'Rechercher des pays',
262
274
  },
@@ -143,6 +143,12 @@ export const stringsGerman = {
143
143
  'Invalid promo code': {
144
144
  value: 'Ungültiger Aktionscode',
145
145
  },
146
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]) under order number #[orderNumber]. Check your email for the order confirmation. Are you sure you want to place another order?': {
147
+ value: 'Es sieht so aus, als hätten Sie vor ein paar Minuten eine Bestellung aufgegeben ([date] um [time]) unter der Bestellnummer #[orderNumber]. Überprüfen Sie Ihre E-Mails auf die Bestellbestätigung. Sind Sie sicher, dass Sie eine weitere Bestellung aufgeben möchten?',
148
+ },
149
+ 'It looks like you placed an order just a few minutes ago ([date] at [time]). Check your email for the order confirmation. Are you sure you want to place another one?': {
150
+ value: 'Es sieht so aus, als hätten Sie vor ein paar Minuten eine Bestellung aufgegeben ([date] um [time]). Überprüfen Sie Ihre E-Mails auf die Bestellbestätigung. Sind Sie sicher, dass Sie eine weitere aufgeben möchten?',
151
+ },
146
152
  'Keep shopping': {
147
153
  value: 'Einkauf fortsetzen',
148
154
  },
@@ -221,6 +227,9 @@ export const stringsGerman = {
221
227
  'Prepay duties and taxes at checkout': {
222
228
  value: 'Zölle und Steuern im Voraus bezahlen',
223
229
  },
230
+ 'Proceed with order': {
231
+ value: 'Mit der Bestellung fortfahren',
232
+ },
224
233
  'Product prices already include duties and fees. No additional duties or fees will be added at checkout, with rare exceptions.': {
225
234
  value: 'Produktpreise beinhalten bereits Zölle und Gebühren. Keine zusätzlichen Zölle oder Gebühren werden beim Checkout hinzugefügt, mit seltenen Ausnahmen.',
226
235
  },
@@ -257,6 +266,9 @@ export const stringsGerman = {
257
266
  'Return to cart': {
258
267
  value: 'Zurück zum Warenkorb',
259
268
  },
269
+ 'Return to merchant site': {
270
+ value: 'Zurück zur Händlerseite',
271
+ },
260
272
  'Search countries': {
261
273
  value: 'Länder durchsuchen',
262
274
  },