@zonos/elements 1.2.1 → 1.2.3

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 (114) hide show
  1. package/dist/cjs/{cart-7b70853c.js → cart-55512e32.js} +12 -2
  2. package/dist/cjs/index.cjs.js +2 -2
  3. package/dist/cjs/{localization-387a8a65.js → localization-d7fe7290.js} +40 -13
  4. package/dist/cjs/{submitGtag-bf6e7c5e.js → submitGtag-d65003f9.js} +1 -1
  5. package/dist/cjs/zonos-address_2.cjs.entry.js +7 -2
  6. package/dist/cjs/zonos-cart-items_10.cjs.entry.js +6 -7
  7. package/dist/cjs/zonos-checkout.cjs.entry.js +8 -4
  8. package/dist/cjs/zonos-controller.cjs.entry.js +49 -3
  9. package/dist/cjs/zonos-country-flag_4.cjs.entry.js +1 -1
  10. package/dist/cjs/zonos-hello-dialog.cjs.entry.js +15 -7
  11. package/dist/cjs/zonos-hello.cjs.entry.js +1 -1
  12. package/dist/cjs/zonos-payment.cjs.entry.js +2 -2
  13. package/dist/cjs/zonos-shipping-rich-radio.cjs.entry.js +1 -1
  14. package/dist/collection/components/checkout/zonos-checkout/zonos-checkout.css +2 -2
  15. package/dist/collection/components/checkout/zonos-checkout/zonos-checkout.js +4 -0
  16. package/dist/collection/components/checkout/zonos-checkout/zonos-shipping/zonos-shipping.js +3 -5
  17. package/dist/collection/components/common/zonos-shipping-rich-radio/zonos-shipping-rich-radio.css +1 -0
  18. package/dist/collection/components/hello/zonos-hello-dialog/zonos-hello-dialog.js +15 -7
  19. package/dist/collection/components/main/zonos-controller.js +46 -0
  20. package/dist/collection/components/store/checkout/stripe.js +11 -1
  21. package/dist/collection/components/store/hello/localization.js +31 -9
  22. package/dist/collection/components/stripe/zonos-address/zonos-address.js +5 -0
  23. package/dist/collection/components/utils/api/getExchangeRate.js +9 -4
  24. package/dist/collection/components/utils/checkout/initCheckout.js +1 -1
  25. package/dist/collection/environment.js +22 -13
  26. package/dist/collection/scripts/zonos.js +84 -3
  27. package/dist/collection/utils/generateVercelDeployUrl.js +3 -2
  28. package/dist/components/cart.js +11 -1
  29. package/dist/components/localization.js +40 -13
  30. package/dist/components/zonos-address2.js +5 -0
  31. package/dist/components/zonos-checkout.js +5 -1
  32. package/dist/components/zonos-controller.js +47 -1
  33. package/dist/components/zonos-hello-dialog2.js +15 -7
  34. package/dist/components/zonos-shipping-rich-radio2.js +1 -1
  35. package/dist/components/zonos-shipping2.js +4 -5
  36. package/dist/esm/{cart-07091d2a.js → cart-17650017.js} +12 -2
  37. package/dist/esm/index.js +2 -2
  38. package/dist/esm/{localization-b3c2a9a9.js → localization-f3828793.js} +40 -13
  39. package/dist/esm/{submitGtag-c0b655ad.js → submitGtag-a901ece5.js} +1 -1
  40. package/dist/esm/zonos-address_2.entry.js +7 -2
  41. package/dist/esm/zonos-cart-items_10.entry.js +6 -7
  42. package/dist/esm/zonos-checkout.entry.js +8 -4
  43. package/dist/esm/zonos-controller.entry.js +49 -3
  44. package/dist/esm/zonos-country-flag_4.entry.js +1 -1
  45. package/dist/esm/zonos-hello-dialog.entry.js +15 -7
  46. package/dist/esm/zonos-hello.entry.js +1 -1
  47. package/dist/esm/zonos-payment.entry.js +2 -2
  48. package/dist/esm/zonos-shipping-rich-radio.entry.js +1 -1
  49. package/dist/esm-es5/cart-17650017.js +1 -0
  50. package/dist/esm-es5/index.js +1 -1
  51. package/dist/esm-es5/{localization-b3c2a9a9.js → localization-f3828793.js} +1 -1
  52. package/dist/esm-es5/{submitGtag-c0b655ad.js → submitGtag-a901ece5.js} +1 -1
  53. package/dist/esm-es5/zonos-address_2.entry.js +1 -1
  54. package/dist/esm-es5/zonos-cart-items_10.entry.js +1 -1
  55. package/dist/esm-es5/zonos-checkout.entry.js +1 -1
  56. package/dist/esm-es5/zonos-controller.entry.js +1 -1
  57. package/dist/esm-es5/zonos-country-flag_4.entry.js +1 -1
  58. package/dist/esm-es5/zonos-hello-dialog.entry.js +1 -1
  59. package/dist/esm-es5/zonos-hello.entry.js +1 -1
  60. package/dist/esm-es5/zonos-payment.entry.js +1 -1
  61. package/dist/esm-es5/zonos-shipping-rich-radio.entry.js +1 -1
  62. package/dist/scripts/loadZonos.js +86 -5
  63. package/dist/scripts/zonos.js +86 -5
  64. package/dist/types/components/main/zonos-controller.d.ts +1 -0
  65. package/dist/types/components/store/checkout/stripe.d.ts +2 -1
  66. package/dist/types/components/store/hello/localization.d.ts +2 -0
  67. package/dist/types/components/utils/api/getExchangeRate.d.ts +9 -3
  68. package/dist/types/components/utils/changeDeepProperty.d.ts +1 -1
  69. package/dist/types/components/utils/changeDeepPropertyAtIndex.d.ts +1 -1
  70. package/dist/types/components/utils/checkout/initCheckout.d.ts +1 -1
  71. package/dist/types/environment.d.ts +6 -1
  72. package/dist/types/scripts/zonos.d.ts +3 -0
  73. package/dist/types/types/generated/graphql.customer.types.d.ts +1 -0
  74. package/dist/types/types/generated/graphql.customer.types.ts +1 -0
  75. package/dist/zonos-elements/assets/RemoveIcon.svg +1 -1
  76. package/dist/zonos-elements/index.esm.js +1 -1
  77. package/dist/zonos-elements/p-0ed3bb9f.system.entry.js +1 -0
  78. package/dist/zonos-elements/{p-42ba069d.system.js → p-164fae93.system.js} +1 -1
  79. package/dist/zonos-elements/{p-9b86e655.system.entry.js → p-224125da.system.entry.js} +1 -1
  80. package/dist/zonos-elements/{p-9dc9cbc8.entry.js → p-28681677.entry.js} +1 -1
  81. package/dist/zonos-elements/p-3a56c240.entry.js +1 -0
  82. package/dist/zonos-elements/p-3f3fbcea.entry.js +1 -0
  83. package/dist/zonos-elements/{p-bb36a9f8.js → p-770c959e.js} +1 -1
  84. package/dist/zonos-elements/p-8378d94e.js +1 -0
  85. package/dist/zonos-elements/{p-37db3842.system.entry.js → p-84b00605.system.entry.js} +1 -1
  86. package/dist/zonos-elements/{p-f23749e4.system.js → p-8aabbb9b.system.js} +1 -1
  87. package/dist/zonos-elements/p-8b415737.system.entry.js +1 -0
  88. package/dist/zonos-elements/{p-98105ede.entry.js → p-9202375f.entry.js} +1 -1
  89. package/dist/zonos-elements/p-a1fa50fb.entry.js +1 -0
  90. package/dist/zonos-elements/{p-a20b97e9.system.entry.js → p-aca66238.system.entry.js} +1 -1
  91. package/dist/zonos-elements/{p-87f324c5.entry.js → p-bc2c42f5.entry.js} +1 -1
  92. package/dist/zonos-elements/{p-c28157ec.system.entry.js → p-c8ad044e.system.entry.js} +1 -1
  93. package/dist/zonos-elements/{p-343071d5.entry.js → p-cc070c1c.entry.js} +1 -1
  94. package/dist/zonos-elements/{p-4524a84f.system.entry.js → p-cc1c785c.system.entry.js} +1 -1
  95. package/dist/zonos-elements/p-cd71e41e.entry.js +1 -0
  96. package/dist/zonos-elements/{p-0f7233fd.system.entry.js → p-cf97cc68.system.entry.js} +1 -1
  97. package/dist/zonos-elements/p-d6b8563b.system.entry.js +1 -0
  98. package/dist/zonos-elements/{p-96a3c767.entry.js → p-e5908de2.entry.js} +1 -1
  99. package/dist/zonos-elements/p-f6add79c.system.js +1 -0
  100. package/dist/zonos-elements/{p-6df1eaee.js → p-f7875c40.js} +1 -1
  101. package/dist/zonos-elements/p-f8491335.system.js +1 -1
  102. package/dist/zonos-elements/{p-b64bbf38.system.js → p-f95ac9ec.system.js} +1 -1
  103. package/dist/zonos-elements/zonos-elements.esm.js +1 -1
  104. package/package.json +3 -3
  105. package/dist/esm-es5/cart-07091d2a.js +0 -1
  106. package/dist/zonos-elements/p-0a788f68.entry.js +0 -1
  107. package/dist/zonos-elements/p-23b0b4a2.system.entry.js +0 -1
  108. package/dist/zonos-elements/p-2c20c082.entry.js +0 -1
  109. package/dist/zonos-elements/p-30fd29fb.js +0 -1
  110. package/dist/zonos-elements/p-37fc9f6b.entry.js +0 -1
  111. package/dist/zonos-elements/p-79f9e330.system.js +0 -1
  112. package/dist/zonos-elements/p-914ce305.system.entry.js +0 -1
  113. package/dist/zonos-elements/p-9adf546f.system.entry.js +0 -1
  114. package/dist/zonos-elements/p-d43749bd.entry.js +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const zonosStore = require('./zonosStore-a430ec5b.js');
