@zonos/elements 1.3.106 → 1.3.107

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 (142) hide show
  1. package/dist/cjs/{cart-31e4e866.js → cart-9f3864db.js} +240 -0
  2. package/dist/cjs/{createCustomEvent-18fbf653.js → createCustomEvent-7a156d77.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-610cccad.js} +1 -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 +89 -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 +89 -3
  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/translationStore/strings.arabic.js +12 -0
  22. package/dist/collection/components/store/translationStore/strings.base.js +12 -0
  23. package/dist/collection/components/store/translationStore/strings.chinese.js +12 -0
  24. package/dist/collection/components/store/translationStore/strings.danish.js +12 -0
  25. package/dist/collection/components/store/translationStore/strings.dutch.js +12 -0
  26. package/dist/collection/components/store/translationStore/strings.french.js +12 -0
  27. package/dist/collection/components/store/translationStore/strings.german.js +12 -0
  28. package/dist/collection/components/store/translationStore/strings.hebrew.js +12 -0
  29. package/dist/collection/components/store/translationStore/strings.indonesian.js +12 -0
  30. package/dist/collection/components/store/translationStore/strings.italian.js +12 -0
  31. package/dist/collection/components/store/translationStore/strings.japanese.js +12 -0
  32. package/dist/collection/components/store/translationStore/strings.korean.js +12 -0
  33. package/dist/collection/components/store/translationStore/strings.norwegian.js +12 -0
  34. package/dist/collection/components/store/translationStore/strings.polish.js +12 -0
  35. package/dist/collection/components/store/translationStore/strings.portuguese.js +12 -0
  36. package/dist/collection/components/store/translationStore/strings.russian.js +12 -0
  37. package/dist/collection/components/store/translationStore/strings.spanish.js +12 -0
  38. package/dist/collection/components/store/translationStore/strings.swedish.js +12 -0
  39. package/dist/collection/components/store/translationStore/strings.turkish.js +12 -0
  40. package/dist/collection/components/store/translationStore/strings.vietnamese.js +12 -0
  41. package/dist/collection/types/checkout/OrderPlacedInfo.js +1 -0
  42. package/dist/esm/{cart-5621d0fe.js → cart-4ba1878f.js} +240 -0
  43. package/dist/esm/{createCustomEvent-a9206df5.js → createCustomEvent-5fdd75bf.js} +1 -1
  44. package/dist/esm/index.js +7 -7
  45. package/dist/esm/loader.js +1 -1
  46. package/dist/esm/{paypal-869c30e1.js → paypal-3d7d0148.js} +1 -1
  47. package/dist/esm/zonos-address_7.entry.js +1 -1
  48. package/dist/esm/zonos-cart-items_13.entry.js +37 -14
  49. package/dist/esm/zonos-checkout.entry.js +90 -6
  50. package/dist/esm/zonos-controller.entry.js +1 -1
  51. package/dist/esm/zonos-country-flag.entry.js +1 -1
  52. package/dist/esm/zonos-country-select_4.entry.js +1 -1
  53. package/dist/esm/zonos-elements.js +1 -1
  54. package/dist/esm/zonos-hello-dialog.entry.js +1 -1
  55. package/dist/esm/zonos-hello.entry.js +1 -1
  56. package/dist/esm/zonos-language-select_2.entry.js +1 -1
  57. package/dist/esm/zonos-notification_3.entry.js +2 -2
  58. package/dist/esm-es5/cart-4ba1878f.js +1 -0
  59. package/dist/esm-es5/{createCustomEvent-a9206df5.js → createCustomEvent-5fdd75bf.js} +1 -1
  60. package/dist/esm-es5/index.js +1 -1
  61. package/dist/esm-es5/loader.js +1 -1
  62. package/dist/esm-es5/{paypal-869c30e1.js → paypal-3d7d0148.js} +1 -1
  63. package/dist/esm-es5/zonos-address_7.entry.js +1 -1
  64. package/dist/esm-es5/zonos-cart-items_13.entry.js +1 -1
  65. package/dist/esm-es5/zonos-checkout.entry.js +1 -1
  66. package/dist/esm-es5/zonos-controller.entry.js +1 -1
  67. package/dist/esm-es5/zonos-country-flag.entry.js +1 -1
  68. package/dist/esm-es5/zonos-country-select_4.entry.js +1 -1
  69. package/dist/esm-es5/zonos-elements.js +1 -1
  70. package/dist/esm-es5/zonos-hello-dialog.entry.js +1 -1
  71. package/dist/esm-es5/zonos-hello.entry.js +1 -1
  72. package/dist/esm-es5/zonos-language-select_2.entry.js +1 -1
  73. package/dist/esm-es5/zonos-notification_3.entry.js +1 -1
  74. package/dist/scripts/index.d.ts +10 -0
  75. package/dist/scripts/index.js +1 -1
  76. package/dist/scripts/loadZonos.js +1 -1
  77. package/dist/scripts/zonos.js +1 -1
  78. package/dist/types/components/checkout/zonos-checkout/zonos-checkout-finish/zonos-checkout-finish.d.ts +1 -0
  79. package/dist/types/components/checkout/zonos-checkout/zonos-checkout.d.ts +10 -0
  80. package/dist/types/components/common/zonos-confirm-dialog/zonos-confirm-dialog.d.ts +5 -0
  81. package/dist/types/components/store/translationStore/strings.arabic.d.ts +12 -0
  82. package/dist/types/components/store/translationStore/strings.base.d.ts +12 -0
  83. package/dist/types/components/store/translationStore/strings.chinese.d.ts +12 -0
  84. package/dist/types/components/store/translationStore/strings.danish.d.ts +12 -0
  85. package/dist/types/components/store/translationStore/strings.dutch.d.ts +12 -0
  86. package/dist/types/components/store/translationStore/strings.french.d.ts +12 -0
  87. package/dist/types/components/store/translationStore/strings.german.d.ts +12 -0
  88. package/dist/types/components/store/translationStore/strings.hebrew.d.ts +12 -0
  89. package/dist/types/components/store/translationStore/strings.indonesian.d.ts +12 -0
  90. package/dist/types/components/store/translationStore/strings.italian.d.ts +12 -0
  91. package/dist/types/components/store/translationStore/strings.japanese.d.ts +12 -0
  92. package/dist/types/components/store/translationStore/strings.korean.d.ts +12 -0
  93. package/dist/types/components/store/translationStore/strings.norwegian.d.ts +12 -0
  94. package/dist/types/components/store/translationStore/strings.polish.d.ts +12 -0
  95. package/dist/types/components/store/translationStore/strings.portuguese.d.ts +12 -0
  96. package/dist/types/components/store/translationStore/strings.russian.d.ts +12 -0
  97. package/dist/types/components/store/translationStore/strings.spanish.d.ts +12 -0
  98. package/dist/types/components/store/translationStore/strings.swedish.d.ts +12 -0
  99. package/dist/types/components/store/translationStore/strings.turkish.d.ts +12 -0
  100. package/dist/types/components/store/translationStore/strings.vietnamese.d.ts +12 -0
  101. package/dist/types/components/store/translationStore.d.ts +1 -1
  102. package/dist/types/components.d.ts +10 -0
  103. package/dist/types/types/checkout/OrderPlacedInfo.d.ts +19 -0
  104. package/dist/zonos-elements/index.esm.js +1 -1
  105. package/dist/zonos-elements/{p-062b6df4.system.js → p-09faf6e8.system.js} +1 -1
  106. package/dist/zonos-elements/p-250f5e67.entry.js +1 -0
  107. package/dist/zonos-elements/{p-c2e463b7.system.entry.js → p-2a522e2f.system.entry.js} +1 -1
  108. package/dist/zonos-elements/{p-e3b110c7.system.entry.js → p-43df09ad.system.entry.js} +1 -1
  109. package/dist/zonos-elements/{p-a8b27301.entry.js → p-5d7606f0.entry.js} +1 -1
  110. package/dist/zonos-elements/{p-6a310417.js → p-61489a67.js} +1 -1
  111. package/dist/zonos-elements/{p-7f93ce41.system.entry.js → p-62d88537.system.entry.js} +1 -1
  112. package/dist/zonos-elements/{p-139e32ba.system.entry.js → p-6b58734c.system.entry.js} +1 -1
  113. package/dist/zonos-elements/{p-1bb59ce2.system.entry.js → p-6fb1434f.system.entry.js} +1 -1
  114. package/dist/zonos-elements/{p-2babfaa4.system.js → p-7ef9b1e9.system.js} +1 -1
  115. package/dist/zonos-elements/{p-21586642.system.entry.js → p-7f543fa7.system.entry.js} +1 -1
  116. package/dist/zonos-elements/p-99d3ecd4.js +1 -0
  117. package/dist/zonos-elements/p-9c89dadf.system.js +1 -0
  118. package/dist/zonos-elements/p-9d7eb65e.system.entry.js +1 -0
  119. package/dist/zonos-elements/{p-65512b26.entry.js → p-a84da418.entry.js} +1 -1
  120. package/dist/zonos-elements/{p-82fec811.system.entry.js → p-b0e0271d.system.entry.js} +1 -1
  121. package/dist/zonos-elements/{p-7562828c.entry.js → p-b2a3e0f0.entry.js} +1 -1
  122. package/dist/zonos-elements/{p-f5e54692.entry.js → p-b9f595e2.entry.js} +1 -1
  123. package/dist/zonos-elements/{p-5b6fa002.system.entry.js → p-bac9279b.system.entry.js} +1 -1
  124. package/dist/zonos-elements/{p-43ef8bf8.entry.js → p-bfab2cf6.entry.js} +1 -1
  125. package/dist/zonos-elements/{p-1c295409.system.js → p-c3167f3c.system.js} +1 -1
  126. package/dist/zonos-elements/p-c78dd680.system.js +1 -1
  127. package/dist/zonos-elements/{p-cfda42ba.entry.js → p-d65d7206.entry.js} +1 -1
  128. package/dist/zonos-elements/p-d9752dd6.js +1 -0
  129. package/dist/zonos-elements/{p-7152f8ca.entry.js → p-db0c6041.entry.js} +1 -1
  130. package/dist/zonos-elements/{p-23b042ad.entry.js → p-db824268.entry.js} +1 -1
  131. package/dist/zonos-elements/p-ec46325e.entry.js +1 -0
  132. package/dist/zonos-elements/p-fce4ea2c.system.entry.js +1 -0
  133. package/dist/zonos-elements/zonos-elements.esm.js +1 -1
  134. package/package.json +1 -1
  135. package/dist/esm-es5/cart-5621d0fe.js +0 -1
  136. package/dist/zonos-elements/p-239331fa.system.js +0 -1
  137. package/dist/zonos-elements/p-39346436.js +0 -1
  138. package/dist/zonos-elements/p-523c0f7d.js +0 -1
  139. package/dist/zonos-elements/p-5a704905.system.entry.js +0 -1
  140. package/dist/zonos-elements/p-a0c012a5.system.entry.js +0 -1
  141. package/dist/zonos-elements/p-d002dd35.entry.js +0 -1
  142. package/dist/zonos-elements/p-fb624d44.entry.js +0 -1