4
- const localization = require('./localization-387a8a65.js');
4
+ const localization = require('./localization-d7fe7290.js');
5
5
  const isDarkColor = require('./isDarkColor-f3446afd.js');
6
6
  const getBorderRadius = require('./getBorderRadius-fdd605c6.js');
7
7
 
@@ -92,6 +92,7 @@ const { onChange: onChange$1, reset: reset$1, state: stripeStore, } = zonosStore
92
92
  stripeAddressEventData: null,
93
93
  stripeAddressUsedWhenFetchingLC: null,
94
94
  stripeElements: null,
95
+ stripeElementsOptions: null,
95
96
  stripeLinkElement: null,
96
97
  stripeLinkEventData: null,
97
98
  stripeLinkUsedWhenFetchingLC: null,
@@ -132,13 +133,22 @@ const initStripeElements = async (props) => {
132
133
  overridePrimaryColor: props === null || props === void 0 ? void 0 : props.overridePrimaryColor,
133
134
  overrideTheme: props === null || props === void 0 ? void 0 : props.overrideTheme,
134
135
  });
136
+ // compare with the previous options to see if we need to update
137
+ const isSameOptions = JSON.stringify(stripeOptions) ===
138
+ JSON.stringify(stripeStore.stripeElementsOptions);
135
139
  if (!stripeStore.stripeElements) {
136
140
  // init stripe elements if it doesn't exist
137
141
  stripeStore.stripeElements = (_a = stripeStore.stripe) === null || _a === void 0 ? void 0 : _a.elements(stripeOptions);
142
+ // save stripe elements options for later comparison
143
+ stripeStore.stripeElementsOptions = stripeOptions;
144
+ localization.log('Stripe elements initialized');
145
+ return;
138
146
  }
139
- else {
147
+ if (!isSameOptions) {
140
148
  // update elements with new option if it already exists
141
149
  stripeStore.stripeElements.update(stripeOptions);
150
+ // save stripe elements options for later comparison
151
+ stripeStore.stripeElementsOptions = stripeOptions;
142
152
  }
143
153
  localization.log('Stripe elements initialized');
144
154
  }
@@ -2,10 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- const cart = require('./cart-7b70853c.js');
5
+ const cart = require('./cart-55512e32.js');
6
6
  require('./zonosStore-a430ec5b.js');
7
7
  require('./index-9542d2e7.js');
8
- require('./localization-387a8a65.js');
8
+ require('./localization-d7fe7290.js');
9
9
  require('./isDarkColor-f3446afd.js');
10
10
  require('./getBorderRadius-fdd605c6.js');
11
11
 