@@ -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"; }
@@ -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
  /**
@@ -50,6 +53,22 @@ export class ZonosCheckout {
50
53
  overrideTheme: this.isMobile ? theme : undefined,
51
54
  });
52
55
  };
56
+ this.formatDate = (timestamp) => {
57
+ if (!timestamp) {
58
+ return '';
59
+ }
60
+ // get date in 24/12/2024 format (without time)
61
+ const date = new Date(timestamp);
62
+ return date.toLocaleDateString();
63
+ };
64
+ this.formatTime = (timestamp) => {
65
+ if (!timestamp) {
66
+ return '';
67
+ }
68
+ // get date in 24/12/2024 format (without time)
69
+ const date = new Date(timestamp);
70
+ return date.toLocaleTimeString();
71
+ };
53
72
  this.getCurrentLocalePageEnum = () => {
54
73
  switch (cartStore.step) {
55
74
  case 'customer-info':
@@ -78,6 +97,7 @@ export class ZonosCheckout {
78
97
  this.isLegacyCheckout = window.Zonos.isLegacyCheckout;
79
98
  this.confirmDialogOpen = false;
80
99
  this.inventoryCheckErrorMessage = null;
100
+ this.placedOrderInfo = null;
81
101
  }
82
102
  /**
83
103
  * Init cart info handler event
@@ -172,6 +192,50 @@ export class ZonosCheckout {
172
192
  reloadCheckoutSession() {
173
193
  window.location.reload();
174
194
  }
195
+ handleOrderDuplication() {
196
+ const existingPlacedOrderInfo = jsonParse(localStorage.getItem('zonos--placed-order-info'));
197
+ if (!existingPlacedOrderInfo) {
198
+ localStorage.removeItem('zonos--placed-order-info');
199
+ return;
200
+ }
201
+ const elapsed = Date.now() - existingPlacedOrderInfo.time;
202
+ log(`=== Existing placed order info: ${existingPlacedOrderInfo.orderId} - ${this.formatDate(existingPlacedOrderInfo.time)} - elapsed in hh:ss format: ${new Date(elapsed)
203
+ .toISOString()
204
+ .substring(11, 8)}`, 'warn');
205
+ const overrideExpiredDuplication = parseFloat(new URLSearchParams(window.location.search).get('zonosOverrideExpiredDuplication') || '0') || ORDER_DUPLICATION_NOTIFICATION_EXPIRATION;
206
+ // if the order is placed within 5 minutes, confirm with the user to proceed with the order duplication
207
+ if (elapsed > overrideExpiredDuplication) {
208
+ log(`=== Existing placed order info is older than ${overrideExpiredDuplication}ms, cleaning localStorage`, 'warn');
209
+ // remove the placed order info if it's older than 5 minutes and do nothing.
210
+ localStorage.removeItem('zonos--placed-order-info');
211
+ return;
212
+ }
213
+ // Set placed order info to show the confirm notification to the user
214
+ this.placedOrderInfo = existingPlacedOrderInfo;
215
+ log('=== Showing order duplication confirmation', 'warn');
216
+ }
217
+ confirmProceedWithOrderDuplication() {
218
+ // Reset the placed order info
219
+ this.placedOrderInfo = null;
220
+ }
221
+ handleCancelOrderDuplication() {
222
+ var _a;
223
+ // Reset the placed order info
224
+ this.placedOrderInfo = null;
225
+ // Redirect to the vendor store url if this is legacy checkout
226
+ if (this.isLegacyCheckout) {
227
+ const storeBaseUrl = (_a = window.Zonos.cartData) === null || _a === void 0 ? void 0 : _a.storeBaseUrl;
228
+ if (!storeBaseUrl) {
229
+ return;
230
+ }
231
+ if (window.parent) {
232
+ window.parent.location.href = storeBaseUrl;
233
+ }
234
+ window.location.href = storeBaseUrl;
235
+ return;
236
+ }
237
+ void this.closeDialogHandler({ confirmed: true });
238
+ }
175
239
  attachCheckout() {
176
240
  const buttonAnchorSelector = zonosStore.checkoutSettings.placeOrderButtonSelector;
177
241
  log(`attach checkout ${buttonAnchorSelector}`);
@@ -228,6 +292,7 @@ export class ZonosCheckout {
228
292
  cartStore.shouldHideDiscountInput = !enabled;
229
293
  submitGtag('zonos-checkout-start');
230
294
  void trackConversionEvent('checkout_open');
295
+ this.handleOrderDuplication();
231
296
  if (window.Zonos.isLegacyCheckout) {
232
297
  void sendLoadCheckoutFacadeLog();
233
298
  }
@@ -569,7 +634,7 @@ export class ZonosCheckout {
569
634
  this.onChangeLocaleListener();
570
635
  }
571
636
  render() {
572
- var _a;
637
+ var _a, _b, _c, _d;
573
638
  const dialogLoading =
574
639
  // if it's last step, don't need to check stripe elements
575
640
  (cartStore.step !== 'finish' &&
@@ -643,7 +708,27 @@ export class ZonosCheckout {
643
708
  this.confirmDialogOpen = false;
644
709
  },
645
710
  // 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",
711
+ 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:
712
+ /**
713
+ * Show order number if it's available, otherwise just show the time
714
+ */
715
+ ((_b = this.placedOrderInfo) === null || _b === void 0 ? void 0 : _b.zonosOrderNumber)
716
+ ? 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?', {
717
+ date: this.formatDate(this.placedOrderInfo.time),
718
+ orderNumber: this.placedOrderInfo.zonosOrderNumber,
719
+ time: this.formatTime(this.placedOrderInfo.time),
720
+ })
721
+ : 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?', {
722
+ date: this.formatDate(((_c = this.placedOrderInfo) === null || _c === void 0 ? void 0 : _c.time) || null),
723
+ time: this.formatTime(((_d = this.placedOrderInfo) === null || _d === void 0 ? void 0 : _d.time) || null),
724
+ }), dialogTitle: translate('Are you sure?'), dialogWidth: 450, onCancelClicked: () => {
725
+ this.handleCancelOrderDuplication();
726
+ },
727
+ // Mark user selected confirm to close the dialog
728
+ onConfirmClicked: () => {
729
+ // Reset the placed order info and close the dialog
730
+ this.confirmProceedWithOrderDuplication();
731
+ } }), h("zonos-confirm-dialog", { class: "zonos--inventory-check-failure-dialog", dialogConfirmBtnText: translate('Return to cart'), dialogIntent: "danger",
647
732
  // Show dialog if inventory check error message is not null
648
733
  dialogOpen: !!cartStore.inventoryCheckErrorMessage,
649
734
  // If dialog is in open state, the message should not be null
@@ -783,7 +868,8 @@ export class ZonosCheckout {
783
868
  "storybookPaymentStatusOverride": {},
784
869
  "isLegacyCheckout": {},
785
870
  "confirmDialogOpen": {},
786
- "inventoryCheckErrorMessage": {}
871
+ "inventoryCheckErrorMessage": {},
872
+ "placedOrderInfo": {}
787
873
  };
788
874
  }
789
875
  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,
@@ -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
  },
@@ -143,6 +143,12 @@ export const stringsHebrew = {
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 stringsHebrew = {
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 stringsHebrew = {
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 stringsIndonesian = {
143
143
  'Invalid promo code': {
144
144
  value: 'Kode promo tidak valid',
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: 'Sepertinya Anda baru saja melakukan pemesanan beberapa menit yang lalu ([date] pukul [time]) dengan nomor pesanan #[orderNumber]. Periksa email Anda untuk konfirmasi pesanan. Apakah Anda yakin ingin melakukan pemesanan lain?',
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: 'Sepertinya Anda baru saja melakukan pemesanan beberapa menit yang lalu ([date] pukul [time]). Periksa email Anda untuk konfirmasi pesanan. Apakah Anda yakin ingin melakukan pemesanan lagi?',
151
+ },
146
152
  'Keep shopping': {
147
153
  value: 'Lanjut belanja',
148
154
  },
@@ -221,6 +227,9 @@ export const stringsIndonesian = {
221
227
  'Prepay duties and taxes at checkout': {
222
228
  value: 'Pembayaran bea masuk dan pajak di kasir',
223
229
  },
230
+ 'Proceed with order': {
231
+ value: 'Lanjutkan dengan pesanan',
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: 'Harga produk sudah termasuk bea dan biaya. Tidak ada bea atau biaya tambahan yang akan ditambahkan saat checkout, dengan pengecualian yang jarang terjadi.',
226
235
  },
@@ -257,6 +266,9 @@ export const stringsIndonesian = {
257
266
  'Return to cart': {
258
267
  value: 'Kembali ke keranjang',
259
268
  },
269
+ 'Return to merchant site': {
270
+ value: 'Kembali ke situs pedagang',
271
+ },
260
272
  'Search countries': {
261
273
  value: 'Cari negara',
262
274
  },