@@ -3198,18 +3198,23 @@ const getCountryLandedCost = async (countryCode) => {
3198
3198
 
3199
3199
  const getExchangeRate = async ({ country, isGuaranteed, sourceCurrency, targetCurrency, }) => {
3200
3200
  var _a;
3201
+ // If source currency matches target currency (US -> US) and is not a guaranteed rate, return null
3202
+ if (sourceCurrency === targetCurrency && !isGuaranteed) {
3203
+ return { exchangeRate: null, maxAge: null };
3204
+ }
3201
3205
  const url = `${"https://v1.route.js.zonos.com"}/api/exchange-rates?sourceCurrency=${sourceCurrency}&targetCurrency=${targetCurrency}&isGuaranteed=${isGuaranteed}&country=${country}}`;
3202
3206
  const { errors, json } = await handleFetch(url);
3203
3207
  if (errors.length || !json) {
3204
3208
  logError(`Error fetching country landed cost: ${(_a = errors.find(Boolean)) === null || _a === void 0 ? void 0 : _a.message}`);
3205
- return null;
3209
+ return { exchangeRate: null, maxAge: null };
3206
3210
  }
3207
- const { rate, targetFormat } = json.exchangeRateCreate;
3211
+ const { maxAge, rate, targetFormat } = json.exchangeRateCreate;
3208
3212
  if (rate) {
3209
3213
  sessionStorage.setItem(country + '_rate', JSON.stringify(rate));
3210
- return { rate, targetFormat };
3214
+ const exchangeRate = { rate, targetFormat };
3215
+ return { exchangeRate, maxAge };
3211
3216
  }
3212
- return null;
3217
+ return { exchangeRate: null, maxAge: null };
3213
3218
  };
3214
3219
 
3215
3220
  const getLocaleMessages = async ({ countryCode, localeTo, storeId, }) => {
@@ -3467,23 +3472,45 @@ const { state: localizationStore } = zonosStore.createStore({
3467
3472
  shippingZoneCountries: null,
3468
3473
  targetCurrency: 'USD',
3469
3474
  });
3475
+ const triggerGetExchangeRate = async (isGuaranteed) => {
3476
+ const { exchangeRate, maxAge } = await getExchangeRate({
3477
+ country: localizationStore.selectedCountryCode,
3478
+ isGuaranteed,
3479
+ sourceCurrency: zonosStore.zonosStore.sourceCurrency,
3480
+ targetCurrency: localizationStore.targetCurrency,
3481
+ });
3482
+ if (exchangeRate) {
3483
+ localizationStore.exchangeRate = exchangeRate;
3484
+ currencyDisplay();
3485
+ }
3486
+ return { maxAge };
3487
+ };
3488
+ // This recursive function is for users who step away from their computer and come back needing a new exchange rate
3489
+ const startExchangeRateTimeout = ({ isGuaranteed, maxAge, }) => {
3490
+ if (localizationStore.exchangeRateTimeout) {
3491
+ clearTimeout(localizationStore.exchangeRateTimeout);
3492
+ }
3493
+ // maxAge comes in seconds, convert to milliseconds
3494
+ const defaultMaxAge = 5 * 60;
3495
+ const maxAgeToUse = maxAge || defaultMaxAge;
3496
+ // Recursively set timeouts to get new exchange rates when the current one expires
3497
+ localizationStore.exchangeRateTimeout = setTimeout(async () => {
3498
+ const { maxAge: newMaxAge } = await triggerGetExchangeRate(isGuaranteed);
3499
+ startExchangeRateTimeout({ isGuaranteed, maxAge: newMaxAge });
3500
+ }, maxAgeToUse * 1000);
3501
+ };
3470
3502
  const getNewLocalization = async () => {
3471
3503
  log('get new localization store');
3472
3504
  const { isShippableCountry, selectedCountryCode } = localizationStore;
3473
- const isGuaranteed = zonosStore.zonosStore.checkoutSettings.visibilityStatus === 'ENABLED';
3474
3505
  if (zonosStore.zonosStore.helloSettings.currencyBehavior === 'DISABLED' ||
3475
3506
  !isShippableCountry ||
3476
3507
  !selectedCountryCode) {
3477
3508
  return;
3478
3509
  }
3479
- localizationStore.exchangeRate = await getExchangeRate({
3480
- country: localizationStore.selectedCountryCode,
3481
- isGuaranteed,
3482
- sourceCurrency: zonosStore.zonosStore.sourceCurrency,
3483
- targetCurrency: localizationStore.targetCurrency,
3484
- });
3485
- if (localizationStore.exchangeRate) {
3486
- currencyDisplay();
3510
+ if (zonosStore.zonosStore.sourceCurrency !== localizationStore.targetCurrency) {
3511
+ const isGuaranteed = zonosStore.zonosStore.checkoutSettings.visibilityStatus === 'ENABLED';
3512
+ const { maxAge } = await triggerGetExchangeRate(isGuaranteed);
3513
+ startExchangeRateTimeout({ isGuaranteed, maxAge });
3487
3514
  }
3488
3515
  localizationStore.countryLandedCost = await getCountryLandedCost(localizationStore.selectedCountryCode);
3489
3516
  };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const zonosStore = require('./zonosStore-a430ec5b.js');
4
- const localization = require('./localization-387a8a65.js');
4
+ const localization = require('./localization-d7fe7290.js');
5
5
 
6
6
  const checkoutBreakpoint = 890;
7
7
  const isCheckoutMobile = (isMobile) => {
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-9542d2e7.js');
6
- const cart = require('./cart-7b70853c.js');
7
- const localization = require('./localization-387a8a65.js');
6
+ const cart = require('./cart-55512e32.js');
7
+ const localization = require('./localization-d7fe7290.js');
8
8
  require('./zonosStore-a430ec5b.js');
9
9
  require('./isDarkColor-f3446afd.js');
10
10
  require('./getBorderRadius-fdd605c6.js');
@@ -39,6 +39,11 @@ const ZonosAddress = class {
39
39
  ? Object.values(shippableCountries).map(country => country.code)
40
40
  : [],
41
41
  contacts: this.defaultAddress ? [this.defaultAddress] : undefined,
42
+ defaultValues: {
43
+ address: {
44
+ country: localization.localizationStore.selectedCountryCode || 'AL',
45
+ },
46
+ },
42
47
  display: {
43
48
  name: 'split',
44
49
  },
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-9542d2e7.js');
6
- const cart = require('./cart-7b70853c.js');
7
- const localization = require('./localization-387a8a65.js');
6
+ const cart = require('./cart-55512e32.js');
7
+ const localization = require('./localization-d7fe7290.js');
8
8
  const getBorderRadius = require('./getBorderRadius-fdd605c6.js');
9
- const submitGtag = require('./submitGtag-bf6e7c5e.js');
9
+ const submitGtag = require('./submitGtag-d65003f9.js');
10
10
  const classes = require('./classes-b7918f56.js');
11
11
  const zonosStore = require('./zonosStore-a430ec5b.js');
12
12
  require('./isDarkColor-f3446afd.js');
@@ -468,9 +468,8 @@ const ZonosShipping = class {
468
468
  }
469
469
  }
470
470
  render() {
471
- var _a, _b;
472
- const shipToCountry = (_a = cart.stripeStore.stripeAddressEventData) === null || _a === void 0 ? void 0 : _a.value.address.country;
473
- const serviceLevels = (_b = cart.cartStore.shippingData) === null || _b === void 0 ? void 0 : _b.flatMap((item) => {
471
+ var _a;
472
+ const serviceLevels = (_a = cart.cartStore.shippingData) === null || _a === void 0 ? void 0 : _a.flatMap((item) => {
474
473
  var _a, _b;
475
474
  const { expectedDate, maxTransit, minTransit } = cart.cartStoreGetShippingTransitInfo(item);
476
475
  const sublabel = expectedDate
@@ -491,7 +490,7 @@ const ZonosShipping = class {
491
490
  value: item.id,
492
491
  };
493
492
  });
494
- return (index.h(index.Host, { class: "zonos--shipping zonos--elements" }, index.h("div", { class: "zonos--group" }, index.h("zonos-text", { class: "zonos--title", type: "semiBoldSubheader" }, localization.translate('Shipping information')), index.h("zonos-text", { class: "zonos--shipping-method-title", type: "semiBoldLabel" }, localization.translate('Shipping method')), !(serviceLevels === null || serviceLevels === void 0 ? void 0 : serviceLevels.length) ? (index.h("zonos-banner", { bannerTitle: "No shipping methods found - try editing your address or contacting support if the error persists", intent: "error" })) : (index.h("zonos-shipping-rich-radio", { items: serviceLevels || [], onRadioSelected: e => this.handleRadioSelected(e) })), cart.cartStore.isSelectedShippingAboveDeminimis && (index.h("zonos-banner", { intent: "warning" }, localization.translate('Above de minimis threshold for'), " ", shipToCountry, ".", ' ', localization.translate('Duties and taxes will be applied to items and shipping.')))), index.h("zonos-button", { backgroundColor: this.submitBtnColor, "is-disabled": this.disabled, loading: this.continueLoading, onClick: () => this.continueClickHandler(), size: "lg",
493
+ return (index.h(index.Host, { class: "zonos--shipping zonos--elements" }, index.h("div", { class: "zonos--group" }, index.h("zonos-text", { class: "zonos--title", type: "semiBoldSubheader" }, localization.translate('Shipping information')), index.h("zonos-text", { class: "zonos--shipping-method-title", type: "semiBoldLabel" }, localization.translate('Shipping method')), !(serviceLevels === null || serviceLevels === void 0 ? void 0 : serviceLevels.length) ? (index.h("zonos-banner", { bannerTitle: "No shipping methods found - try editing your address or contacting support if the error persists", intent: "error" })) : (index.h("zonos-shipping-rich-radio", { items: serviceLevels || [], onRadioSelected: e => this.handleRadioSelected(e) }))), index.h("zonos-button", { backgroundColor: this.submitBtnColor, "is-disabled": this.disabled, loading: this.continueLoading, onClick: () => this.continueClickHandler(), size: "lg",
495
494
  // use primary type when on mobile mode
496
495
  variant: this.submitBtnType }, localization.translate('Go to payment'))));
497
496
  }
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-9542d2e7.js');
6
- const cart = require('./cart-7b70853c.js');
7
- const localization = require('./localization-387a8a65.js');
6
+ const cart = require('./cart-55512e32.js');
7
+ const localization = require('./localization-d7fe7290.js');
8
8
  const zonosStore = require('./zonosStore-a430ec5b.js');
9
- const submitGtag = require('./submitGtag-bf6e7c5e.js');
9
+ const submitGtag = require('./submitGtag-d65003f9.js');
10
10
  const classes = require('./classes-b7918f56.js');
11
11
  const getBorderRadius = require('./getBorderRadius-fdd605c6.js');
12
12
  const isDarkColor = require('./isDarkColor-f3446afd.js');
@@ -20,7 +20,7 @@ const MessageIcon = `<svg width="18" height="18" viewBox="0 0 18 18" fill="none"
20
20
 
21
21
  const RemoveIcon = `<svg color="var(--amino-gray-800)" fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="https://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M22 12c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2s10 4.477 10 10Z" data-is-secondary-color="true" fill="var(--amino-gray-200)" fill-rule="evenodd"></path><path clip-rule="evenodd" d="M8.293 8.293a1 1 0 0 1 1.414 0L12 10.586l2.293-2.293a1 1 0 1 1 1.414 1.414L13.414 12l2.293 2.293a1 1 0 0 1-1.414 1.414L12 13.414l-2.293 2.293a1 1 0 0 1-1.414-1.414L10.586 12 8.293 9.707a1 1 0 0 1 0-1.414Z" fill="currentColor" fill-rule="evenodd"></path></svg>`;
22
22
 
23
- const zonosCheckoutCss = ".sc-zonos-checkout-h{font-family:Inter;display:block}.sc-zonos-checkout-h img.sc-zonos-checkout{max-width:100%}.sc-zonos-checkout-h dl.sc-zonos-checkout,.sc-zonos-checkout-h dd.sc-zonos-checkout,.sc-zonos-checkout-h h1.sc-zonos-checkout,.sc-zonos-checkout-h h2.sc-zonos-checkout,.sc-zonos-checkout-h h3.sc-zonos-checkout,.sc-zonos-checkout-h h4.sc-zonos-checkout,.sc-zonos-checkout-h h5.sc-zonos-checkout,.sc-zonos-checkout-h h6.sc-zonos-checkout,.sc-zonos-checkout-h hr.sc-zonos-checkout,.sc-zonos-checkout-h figure.sc-zonos-checkout,.sc-zonos-checkout-h p.sc-zonos-checkout,.sc-zonos-checkout-h pre.sc-zonos-checkout{margin:0}.sc-zonos-checkout-h{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.sc-zonos-checkout-h *.sc-zonos-checkout::-webkit-scrollbar{width:10px}.sc-zonos-checkout-h *.sc-zonos-checkout::-webkit-scrollbar-track{background:var(--amino-gray-50)}.sc-zonos-checkout-h *.sc-zonos-checkout::-webkit-scrollbar-thumb{border-radius:10px;background:#cccccc;border:3px solid transparent;background-clip:content-box}.sc-zonos-checkout-h *.sc-zonos-checkout::-webkit-scrollbar-thumb:hover{background:#d6d6d6}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout{display:-ms-flexbox;display:flex;height:100%;overflow:hidden;border-radius:var(--border-radius, var(--amino-radius-10))}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--left.sc-zonos-checkout,.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout{-ms-flex:1;flex:1;padding:var(--amino-space-48) var(--amino-space-56)}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--left.sc-zonos-checkout{background-color:var(--primary-color, var(--amino-gray-0));border-right:1px solid var(--amino-gray-200)}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout{background-color:var(--amino-gray-0);padding-bottom:var(--amino-space-80)}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout{width:100%;max-height:100%;height:100%;overflow:auto;-ms-flex-direction:column;flex-direction:column;background-color:var(--amino-gray-0);-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:var(--amino-space-24);padding-bottom:50px}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout .zonos--header.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;width:100%}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout .zonos--header.sc-zonos-checkout img.sc-zonos-checkout{width:150px;min-width:150px}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout .zonos--logo.sc-zonos-checkout{margin-bottom:0}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout zonos-checkout-finish.sc-zonos-checkout{-ms-flex:1;flex:1}.sc-zonos-checkout-h .zonos--left.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.sc-zonos-checkout-h .zonos--left.sc-zonos-checkout .zonos--back-button.sc-zonos-checkout{margin-bottom:var(--amino-space-24)}.sc-zonos-checkout-h .zonos--left.sc-zonos-checkout .zonos--wrapper.sc-zonos-checkout{padding:0 var(--amino-space-8) var(--amino-space-8)}.sc-zonos-checkout-h .zonos--left.sc-zonos-checkout .zonos--payment-error-banner.sc-zonos-checkout{margin-top:var(--amino-space-24)}.sc-zonos-checkout-h .zonos--right.sc-zonos-checkout{position:relative}.sc-zonos-checkout-h .zonos--right.sc-zonos-checkout .zonos--close-button.sc-zonos-checkout{position:absolute;right:var(--amino-space-32);top:var(--amino-space-32)}.sc-zonos-checkout-h .zonos--footer.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-align:center;align-items:center;position:absolute;bottom:var(--amino-space-32);right:var(--amino-space-56);gap:var(--amino-space-8)}.sc-zonos-checkout-h .zonos--wrapper.sc-zonos-checkout{overflow:auto;max-height:100%;position:relative}.sc-zonos-checkout-h .flex--wrapper.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:100%}.sc-zonos-checkout-h .zonos--logo.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.sc-zonos-checkout-h .zonos--checkout-default-message.sc-zonos-checkout{margin-left:var(--amino-space-76);margin-bottom:var(--amino-space-8)}.preview.sc-zonos-checkout-h{min-width:500px;margin:auto}.preview.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout{border:var(--amino-border)}.preview.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout{padding:var(--amino-space-32)}.mobile.sc-zonos-checkout-h{min-width:auto}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;overflow:auto;border-radius:0;max-height:100%;height:100%;border:0}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--left.sc-zonos-checkout,.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout{padding:var(--amino-space-12)}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--left.sc-zonos-checkout{-ms-flex-order:2;order:2}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout{-ms-flex-order:1;order:1;padding-top:var(--amino-space-16)}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout .zonos--wrapper.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--amino-space-16);margin-top:var(--amino-space-24);border:var(--amino-border);border-radius:var(--border-radius, var(--amino-radius-10));background-color:var(--amino-gray-50);padding:var(--amino-space-12);margin-top:var(--amino-space-32)}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--wrapper.sc-zonos-checkout{max-height:100%}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--footer.sc-zonos-checkout{-ms-flex-order:3;order:3}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout{width:auto}.mobile.sc-zonos-checkout-h .zonos--cart-subtotal.sc-zonos-checkout{margin:0}.mobile.sc-zonos-checkout-h .zonos--footer.sc-zonos-checkout{bottom:0;left:0;padding:var(--amino-space-12);position:relative;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:var(--amino-gray-0)}";
23
+ const zonosCheckoutCss = ".sc-zonos-checkout-h{font-family:Inter;display:block}.sc-zonos-checkout-h img.sc-zonos-checkout{max-width:100%}.sc-zonos-checkout-h dl.sc-zonos-checkout,.sc-zonos-checkout-h dd.sc-zonos-checkout,.sc-zonos-checkout-h h1.sc-zonos-checkout,.sc-zonos-checkout-h h2.sc-zonos-checkout,.sc-zonos-checkout-h h3.sc-zonos-checkout,.sc-zonos-checkout-h h4.sc-zonos-checkout,.sc-zonos-checkout-h h5.sc-zonos-checkout,.sc-zonos-checkout-h h6.sc-zonos-checkout,.sc-zonos-checkout-h hr.sc-zonos-checkout,.sc-zonos-checkout-h figure.sc-zonos-checkout,.sc-zonos-checkout-h p.sc-zonos-checkout,.sc-zonos-checkout-h pre.sc-zonos-checkout{margin:0}.sc-zonos-checkout-h{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.sc-zonos-checkout-h *.sc-zonos-checkout::-webkit-scrollbar{width:10px}.sc-zonos-checkout-h *.sc-zonos-checkout::-webkit-scrollbar-track{background:var(--amino-gray-50)}.sc-zonos-checkout-h *.sc-zonos-checkout::-webkit-scrollbar-thumb{border-radius:10px;background:#cccccc;border:3px solid transparent;background-clip:content-box}.sc-zonos-checkout-h *.sc-zonos-checkout::-webkit-scrollbar-thumb:hover{background:#d6d6d6}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout{display:-ms-flexbox;display:flex;height:100%;overflow:hidden;border-radius:var(--border-radius, var(--amino-radius-10))}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--left.sc-zonos-checkout,.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout{-ms-flex:1;flex:1;padding:var(--amino-space-48) var(--amino-space-56)}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--left.sc-zonos-checkout{background-color:var(--primary-color, var(--amino-gray-0));border-right:1px solid var(--amino-gray-200)}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout{background-color:var(--amino-gray-0);padding-bottom:var(--amino-space-80)}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout{width:100%;max-height:100%;height:100%;overflow:auto;-ms-flex-direction:column;flex-direction:column;background-color:var(--amino-gray-0);-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:var(--amino-space-24);padding-bottom:50px}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout .zonos--header.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;width:100%}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout .zonos--header.sc-zonos-checkout img.sc-zonos-checkout{width:150px;min-width:150px}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout .zonos--logo.sc-zonos-checkout{margin-bottom:0}.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout zonos-checkout-finish.sc-zonos-checkout{-ms-flex:1;flex:1}.sc-zonos-checkout-h .zonos--left.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.sc-zonos-checkout-h .zonos--left.sc-zonos-checkout .zonos--back-button.sc-zonos-checkout{margin-bottom:var(--amino-space-24)}.sc-zonos-checkout-h .zonos--left.sc-zonos-checkout .zonos--wrapper.sc-zonos-checkout{padding:0 var(--amino-space-8) var(--amino-space-8)}.sc-zonos-checkout-h .zonos--left.sc-zonos-checkout .zonos--payment-error-banner.sc-zonos-checkout{margin-top:var(--amino-space-24)}.sc-zonos-checkout-h .zonos--right.sc-zonos-checkout{position:relative}.sc-zonos-checkout-h .zonos--right.sc-zonos-checkout .zonos--close-button.sc-zonos-checkout{position:absolute;right:var(--amino-space-24);top:var(--amino-space-24)}.sc-zonos-checkout-h .zonos--footer.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-align:center;align-items:center;position:absolute;bottom:var(--amino-space-32);right:var(--amino-space-56);gap:var(--amino-space-8)}.sc-zonos-checkout-h .zonos--wrapper.sc-zonos-checkout{overflow:auto;max-height:100%;position:relative}.sc-zonos-checkout-h .flex--wrapper.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:100%}.sc-zonos-checkout-h .zonos--logo.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.sc-zonos-checkout-h .zonos--checkout-default-message.sc-zonos-checkout{margin-left:var(--amino-space-76);margin-bottom:var(--amino-space-8)}.preview.sc-zonos-checkout-h{min-width:500px;margin:auto}.preview.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout{border:var(--amino-border)}.preview.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout{padding:var(--amino-space-32)}.mobile.sc-zonos-checkout-h{min-width:auto}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;overflow:auto;border-radius:0;max-height:100%;height:100%;border:0}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--left.sc-zonos-checkout,.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout{padding:var(--amino-space-12)}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--left.sc-zonos-checkout{-ms-flex-order:2;order:2}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout{-ms-flex-order:1;order:1;padding-top:var(--amino-space-16)}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--right.sc-zonos-checkout .zonos--wrapper.sc-zonos-checkout{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:var(--amino-space-16);margin-top:var(--amino-space-24);border:var(--amino-border);border-radius:var(--border-radius, var(--amino-radius-10));background-color:var(--amino-gray-50);padding:var(--amino-space-12);margin-top:var(--amino-space-32)}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--wrapper.sc-zonos-checkout{max-height:100%}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--footer.sc-zonos-checkout{-ms-flex-order:3;order:3}.mobile.sc-zonos-checkout-h .zonos--content.sc-zonos-checkout .zonos--done.sc-zonos-checkout{width:auto}.mobile.sc-zonos-checkout-h .zonos--cart-subtotal.sc-zonos-checkout{margin:0}.mobile.sc-zonos-checkout-h .zonos--footer.sc-zonos-checkout{bottom:0;left:0;padding:var(--amino-space-12);position:relative;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:var(--amino-gray-0)}";
24
24
 
25
25
  const ZonosCheckout = class {
26
26
  constructor(hostRef) {
@@ -135,6 +135,8 @@ const ZonosCheckout = class {
135
135
  e.preventDefault();
136
136
  e.stopPropagation();
137
137
  localization.log('zonos checkout button clicked');
138
+ // start loading
139
+ cart.stripeStore.isFetchingSession = true;
138
140
  this.open = true;
139
141
  try {
140
142
  // buildCartDetail need to be catch since it may throw error
@@ -145,6 +147,8 @@ const ZonosCheckout = class {
145
147
  submitGtag.submitGtag('zonos-checkout-start');
146
148
  }
147
149
  catch (err) {
150
+ // stop loading
151
+ cart.stripeStore.isFetchingSession = false;
148
152
  cart.cartStoreUpdateToErrorState({
149
153
  messages: [
150
154
  localization.translate("There's been an error creating your checkout session. Please reload and try again or contact support if the error persists"),
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-9542d2e7.js');
6
- const cart = require('./cart-7b70853c.js');
7
- const localization = require('./localization-387a8a65.js');
6
+ const cart = require('./cart-55512e32.js');
7
+ const localization = require('./localization-d7fe7290.js');
8
8
  const zonosStore = require('./zonosStore-a430ec5b.js');
9
9
  require('./isDarkColor-f3446afd.js');
10
10
  require('./getBorderRadius-fdd605c6.js');
@@ -27,7 +27,7 @@ const injectCheckoutElement = () => {
27
27
  document.body.appendChild(newCheckoutElement);
28
28
  }
29
29
  };
30
- const initCheckout = async (config) => {
30
+ const initCheckout = (config) => {
31
31
  if (!config.placeOrderButtonSelector) {
32
32
  // do nothing if checkout button anchor is not set
33
33
  return;
@@ -66,6 +66,44 @@ const ZonosController = class {
66
66
  constructor(hostRef) {
67
67
  index.registerInstance(this, hostRef);
68
68
  this.stripeInitEvent = index.createEvent(this, "stripeInitEvent", 7);
69
+ this.disablePlaceOrderButtons = ({ disable }) => {
70
+ const placeOrderButtonSelector = zonosStore.zonosStore.checkoutSettings.placeOrderButtonSelector;
71
+ if (!placeOrderButtonSelector) {
72
+ return;
73
+ }
74
+ const disableEvent = (e) => {
75
+ const target = e.target;
76
+ // prevent default and propagation when the item has disabled attribute
77
+ if (target.getAttribute('disabled')) {
78
+ e.preventDefault();
79
+ e.stopPropagation();
80
+ }
81
+ };
82
+ const placeOrderButton = document.querySelectorAll(placeOrderButtonSelector);
83
+ placeOrderButton.forEach(button => {
84
+ if (disable) {
85
+ button.setAttribute('disabled', 'true');
86
+ // prevent the selector to perform default action when it's disabled
87
+ button.addEventListener('click', disableEvent);
88
+ }
89
+ else {
90
+ button.removeAttribute('disabled');
91
+ // clean up the event listener
92
+ button.removeEventListener('click', disableEvent);
93
+ }
94
+ });
95
+ // only auto enable if autoEnable is true and the state is enable
96
+ if (disable) {
97
+ setTimeout(() => {
98
+ // release it if zonos is not initialized after 5 seconds (this is to prevent the place order button from being disabled forever due to api)
99
+ placeOrderButton.forEach(button => {
100
+ button.removeAttribute('disabled');
101
+ // clean up the event listener if exists
102
+ button.removeEventListener('click', disableEvent);
103
+ });
104
+ }, 5000);
105
+ }
106
+ };
69
107
  this.config = undefined;
70
108
  this.zonosApiKey = undefined;
71
109
  }
@@ -81,6 +119,10 @@ const ZonosController = class {
81
119
  cart.stripeStore.stripe = stripe;
82
120
  void initCheckout(zonosStore.zonosStore.checkoutSettings);
83
121
  localization.log('init checkout element');
122
+ // enable place order button after checkout is loaded
123
+ this.disablePlaceOrderButtons({
124
+ disable: false,
125
+ });
84
126
  }
85
127
  /**
86
128
  * Init zonos notification
@@ -103,6 +145,10 @@ const ZonosController = class {
103
145
  localization.log('Failed to load zonos settings. This domain may not have access', 'warn');
104
146
  return;
105
147
  }
148
+ // disable place order button until checkout is loaded
149
+ this.disablePlaceOrderButtons({
150
+ disable: true,
151
+ });
106
152
  // init zonos notification
107
153
  this.initZonosNotification();
108
154
  // load default setting if fail to load user setting
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-9542d2e7.js');
6
- const localization = require('./localization-387a8a65.js');
6
+ const localization = require('./localization-d7fe7290.js');
7
7
  const classes = require('./classes-b7918f56.js');
8
8
  const isDarkColor = require('./isDarkColor-f3446afd.js');
9
9
  require('./zonosStore-a430ec5b.js');
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-9542d2e7.js');
6
- const localization = require('./localization-387a8a65.js');
6
+ const localization = require('./localization-d7fe7290.js');
7
7
  const zonosStore = require('./zonosStore-a430ec5b.js');
8
8
  const classes = require('./classes-b7918f56.js');
9
9
  const getHasMoreSpaceOnRight = require('./getHasMoreSpaceOnRight-2855491b.js');
@@ -82,18 +82,26 @@ const ZonosHelloDialog = class {
82
82
  const { countryLandedCost, selectedCountryCode } = localization.localizationStore;
83
83
  // Our Robby API spells deminimis wrong here
84
84
  const dutyDeminimis = (countryLandedCost === null || countryLandedCost === void 0 ? void 0 : countryLandedCost.dutyDeminimus)
85
- ? localization.currencyConvertAndFormat(countryLandedCost.dutyDeminimus)
85
+ ? localization.currencyFormat(countryLandedCost.dutyDeminimus)
86
86
  : null;
87
+ // If Canada, use 40 CAD (courier duty de minimis)
88
+ const dutyDeminimisToUse = localization.localizationStore.selectedCountryCode === 'CA'
89
+ ? localization.currencyFormat(40)
90
+ : dutyDeminimis;
87
91
  // If deminimis is undefined or null, assume it's $0
88
- const dutyDeMinimisMessage = dutyDeminimis
89
- ? `${localization.translate('Spend')} ${dutyDeminimis} ${localization.translate('duty free')}`
92
+ const dutyDeMinimisMessage = dutyDeminimisToUse
93
+ ? `${localization.translate('Spend')} ${dutyDeminimisToUse} ${localization.translate('duty free')}`
90
94
  : localization.translate('Duties will apply to all orders');
91
95
  // Our Robby API spells deminimis wrong here
92
96
  const taxDeminimis = (countryLandedCost === null || countryLandedCost === void 0 ? void 0 : countryLandedCost.vatTaxDeminimus)
93
- ? localization.currencyConvertAndFormat(countryLandedCost.vatTaxDeminimus)
97
+ ? localization.currencyFormat(countryLandedCost.vatTaxDeminimus)
94
98
  : null;
95
- const taxDeMinimisMessage = taxDeminimis
96
- ? `${localization.translate('Spend')} ${taxDeminimis} ${localization.translate('tax free')}`
99
+ // If Canada, use 150 CAD (courier tax de minimis)
100
+ const taxDeminimisToUse = localization.localizationStore.selectedCountryCode === 'CA'
101
+ ? localization.currencyFormat(150)
102
+ : taxDeminimis;
103
+ const taxDeMinimisMessage = taxDeminimisToUse
104
+ ? `${localization.translate('Spend')} ${taxDeminimisToUse} ${localization.translate('tax free')}`
97
105
  : localization.translate('Taxes will apply to all orders');
98
106
  const animateLeft = this.animateFromLeftOverride ||
99
107
  (this.dialogRef && getHasMoreSpaceOnRight.getHasMoreSpaceOnRight(this.dialogRef));
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-9542d2e7.js');
6
6
  const zonosStore = require('./zonosStore-a430ec5b.js');
7
- const localization = require('./localization-387a8a65.js');
7
+ const localization = require('./localization-d7fe7290.js');
8
8
  const classes = require('./classes-b7918f56.js');
9
9
  const getHasMoreSpaceOnRight = require('./getHasMoreSpaceOnRight-2855491b.js');
10
10
 
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-9542d2e7.js');
6
- const cart = require('./cart-7b70853c.js');
6
+ const cart = require('./cart-55512e32.js');
7
7
  require('./zonosStore-a430ec5b.js');
8
- require('./localization-387a8a65.js');
8
+ require('./localization-d7fe7290.js');
9
9
  require('./isDarkColor-f3446afd.js');
10
10
  require('./getBorderRadius-fdd605c6.js');
11
11
 
@@ -8,7 +8,7 @@ const classes = require('./classes-b7918f56.js');
8
8
  const getBorderRadius = require('./getBorderRadius-fdd605c6.js');
9
9
  const isColorVariable = require('./isColorVariable-c1ed7303.js');
10
10
 
11
- const zonosShippingRichRadioCss = ":host{font-family:Inter;display:block}:host img{max-width:100%}:host dl,:host dd,:host h1,:host h2,:host h3,:host h4,:host h5,:host h6,:host hr,:host figure,:host p,:host pre{margin:0}:host{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}:host{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:host input{margin:0;accent-color:var(--selected-border-color, var(--amino-blue-600))}:host .zonos--shipping-rich-radio-item{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;padding:var(--amino-space-16);-ms-flex-align:center;align-items:center;gap:var(--amino-space-16);cursor:pointer;border:1px solid var(--amino-gray-200)}:host .zonos--shipping-rich-radio-item:first-child{border-top-left-radius:var(--border-radius, var(--amino-radius-10));border-top-right-radius:var(--border-radius, var(--amino-radius-10))}:host .zonos--shipping-rich-radio-item:last-child{border-bottom-right-radius:var(--border-radius, var(--amino-radius-10))}:host .zonos--shipping-rich-radio-item:not(:last-child){border-bottom:none}:host .zonos--shipping-rich-radio-item.selected{outline:1px solid var(--selected-border-color, var(--amino-blue-600));outline-offset:-1px}:host .zonos--shipping-info{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex:1;flex:1}:host .zonos--shipping-detail{-ms-flex:1;flex:1}:host .zonos--sub-detail{display:-ms-inline-flexbox;display:inline-flex;gap:8px;-ms-flex-wrap:wrap;flex-wrap:wrap}";
11
+ const zonosShippingRichRadioCss = ":host{font-family:Inter;display:block}:host img{max-width:100%}:host dl,:host dd,:host h1,:host h2,:host h3,:host h4,:host h5,:host h6,:host hr,:host figure,:host p,:host pre{margin:0}:host{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}:host{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:host input{margin:0;accent-color:var(--selected-border-color, var(--amino-blue-600))}:host .zonos--shipping-rich-radio-item{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;padding:var(--amino-space-16);-ms-flex-align:center;align-items:center;gap:var(--amino-space-16);cursor:pointer;border:1px solid var(--amino-gray-200)}:host .zonos--shipping-rich-radio-item:first-child{border-top-left-radius:var(--border-radius, var(--amino-radius-10));border-top-right-radius:var(--border-radius, var(--amino-radius-10))}:host .zonos--shipping-rich-radio-item:last-child{border-bottom-right-radius:var(--border-radius, var(--amino-radius-10));border-bottom-left-radius:var(--border-radius, var(--amino-radius-10))}:host .zonos--shipping-rich-radio-item:not(:last-child){border-bottom:none}:host .zonos--shipping-rich-radio-item.selected{outline:1px solid var(--selected-border-color, var(--amino-blue-600));outline-offset:-1px}:host .zonos--shipping-info{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex:1;flex:1}:host .zonos--shipping-detail{-ms-flex:1;flex:1}:host .zonos--sub-detail{display:-ms-inline-flexbox;display:inline-flex;gap:8px;-ms-flex-wrap:wrap;flex-wrap:wrap}";
12
12
 
13
13
  const ZonosShippingRichRadio = class {
14
14
  constructor(hostRef) {
@@ -107,8 +107,8 @@
107
107
  }
108
108
  :host .zonos--right .zonos--close-button {
109
109
  position: absolute;
110
- right: var(--amino-space-32);
111
- top: var(--amino-space-32);
110
+ right: var(--amino-space-24);
111
+ top: var(--amino-space-24);
112
112
  }
113
113
  :host .zonos--footer {
114
114
  display: flex;
@@ -130,6 +130,8 @@ export class ZonosCheckout {
130
130
  e.preventDefault();
131
131
  e.stopPropagation();
132
132
  log('zonos checkout button clicked');
133
+ // start loading
134
+ stripeStore.isFetchingSession = true;
133
135
  this.open = true;
134
136
  try {
135
137
  // buildCartDetail need to be catch since it may throw error
@@ -140,6 +142,8 @@ export class ZonosCheckout {
140
142
  submitGtag('zonos-checkout-start');
141
143
  }
142
144
  catch (err) {
145
+ // stop loading
146
+ stripeStore.isFetchingSession = false;
143
147
  cartStoreUpdateToErrorState({
144
148
  messages: [
145
149
  translate("There's been an error creating your checkout session. Please reload and try again or contact support if the error persists"),
@@ -1,6 +1,5 @@
1
1
  import { h, Host, } from "@stencil/core";
2
2
  import { cartStore, cartStoreGetShippingTransitInfo, cartStoreUpdateSelectedShippingOption, } from "../../../store/checkout/cart";
3
- import { stripeStore } from "../../../store/checkout/stripe";
4
3
  import { translate } from "../../../store/translationStore";
5
4
  import { formatCurrency } from "../../../utils/formatCurrency";
6
5
  import { submitGtag } from "../../../utils/submitGtag";
@@ -42,9 +41,8 @@ export class ZonosShipping {
42
41
  }
43
42
  }
44
43
  render() {
45
- var _a, _b;
46
- const shipToCountry = (_a = stripeStore.stripeAddressEventData) === null || _a === void 0 ? void 0 : _a.value.address.country;
47
- const serviceLevels = (_b = cartStore.shippingData) === null || _b === void 0 ? void 0 : _b.flatMap((item) => {
44
+ var _a;
45
+ const serviceLevels = (_a = cartStore.shippingData) === null || _a === void 0 ? void 0 : _a.flatMap((item) => {
48
46
  var _a, _b;
49
47
  const { expectedDate, maxTransit, minTransit } = cartStoreGetShippingTransitInfo(item);
50
48
  const sublabel = expectedDate
@@ -65,7 +63,7 @@ export class ZonosShipping {
65
63
  value: item.id,
66
64
  };
67
65
  });
68
- return (h(Host, { class: "zonos--shipping zonos--elements" }, h("div", { class: "zonos--group" }, h("zonos-text", { class: "zonos--title", type: "semiBoldSubheader" }, translate('Shipping information')), h("zonos-text", { class: "zonos--shipping-method-title", type: "semiBoldLabel" }, translate('Shipping method')), !(serviceLevels === null || serviceLevels === void 0 ? void 0 : serviceLevels.length) ? (h("zonos-banner", { bannerTitle: "No shipping methods found - try editing your address or contacting support if the error persists", intent: "error" })) : (h("zonos-shipping-rich-radio", { items: serviceLevels || [], onRadioSelected: e => this.handleRadioSelected(e) })), cartStore.isSelectedShippingAboveDeminimis && (h("zonos-banner", { intent: "warning" }, translate('Above de minimis threshold for'), " ", shipToCountry, ".", ' ', translate('Duties and taxes will be applied to items and shipping.')))), h("zonos-button", { backgroundColor: this.submitBtnColor, "is-disabled": this.disabled, loading: this.continueLoading, onClick: () => this.continueClickHandler(), size: "lg",
66
+ return (h(Host, { class: "zonos--shipping zonos--elements" }, h("div", { class: "zonos--group" }, h("zonos-text", { class: "zonos--title", type: "semiBoldSubheader" }, translate('Shipping information')), h("zonos-text", { class: "zonos--shipping-method-title", type: "semiBoldLabel" }, translate('Shipping method')), !(serviceLevels === null || serviceLevels === void 0 ? void 0 : serviceLevels.length) ? (h("zonos-banner", { bannerTitle: "No shipping methods found - try editing your address or contacting support if the error persists", intent: "error" })) : (h("zonos-shipping-rich-radio", { items: serviceLevels || [], onRadioSelected: e => this.handleRadioSelected(e) }))), h("zonos-button", { backgroundColor: this.submitBtnColor, "is-disabled": this.disabled, loading: this.continueLoading, onClick: () => this.continueClickHandler(), size: "lg",
69
67
  // use primary type when on mobile mode
70
68
  variant: this.submitBtnType }, translate('Go to payment'))));
71
69
  }
@@ -50,6 +50,7 @@
50
50
  }
51
51
  :host .zonos--shipping-rich-radio-item:last-child {
52
52
  border-bottom-right-radius: var(--border-radius, var(--amino-radius-10));
53
+ border-bottom-left-radius: var(--border-radius, var(--amino-radius-10));
53
54
  }
54
55
  :host .zonos--shipping-rich-radio-item:not(:last-child) {
55
56
  border-bottom: none;
@@ -3,7 +3,7 @@ import { localizationStore } from "../../store/hello/localization";
3
3
  import { translate } from "../../store/translationStore";
4
4
  import { zonosStore } from "../../store/zonosStore";
5
5
  import { classes } from "../../utils/classes";
6
- import { currencyConvertAndFormat } from "../../utils/hello/currencyConversion/currencyConvertAndFormat";
6
+ import { currencyFormat } from "../../utils/hello/currencyConversion/currencyFormat";
7
7
  import { getHasMoreSpaceAbove } from "../../utils/hello/getHasMoreSpaceAbove";
8
8
  import { getHasMoreSpaceOnRight } from "../../utils/hello/getHasMoreSpaceOnRight";
9
9
  // eslint-disable-next-line no-relative-import-paths/no-relative-import-paths
@@ -60,18 +60,26 @@ export class ZonosHelloDialog {
60
60
  const { countryLandedCost, selectedCountryCode } = localizationStore;
61
61
  // Our Robby API spells deminimis wrong here
62
62
  const dutyDeminimis = (countryLandedCost === null || countryLandedCost === void 0 ? void 0 : countryLandedCost.dutyDeminimus)
63
- ? currencyConvertAndFormat(countryLandedCost.dutyDeminimus)
63
+ ? currencyFormat(countryLandedCost.dutyDeminimus)
64
64
  : null;
65
+ // If Canada, use 40 CAD (courier duty de minimis)
66
+ const dutyDeminimisToUse = localizationStore.selectedCountryCode === 'CA'
67
+ ? currencyFormat(40)
68
+ : dutyDeminimis;
65
69
  // If deminimis is undefined or null, assume it's $0
66
- const dutyDeMinimisMessage = dutyDeminimis
67
- ? `${translate('Spend')} ${dutyDeminimis} ${translate('duty free')}`
70
+ const dutyDeMinimisMessage = dutyDeminimisToUse
71
+ ? `${translate('Spend')} ${dutyDeminimisToUse} ${translate('duty free')}`
68
72
  : translate('Duties will apply to all orders');
69
73
  // Our Robby API spells deminimis wrong here
70
74
  const taxDeminimis = (countryLandedCost === null || countryLandedCost === void 0 ? void 0 : countryLandedCost.vatTaxDeminimus)
71
- ? currencyConvertAndFormat(countryLandedCost.vatTaxDeminimus)
75
+ ? currencyFormat(countryLandedCost.vatTaxDeminimus)
72
76
  : null;
73
- const taxDeMinimisMessage = taxDeminimis
74
- ? `${translate('Spend')} ${taxDeminimis} ${translate('tax free')}`
77
+ // If Canada, use 150 CAD (courier tax de minimis)
78
+ const taxDeminimisToUse = localizationStore.selectedCountryCode === 'CA'
79
+ ? currencyFormat(150)
80
+ : taxDeminimis;
81
+ const taxDeMinimisMessage = taxDeminimisToUse
82
+ ? `${translate('Spend')} ${taxDeminimisToUse} ${translate('tax free')}`
75
83
  : translate('Taxes will apply to all orders');
76
84
  const animateLeft = this.animateFromLeftOverride ||
77
85
  (this.dialogRef && getHasMoreSpaceOnRight(this.dialogRef));
@@ -8,6 +8,44 @@ import { initHello } from "../utils/hello/initHello";
8
8
  import { log } from "../utils/logging/log";
9
9
  export class ZonosController {
10
10
  constructor() {
11
+ this.disablePlaceOrderButtons = ({ disable }) => {
12
+ const placeOrderButtonSelector = zonosStore.checkoutSettings.placeOrderButtonSelector;
13
+ if (!placeOrderButtonSelector) {
14
+ return;
15
+ }
16
+ const disableEvent = (e) => {
17
+ const target = e.target;
18
+ // prevent default and propagation when the item has disabled attribute
19
+ if (target.getAttribute('disabled')) {
20
+ e.preventDefault();
21
+ e.stopPropagation();
22
+ }
23
+ };
24
+ const placeOrderButton = document.querySelectorAll(placeOrderButtonSelector);
25
+ placeOrderButton.forEach(button => {
26
+ if (disable) {
27
+ button.setAttribute('disabled', 'true');
28
+ // prevent the selector to perform default action when it's disabled
29
+ button.addEventListener('click', disableEvent);
30
+ }
31
+ else {
32
+ button.removeAttribute('disabled');
33
+ // clean up the event listener
34
+ button.removeEventListener('click', disableEvent);
35
+ }
36
+ });
37
+ // only auto enable if autoEnable is true and the state is enable
38
+ if (disable) {
39
+ setTimeout(() => {
40
+ // release it if zonos is not initialized after 5 seconds (this is to prevent the place order button from being disabled forever due to api)
41
+ placeOrderButton.forEach(button => {
42
+ button.removeAttribute('disabled');
43
+ // clean up the event listener if exists
44
+ button.removeEventListener('click', disableEvent);
45
+ });
46
+ }, 5000);
47
+ }
48
+ };
11
49
  this.config = undefined;
12
50
  this.zonosApiKey = undefined;
13
51
  }
@@ -23,6 +61,10 @@ export class ZonosController {
23
61
  stripeStore.stripe = stripe;
24
62
  void initCheckout(zonosStore.checkoutSettings);
25
63
  log('init checkout element');
64
+ // enable place order button after checkout is loaded
65
+ this.disablePlaceOrderButtons({
66
+ disable: false,
67
+ });
26
68
  }
27
69
  /**
28
70
  * Init zonos notification
@@ -45,6 +87,10 @@ export class ZonosController {
45
87
  log('Failed to load zonos settings. This domain may not have access', 'warn');
46
88
  return;
47
89
  }
90
+ // disable place order button until checkout is loaded
91
+ this.disablePlaceOrderButtons({
92
+ disable: true,
93
+ });
48
94
  // init zonos notification
49
95
  this.initZonosNotification();
50
96
  // load default setting if fail to load user setting