@shipengine/elements 2.24.1 → 2.25.0

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 (206) hide show
  1. package/README.md +187 -6
  2. package/dist/cjs/components/field/credit-card-input/credit-card-input.cjs +46 -29
  3. package/dist/cjs/components/field/rate-select/rate-card/rate-card.cjs +29 -5
  4. package/dist/cjs/components/field/rate-select/rate-card/rate-card.styles.cjs +8 -3
  5. package/dist/cjs/components/field/rate-select/rate-select.cjs +26 -5
  6. package/dist/cjs/components/forms/address-form/address-form-schema.cjs +3 -3
  7. package/dist/cjs/components/forms/edit-billing-form/edit-billing-form.cjs +57 -4
  8. package/dist/cjs/components/service-card/service-card.cjs +4 -4
  9. package/dist/cjs/components/service-card/service-card.styles.cjs +5 -2
  10. package/dist/cjs/components/service-point-display/service-point-display.cjs +1 -36
  11. package/dist/cjs/components/service-point-display/service-point-display.styles.cjs +0 -12
  12. package/dist/cjs/components/shipment-not-found-error/index.cjs +7 -0
  13. package/dist/cjs/components/shipment-not-found-error/shipment-not-found-error.cjs +40 -0
  14. package/dist/cjs/components/shipment-not-found-error/shipment-not-found-error.styles.cjs +24 -0
  15. package/dist/cjs/components/suspend-purchase/suspend-purchase.cjs +11 -3
  16. package/dist/cjs/elements/purchase-label/components/rate-form/rate-form.cjs +13 -3
  17. package/dist/cjs/elements/purchase-label/components/rate-form/rate-schema.cjs +7 -2
  18. package/dist/cjs/elements/purchase-label/components/rate-form/rate-view.cjs +2 -0
  19. package/dist/cjs/elements/purchase-label/hooks/use-rate-options.cjs +31 -2
  20. package/dist/cjs/elements/purchase-label/hooks/use-rates-form.cjs +14 -18
  21. package/dist/cjs/elements/purchase-label/hooks/use-request-rates.cjs +20 -20
  22. package/dist/cjs/elements/purchase-label/purchase-label.cjs +4 -1
  23. package/dist/cjs/elements/shipment-summary/components/label-display/label-card.cjs +16 -31
  24. package/dist/cjs/elements/shipment-summary/components/label-display/label-card.styles.cjs +0 -19
  25. package/dist/cjs/elements/shipment-summary/components/label-display/paperless-label-display.cjs +54 -0
  26. package/dist/cjs/elements/shipment-summary/components/label-display/paperless-label-display.styles.cjs +27 -0
  27. package/dist/cjs/features/payment-method-settings/payment-method-settings.cjs +56 -18
  28. package/dist/cjs/hooks/use-configure-shipment.cjs +32 -11
  29. package/dist/cjs/hooks/use-helpers.cjs +4 -1
  30. package/dist/cjs/index.cjs +15 -12
  31. package/dist/cjs/locales/en/account-settings.json.cjs +6 -0
  32. package/dist/cjs/locales/en/common.json.cjs +2 -0
  33. package/dist/cjs/locales/en/purchase-label.json.cjs +5 -3
  34. package/dist/cjs/package.json.cjs +1 -1
  35. package/dist/cjs/utilities/address.cjs +29 -0
  36. package/dist/cjs/utilities/index.cjs +3 -0
  37. package/dist/cjs/utilities/money.cjs +14 -0
  38. package/dist/cjs/utilities/rate-warning-messages.cjs +25 -0
  39. package/dist/cjs/utilities/shipengine/warehouses.cjs +2 -1
  40. package/dist/cjs/workflows/connect-external-carrier/connect-external-carrier.cjs +7 -3
  41. package/dist/cjs/workflows/label-workflow/label-workflow.cjs +11 -3
  42. package/dist/cjs/workflows/onboarding/components/confirmation-and-submission-step/confirmation-and-submission-step.cjs +1 -1
  43. package/dist/cjs/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.cjs +17 -1
  44. package/dist/cjs/workflows/onboarding/components/onboarding-wizard/onboarding-wizard.cjs +4 -1
  45. package/dist/cjs/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.cjs +4 -1
  46. package/dist/cjs/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.cjs +14 -3
  47. package/dist/cjs/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.cjs +12 -12
  48. package/dist/esm/components/field/credit-card-input/credit-card-input.js +47 -30
  49. package/dist/esm/components/field/rate-select/rate-card/rate-card.js +30 -6
  50. package/dist/esm/components/field/rate-select/rate-card/rate-card.styles.js +8 -3
  51. package/dist/esm/components/field/rate-select/rate-select.js +26 -5
  52. package/dist/esm/components/forms/address-form/address-form-schema.js +3 -3
  53. package/dist/esm/components/forms/edit-billing-form/edit-billing-form.js +58 -5
  54. package/dist/esm/components/service-card/service-card.js +4 -4
  55. package/dist/esm/components/service-card/service-card.styles.js +5 -2
  56. package/dist/esm/components/service-point-display/service-point-display.js +2 -37
  57. package/dist/esm/components/service-point-display/service-point-display.styles.js +0 -12
  58. package/dist/esm/components/shipment-not-found-error/index.js +1 -0
  59. package/dist/esm/components/shipment-not-found-error/shipment-not-found-error.js +38 -0
  60. package/dist/esm/components/shipment-not-found-error/shipment-not-found-error.styles.js +22 -0
  61. package/dist/esm/components/suspend-purchase/suspend-purchase.js +11 -3
  62. package/dist/esm/elements/purchase-label/components/rate-form/rate-form.js +14 -4
  63. package/dist/esm/elements/purchase-label/components/rate-form/rate-schema.js +7 -2
  64. package/dist/esm/elements/purchase-label/components/rate-form/rate-view.js +2 -0
  65. package/dist/esm/elements/purchase-label/hooks/use-rate-options.js +31 -2
  66. package/dist/esm/elements/purchase-label/hooks/use-rates-form.js +14 -18
  67. package/dist/esm/elements/purchase-label/hooks/use-request-rates.js +20 -20
  68. package/dist/esm/elements/purchase-label/purchase-label.js +4 -1
  69. package/dist/esm/elements/shipment-summary/components/label-display/label-card.js +18 -33
  70. package/dist/esm/elements/shipment-summary/components/label-display/label-card.styles.js +0 -19
  71. package/dist/esm/elements/shipment-summary/components/label-display/paperless-label-display.js +52 -0
  72. package/dist/esm/elements/shipment-summary/components/label-display/paperless-label-display.styles.js +25 -0
  73. package/dist/esm/features/payment-method-settings/payment-method-settings.js +57 -19
  74. package/dist/esm/hooks/use-configure-shipment.js +33 -12
  75. package/dist/esm/hooks/use-helpers.js +4 -1
  76. package/dist/esm/index.js +1 -0
  77. package/dist/esm/locales/en/account-settings.json.js +6 -0
  78. package/dist/esm/locales/en/common.json.js +2 -0
  79. package/dist/esm/locales/en/purchase-label.json.js +5 -3
  80. package/dist/esm/package.json.js +1 -1
  81. package/dist/esm/utilities/address.js +26 -0
  82. package/dist/esm/utilities/index.js +1 -0
  83. package/dist/esm/utilities/money.js +14 -1
  84. package/dist/esm/utilities/rate-warning-messages.js +23 -0
  85. package/dist/esm/utilities/shipengine/warehouses.js +2 -1
  86. package/dist/esm/workflows/connect-external-carrier/connect-external-carrier.js +7 -3
  87. package/dist/esm/workflows/label-workflow/label-workflow.js +11 -3
  88. package/dist/esm/workflows/onboarding/components/confirmation-and-submission-step/confirmation-and-submission-step.js +1 -1
  89. package/dist/esm/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.js +17 -1
  90. package/dist/esm/workflows/onboarding/components/onboarding-wizard/onboarding-wizard.js +4 -1
  91. package/dist/esm/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.js +4 -1
  92. package/dist/esm/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.js +14 -3
  93. package/dist/esm/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.js +12 -12
  94. package/dist/types/components/field/credit-card-input/credit-card-input.d.ts.map +1 -1
  95. package/dist/types/components/field/rate-select/rate-card/rate-card.d.ts +4 -2
  96. package/dist/types/components/field/rate-select/rate-card/rate-card.d.ts.map +1 -1
  97. package/dist/types/components/field/rate-select/rate-card/rate-card.styles.d.ts +7 -2
  98. package/dist/types/components/field/rate-select/rate-card/rate-card.styles.d.ts.map +1 -1
  99. package/dist/types/components/field/rate-select/rate-select.d.ts +1 -0
  100. package/dist/types/components/field/rate-select/rate-select.d.ts.map +1 -1
  101. package/dist/types/components/forms/address-form/address-form-schema.d.ts.map +1 -1
  102. package/dist/types/components/forms/edit-billing-form/edit-billing-form.d.ts +2 -1
  103. package/dist/types/components/forms/edit-billing-form/edit-billing-form.d.ts.map +1 -1
  104. package/dist/types/components/service-card/service-card.d.ts +1 -1
  105. package/dist/types/components/service-card/service-card.d.ts.map +1 -1
  106. package/dist/types/components/service-card/service-card.styles.d.ts +4 -1
  107. package/dist/types/components/service-card/service-card.styles.d.ts.map +1 -1
  108. package/dist/types/components/service-point-display/service-point-display.d.ts.map +1 -1
  109. package/dist/types/components/service-point-display/service-point-display.styles.d.ts +0 -12
  110. package/dist/types/components/service-point-display/service-point-display.styles.d.ts.map +1 -1
  111. package/dist/types/components/shipment-not-found-error/index.d.ts +2 -0
  112. package/dist/types/components/shipment-not-found-error/index.d.ts.map +1 -0
  113. package/dist/types/components/shipment-not-found-error/shipment-not-found-error.d.ts +6 -0
  114. package/dist/types/components/shipment-not-found-error/shipment-not-found-error.d.ts.map +1 -0
  115. package/dist/types/components/shipment-not-found-error/shipment-not-found-error.styles.d.ts +19 -0
  116. package/dist/types/components/shipment-not-found-error/shipment-not-found-error.styles.d.ts.map +1 -0
  117. package/dist/types/components/suspend-purchase/suspend-purchase.d.ts +4 -2
  118. package/dist/types/components/suspend-purchase/suspend-purchase.d.ts.map +1 -1
  119. package/dist/types/elements/labels-grid/labels-grid.d.ts +11 -1
  120. package/dist/types/elements/labels-grid/labels-grid.d.ts.map +1 -1
  121. package/dist/types/elements/manage-carriers/manage-carriers.d.ts +11 -1
  122. package/dist/types/elements/manage-carriers/manage-carriers.d.ts.map +1 -1
  123. package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts +11 -1
  124. package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts.map +1 -1
  125. package/dist/types/elements/manage-funding/manage-funding-element.d.ts +11 -1
  126. package/dist/types/elements/manage-funding/manage-funding-element.d.ts.map +1 -1
  127. package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts +11 -1
  128. package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts.map +1 -1
  129. package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts +11 -1
  130. package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts.map +1 -1
  131. package/dist/types/elements/purchase-label/components/rate-form/rate-form.d.ts +1 -1
  132. package/dist/types/elements/purchase-label/components/rate-form/rate-form.d.ts.map +1 -1
  133. package/dist/types/elements/purchase-label/components/rate-form/rate-schema.d.ts +10 -1
  134. package/dist/types/elements/purchase-label/components/rate-form/rate-schema.d.ts.map +1 -1
  135. package/dist/types/elements/purchase-label/components/rate-form/rate-view.d.ts +2 -1
  136. package/dist/types/elements/purchase-label/components/rate-form/rate-view.d.ts.map +1 -1
  137. package/dist/types/elements/purchase-label/hooks/use-rate-options.d.ts.map +1 -1
  138. package/dist/types/elements/purchase-label/hooks/use-rates-form.d.ts +2 -2
  139. package/dist/types/elements/purchase-label/hooks/use-rates-form.d.ts.map +1 -1
  140. package/dist/types/elements/purchase-label/hooks/use-request-rates.d.ts.map +1 -1
  141. package/dist/types/elements/purchase-label/purchase-label.d.ts +11 -1
  142. package/dist/types/elements/purchase-label/purchase-label.d.ts.map +1 -1
  143. package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts +11 -1
  144. package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts.map +1 -1
  145. package/dist/types/elements/shipment-summary/components/label-display/label-card.d.ts.map +1 -1
  146. package/dist/types/elements/shipment-summary/components/label-display/label-card.styles.d.ts +0 -19
  147. package/dist/types/elements/shipment-summary/components/label-display/label-card.styles.d.ts.map +1 -1
  148. package/dist/types/elements/shipment-summary/components/label-display/paperless-label-display.d.ts +8 -0
  149. package/dist/types/elements/shipment-summary/components/label-display/paperless-label-display.d.ts.map +1 -0
  150. package/dist/types/elements/shipment-summary/components/label-display/paperless-label-display.styles.d.ts +22 -0
  151. package/dist/types/elements/shipment-summary/components/label-display/paperless-label-display.styles.d.ts.map +1 -0
  152. package/dist/types/elements/shipment-summary/shipment-summary.d.ts +11 -1
  153. package/dist/types/elements/shipment-summary/shipment-summary.d.ts.map +1 -1
  154. package/dist/types/elements/shipments-grid/hooks/use-shipments-grid.d.ts.map +1 -1
  155. package/dist/types/elements/shipments-grid/shipments-grid.d.ts +11 -1
  156. package/dist/types/elements/shipments-grid/shipments-grid.d.ts.map +1 -1
  157. package/dist/types/elements/theme-creator/theme-creator.d.ts +11 -1
  158. package/dist/types/elements/theme-creator/theme-creator.d.ts.map +1 -1
  159. package/dist/types/elements/transaction-history/transaction-history-element.d.ts +11 -1
  160. package/dist/types/elements/transaction-history/transaction-history-element.d.ts.map +1 -1
  161. package/dist/types/elements/unit-settings/unit-settings-element.d.ts +11 -1
  162. package/dist/types/elements/unit-settings/unit-settings-element.d.ts.map +1 -1
  163. package/dist/types/elements/vat-settings/vat-settings-element.d.ts +11 -1
  164. package/dist/types/elements/vat-settings/vat-settings-element.d.ts.map +1 -1
  165. package/dist/types/elements/void-label/void-label.d.ts +11 -1
  166. package/dist/types/elements/void-label/void-label.d.ts.map +1 -1
  167. package/dist/types/features/payment-method-settings/payment-method-settings.d.ts.map +1 -1
  168. package/dist/types/hooks/use-configure-shipment.d.ts +1 -0
  169. package/dist/types/hooks/use-configure-shipment.d.ts.map +1 -1
  170. package/dist/types/hooks/use-helpers.d.ts +2 -0
  171. package/dist/types/hooks/use-helpers.d.ts.map +1 -1
  172. package/dist/types/index.d.ts +1 -1
  173. package/dist/types/index.d.ts.map +1 -1
  174. package/dist/types/locales/en/index.d.ts +11 -1
  175. package/dist/types/locales/en/index.d.ts.map +1 -1
  176. package/dist/types/types/rates.d.ts +1 -0
  177. package/dist/types/types/rates.d.ts.map +1 -1
  178. package/dist/types/utilities/address.d.ts +21 -0
  179. package/dist/types/utilities/address.d.ts.map +1 -0
  180. package/dist/types/utilities/feature-flags/types.d.ts +1 -1
  181. package/dist/types/utilities/feature-flags/types.d.ts.map +1 -1
  182. package/dist/types/utilities/index.d.ts +1 -0
  183. package/dist/types/utilities/index.d.ts.map +1 -1
  184. package/dist/types/utilities/money.d.ts +6 -0
  185. package/dist/types/utilities/money.d.ts.map +1 -1
  186. package/dist/types/utilities/rate-warning-messages.d.ts +15 -0
  187. package/dist/types/utilities/rate-warning-messages.d.ts.map +1 -0
  188. package/dist/types/workflows/account-settings/account-settings.d.ts +11 -1
  189. package/dist/types/workflows/account-settings/account-settings.d.ts.map +1 -1
  190. package/dist/types/workflows/carrier-services/carrier-services.d.ts +11 -1
  191. package/dist/types/workflows/carrier-services/carrier-services.d.ts.map +1 -1
  192. package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts +11 -1
  193. package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts.map +1 -1
  194. package/dist/types/workflows/label-workflow/label-workflow.d.ts +11 -1
  195. package/dist/types/workflows/label-workflow/label-workflow.d.ts.map +1 -1
  196. package/dist/types/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.d.ts.map +1 -1
  197. package/dist/types/workflows/onboarding/components/onboarding-wizard/onboarding-wizard.d.ts.map +1 -1
  198. package/dist/types/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.d.ts +2 -1
  199. package/dist/types/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.d.ts.map +1 -1
  200. package/dist/types/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.d.ts +3 -1
  201. package/dist/types/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.d.ts.map +1 -1
  202. package/dist/types/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.d.ts +1 -0
  203. package/dist/types/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.d.ts.map +1 -1
  204. package/dist/types/workflows/onboarding/onboarding.d.ts +11 -1
  205. package/dist/types/workflows/onboarding/onboarding.d.ts.map +1 -1
  206. package/package.json +3 -3
@@ -34,26 +34,25 @@ const useTermsAgreementStep = ({
34
34
  const fundingSourceRegion = fundingSourceMetadata === null || fundingSourceMetadata === void 0 ? void 0 : fundingSourceMetadata.defaultRegionProfile.countryCode;
35
35
  const fundingSourceCarrierProfiles = fundingSourceMetadata === null || fundingSourceMetadata === void 0 ? void 0 : fundingSourceMetadata.defaultRegionProfile.carrierProfiles;
36
36
  const carrierProfilesFilteredByRegion = carrier.filterFundingSourceCarriers(fundingSourceCarrierProfiles, fundingSourceRegion);
37
+ const hasFreeStampsConnected = carriers === null || carriers === void 0 ? void 0 : carriers.some(c => c.carrierCode === "stamps_com" && c.fundingSourceId === null);
37
38
  // filter carrier profiles based on enabled carriers
38
- const enabledCarrierProfiles = carrierProfilesFilteredByRegion === null || carrierProfilesFilteredByRegion === void 0 ? void 0 : carrierProfilesFilteredByRegion.filter(c => enabledCarriers.includes(c.carrierCode));
39
+ const enabledCarrierProfiles = carrierProfilesFilteredByRegion === null || carrierProfilesFilteredByRegion === void 0 ? void 0 : carrierProfilesFilteredByRegion.filter(c => {
40
+ if (c.carrierCode === "stamps_com" && hasFreeStampsConnected) {
41
+ // if stamps_com is connected as a free account, we don't want to show it in the list of carriers to register. The funding source creation will convert it to a walleted carrier as the default carrier.
42
+ return false;
43
+ }
44
+ // filter out carriers that are not enabled by the feature flag
45
+ return enabledCarriers.includes(c.carrierCode);
46
+ });
39
47
  const carrierProfilesToRegister = React.useMemo(() => {
40
48
  if (!enabledCarrierProfiles) return [];
41
- // add Stamps/USPS carrier ToS from funding source terms
42
- const carrierProfiles = enabledCarrierProfiles.map(c => {
43
- if (c.carrierCode === "stamps_com" && fundingSourceRequiredTerms) {
44
- return Object.assign(Object.assign({}, c), {
45
- requiredTerms: [...fundingSourceRequiredTerms, ...c.requiredTerms]
46
- });
47
- }
48
- return c;
49
- });
50
49
  // handle existing funding source
51
50
  const {
52
51
  fundingSourceId
53
52
  } = (fundingSources === null || fundingSources === void 0 ? void 0 : fundingSources[0]) || {};
54
- if (!fundingSourceId || !carriers) return carrierProfiles;
53
+ if (!fundingSourceId || !carriers) return enabledCarrierProfiles;
55
54
  const connectedCarriers = carriers.filter(c => c.fundingSourceId === fundingSourceId);
56
- return carrierProfiles.filter(profile => {
55
+ return enabledCarrierProfiles.filter(profile => {
57
56
  // filter out carriers that are already connected
58
57
  const isConnected = connectedCarriers.some(c => c.carrierCode === profile.carrierCode && c.fundingSourceId === fundingSourceId);
59
58
  // if stamps_com is enabled, and usps is connected to the funding source,
@@ -100,6 +99,7 @@ const useTermsAgreementStep = ({
100
99
  carrierProfilesToRegister,
101
100
  enabledCarrierProfiles,
102
101
  fundingSourceMetadata,
102
+ hasFreeStampsConnected,
103
103
  fundingSourceRequiredTerms,
104
104
  fundingSources,
105
105
  handleSubmitTermsAgreement,
@@ -1,42 +1,59 @@
1
1
  import { __rest } from '../../../_virtual/_tslib.js';
2
2
  import { jsx } from '@emotion/react/jsx-runtime';
3
3
  import { Input } from '@shipengine/giger';
4
- import { formatCreditCardNumber } from '../../../utilities/money.js';
4
+ import { formatCreditCardNumber, maskCreditCardNumber } from '../../../utilities/money.js';
5
+ import { useState } from 'react';
5
6
  import { createFieldController } from '../create-field-controller.js';
6
7
  import { styles } from '../field.styles.js';
7
8
 
8
9
  const CreditCardInputController = createFieldController();
9
10
  const transform = {
10
- in: v => v ? formatCreditCardNumber(v) : "",
11
+ in: (v, isFocused) => {
12
+ if (!v) return "";
13
+ return isFocused ? formatCreditCardNumber(v) : maskCreditCardNumber(v);
14
+ },
11
15
  out: event => event.target.value === "" ? null : event.target.value.replace(/\s/g, "")
12
16
  };
13
- const CreditCardInput = fieldProps => jsx(CreditCardInputController, Object.assign({}, fieldProps, {
14
- children: _a => {
15
- var {
16
- onChange,
17
- value
18
- } = _a,
19
- creditCardInputProps = __rest(_a, ["onChange", "value"]);
20
- return jsx("div", {
21
- css: styles.overrideStyles,
22
- children: jsx(Input, Object.assign({}, creditCardInputProps, {
23
- onChange: e => {
24
- // Amex allows 15 digits, all others allow 16
25
- if (e.target.value.replace(/\s/g, "").length > 16) {
26
- e.preventDefault();
27
- } else {
28
- onChange(transform.out(e));
29
- }
30
- },
31
- onKeyDown: e => {
32
- // Prevent non-numeric characters
33
- if (!/^([0-9]|Backspace|Delete|Enter|Tab)$/i.test(e.key)) e.preventDefault();
34
- },
35
- type: "text",
36
- value: transform.in(value)
37
- }))
38
- });
39
- }
40
- }));
17
+ const CreditCardInput = fieldProps => {
18
+ const [isFocused, setIsFocused] = useState(false);
19
+ return jsx(CreditCardInputController, Object.assign({}, fieldProps, {
20
+ children: _a => {
21
+ var {
22
+ onChange,
23
+ value
24
+ } = _a,
25
+ creditCardInputProps = __rest(_a, ["onChange", "value"]);
26
+ return jsx("div", {
27
+ css: styles.overrideStyles,
28
+ children: jsx(Input, Object.assign({}, creditCardInputProps, {
29
+ onBlur: () => {
30
+ var _a;
31
+ setIsFocused(false);
32
+ (_a = creditCardInputProps.onBlur) === null || _a === void 0 ? void 0 : _a.call(creditCardInputProps);
33
+ },
34
+ onChange: e => {
35
+ // Amex allows 15 digits, all others allow 16
36
+ if (e.target.value.replace(/\s/g, "").length > 16) {
37
+ e.preventDefault();
38
+ } else {
39
+ onChange(transform.out(e));
40
+ }
41
+ },
42
+ onFocus: e => {
43
+ var _a;
44
+ setIsFocused(true);
45
+ (_a = creditCardInputProps.onFocus) === null || _a === void 0 ? void 0 : _a.call(creditCardInputProps, e);
46
+ },
47
+ onKeyDown: e => {
48
+ // Prevent non-numeric characters
49
+ if (!/^([0-9]|Backspace|Delete|Enter|Tab)$/i.test(e.key)) e.preventDefault();
50
+ },
51
+ type: "text",
52
+ value: transform.in(value, isFocused)
53
+ }))
54
+ });
55
+ }
56
+ }));
57
+ };
41
58
 
42
59
  export { CreditCardInput };
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from '@emotion/react/jsx-runtime';
2
- import { Icon, IconSize, Divider, Checkbox, Link } from '@shipengine/giger';
2
+ import { Icon, IconSize, Typography, Divider, Checkbox, Link } from '@shipengine/giger';
3
3
  import { IconNames } from '@shipengine/giger-theme';
4
4
  import { getTotalRateAmount } from '../../../../utilities/rates.js';
5
5
  import { useMemo } from 'react';
@@ -82,6 +82,7 @@ const RateCard = ({
82
82
  messages,
83
83
  onClick,
84
84
  onClickAcknowledgement,
85
+ onPaperlessAcknowledgementChange,
85
86
  onSelectServicePoint,
86
87
  otherAmount,
87
88
  rateId,
@@ -99,7 +100,9 @@ const RateCard = ({
99
100
  selectedRateCost,
100
101
  servicePoints,
101
102
  mapViewEnabled,
102
- rateDetails
103
+ rateDetails,
104
+ paperlessDisplaySchemes,
105
+ paperlessLabelChecked = false
103
106
  }) => {
104
107
  /* TODO: ENGINE-7366: TODO Remove showVatSettings flag once this is fully in production */
105
108
  const showRateDetails = showVatFeatures && rateDetails && rateDetails.length > 0;
@@ -143,7 +146,8 @@ const RateCard = ({
143
146
  return undefined;
144
147
  }
145
148
  }, [confirmationAmount, insuranceAmount, isPreferredRate, otherAmount, selectedRateCost, shippingAmount, taxAmount]);
146
- const hasFooterData = !!(rateMessages === null || rateMessages === void 0 ? void 0 : rateMessages.length) || requiresAcknowledgement;
149
+ const requiresPaperlessAcknowledgement = paperlessDisplaySchemes === null || paperlessDisplaySchemes === void 0 ? void 0 : paperlessDisplaySchemes.includes("qr_code");
150
+ const hasFooterData = !!(rateMessages === null || rateMessages === void 0 ? void 0 : rateMessages.length) || requiresAcknowledgement || requiresPaperlessAcknowledgement;
147
151
  const costBreakdownCommonProps = {
148
152
  confirmationAmount,
149
153
  insuranceAmount,
@@ -184,6 +188,17 @@ const RateCard = ({
184
188
  serviceInfo: {
185
189
  line1: carrierNickname,
186
190
  line2: getDeliveryDaysLabel(deliveryDays),
191
+ line3: paperlessDisplaySchemes && paperlessDisplaySchemes.length > 0 ? jsxs("div", {
192
+ "aria-label": t("purchase-label:paperlessAvailable"),
193
+ css: styles.paperlessText,
194
+ children: [jsx(Icon, {
195
+ name: IconNames.SCAN_QR,
196
+ size: IconSize.SIZE_MEDIUM
197
+ }), jsx(Typography, {
198
+ variant: "small",
199
+ children: t("purchase-label:paperlessAvailable")
200
+ })]
201
+ }) : undefined,
187
202
  type: serviceType
188
203
  }
189
204
  }), servicePoints && jsxs(Fragment, {
@@ -198,16 +213,25 @@ const RateCard = ({
198
213
  rateSelected: selected,
199
214
  servicePoints: servicePoints
200
215
  })]
201
- }), selected && hasFooterData && jsx(ServiceCardFooter, {
216
+ }), selected && hasFooterData && jsxs(ServiceCardFooter, {
202
217
  messages: rateMessages,
203
- children: requiresAcknowledgement && onClickAcknowledgement && jsx(Checkbox, {
218
+ children: [requiresAcknowledgement && onClickAcknowledgement && jsx(Checkbox, {
204
219
  "aria-required": true,
205
220
  checked: isAcknowledged,
206
221
  css: styles.acknowledgment,
207
222
  "data-testid": "rate-acknowledgement",
208
223
  label: rateAcknowledgementMessage ? getPreferredRateAcknowledgementLabel(rateAcknowledgementMessage) : getAcknowledgementLabel(serviceCode, packageType),
209
224
  onChange: e => onClickAcknowledgement(e.target.checked)
210
- })
225
+ }), requiresPaperlessAcknowledgement && jsx(Checkbox, {
226
+ "aria-required": true,
227
+ checked: paperlessLabelChecked,
228
+ css: styles.acknowledgment,
229
+ "data-testid": "paperless-acknowledgement",
230
+ label: t("purchase-label:usePaperlessLabel"),
231
+ onChange: e => {
232
+ onPaperlessAcknowledgementChange === null || onPaperlessAcknowledgementChange === void 0 ? void 0 : onPaperlessAcknowledgementChange(e.target.checked, "qr_code");
233
+ }
234
+ })]
211
235
  })]
212
236
  });
213
237
  };
@@ -3,10 +3,8 @@ import { scopeTheme, createStyles } from '../../../../utilities/styles.js';
3
3
  const getRateCardFirstLineSize = theme => `${scopeTheme(theme).spacing(3.25)}px`;
4
4
  const styles = createStyles({
5
5
  acknowledgment: theme => ({
6
- alignItems: "center",
7
6
  color: scopeTheme(theme).palette.gray.main,
8
- display: "flex",
9
- paddingTop: scopeTheme(theme).spacing(1.5)
7
+ display: "flex"
10
8
  }),
11
9
  divider: theme => ({
12
10
  borderColor: scopeTheme(theme).palette.primary.main,
@@ -27,6 +25,13 @@ const styles = createStyles({
27
25
  position: "absolute",
28
26
  right: 0,
29
27
  top: 0
28
+ }),
29
+ paperlessText: theme => ({
30
+ display: "flex",
31
+ gap: scopeTheme(theme).spacing(0.25),
32
+ paddingTop: scopeTheme(theme).spacing(0.5),
33
+ color: scopeTheme(theme).palette.gray[600],
34
+ alignItems: "center"
30
35
  })
31
36
  });
32
37
 
@@ -20,12 +20,13 @@ const RateSelect = _a => {
20
20
  nicknameFeature,
21
21
  preferredServiceCodes,
22
22
  onClick,
23
+ onPaperlessAcknowledgementChange,
23
24
  onSelectServicePoint,
24
25
  isLoading,
25
26
  mapViewEnabled,
26
27
  showVatFeatures
27
28
  } = _a,
28
- fieldProps = __rest(_a, ["nicknameFeature", "preferredServiceCodes", "onClick", "onSelectServicePoint", "isLoading", "mapViewEnabled", "showVatFeatures"]);
29
+ fieldProps = __rest(_a, ["nicknameFeature", "preferredServiceCodes", "onClick", "onPaperlessAcknowledgementChange", "onSelectServicePoint", "isLoading", "mapViewEnabled", "showVatFeatures"]);
29
30
  // The calculated cost of the selected rate
30
31
  const [selectedRateCost, setSelectedRateCost] = useState();
31
32
  return jsx(RateSelectController, Object.assign({}, fieldProps, {
@@ -48,17 +49,37 @@ const RateSelect = _a => {
48
49
  isPreferredRate: preferredServiceCodes && preferredServiceCodes.includes(option.serviceCode),
49
50
  key: option.rateId,
50
51
  onClick: rateId => {
52
+ var _a;
51
53
  onClick === null || onClick === void 0 ? void 0 : onClick(rateId);
52
- field.onChange({
53
- isAcknowledged: !option.requiresAcknowledgement,
54
- rateId
55
- });
54
+ // if the rate supports "label_and_paperless" display scheme, use it by default
55
+ if ((_a = option.paperlessDisplaySchemes) === null || _a === void 0 ? void 0 : _a.includes("label_and_paperless")) {
56
+ field.onChange({
57
+ usePaperlessLabel: true,
58
+ labelDisplayScheme: "label_and_paperless",
59
+ isAcknowledged: !option.requiresAcknowledgement,
60
+ rateId
61
+ });
62
+ } else {
63
+ field.onChange({
64
+ isAcknowledged: !option.requiresAcknowledgement,
65
+ rateId
66
+ });
67
+ }
56
68
  setSelectedRateCost(getTotalRateAmount(option));
57
69
  },
58
70
  onClickAcknowledgement: isAcknowledged => field.onChange(Object.assign(Object.assign({}, field.value), {
59
71
  isAcknowledged
60
72
  })),
73
+ onPaperlessAcknowledgementChange: (usePaperless, labelDisplayScheme) => {
74
+ field.onChange(Object.assign(Object.assign({}, field.value), {
75
+ usePaperlessLabel: usePaperless,
76
+ labelDisplayScheme
77
+ }));
78
+ onPaperlessAcknowledgementChange === null || onPaperlessAcknowledgementChange === void 0 ? void 0 : onPaperlessAcknowledgementChange(usePaperless, labelDisplayScheme);
79
+ },
61
80
  onSelectServicePoint: onSelectServicePoint,
81
+ paperlessDisplaySchemes: option.paperlessDisplaySchemes,
82
+ paperlessLabelChecked: field.value.usePaperlessLabel,
62
83
  rateDetails: option.rateDetails,
63
84
  selected: option.rateId === field.value.rateId,
64
85
  selectedRateCost: selectedRateCost,
@@ -4,12 +4,12 @@ import { usStateCodes, postalCodeRegex, addressNameRegex } from '../../../consta
4
4
  import { extendZod } from '../../../extensions/zod.js';
5
5
 
6
6
  extendZod();
7
- const refineName = n => n.match(/^[a-zA-Z']/);
8
7
  const refineNameStrict = n => n.match(addressNameRegex);
9
8
  const shipToAddressSchema = addressSchema.refine(schema => {
10
- return refineName(schema.name);
9
+ // KEEP THIS STRICT, USPS REQUIRES 2 CHARACTERS FOR FIRST AND LAST NAME
10
+ return refineNameStrict(schema.name);
11
11
  }, {
12
- message: "schemaErrors.invalidAddressName",
12
+ message: "schemaErrors.invalidAddressNameStrict",
13
13
  path: ["name"]
14
14
  }).refine(schema => !schema.phone || isValidPhoneNumber(schema.phone, schema.countryCode), {
15
15
  message: "schemaErrors.notAValidPhoneNumber",
@@ -1,4 +1,5 @@
1
- import { jsx, jsxs } from '@emotion/react/jsx-runtime';
1
+ import { jsx, jsxs, Fragment } from '@emotion/react/jsx-runtime';
2
+ import { useToggle } from '../../../hooks/use-toggle.js';
2
3
  import { Grid, GridChild, Typography, Button, ButtonVariant, ButtonColor } from '@shipengine/giger';
3
4
  import { formLogger } from '../../../utilities/form-logger.js';
4
5
  import { validationResolver } from '../../../utilities/validation.js';
@@ -8,19 +9,38 @@ import { BillingFields } from '../wallet-form/billing-fields.js';
8
9
  import { styles } from './edit-billing-form.styles.js';
9
10
  import { getWalletSchema } from '../wallet-form/wallet-schema.js';
10
11
  import { AddressFields } from '../address-form/address-fields.js';
12
+ import { AddressDisplay } from '../../address-display/address-display.js';
13
+ import { LinkAction } from '../../link-action/link-action.js';
11
14
  import { ButtonGroup } from '../../button-group/button-group.js';
12
15
  import { SubmitButton } from '../../field/submit-button/submit-button.js';
13
16
 
14
17
  const EditBillingForm = ({
15
18
  onCancel,
16
19
  onSubmit,
17
- isLoading
20
+ isLoading,
21
+ billingInfo
18
22
  }) => {
23
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
19
24
  const {
20
25
  t
21
26
  } = useTranslation();
27
+ const [editBillingInfo, toggleEditBillingInfo] = useToggle(false);
22
28
  const form = useForm({
23
- resolver: validationResolver(getWalletSchema("emailRequired", "blackboxOptional"), ["creditCard"])
29
+ resolver: validationResolver(getWalletSchema("emailRequired", "blackboxOptional"), ["creditCard"]),
30
+ defaultValues: {
31
+ address: {
32
+ name: (_a = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.fullName) !== null && _a !== void 0 ? _a : "",
33
+ companyName: (_b = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.company) !== null && _b !== void 0 ? _b : "",
34
+ addressLine1: (_c = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.addressLine1) !== null && _c !== void 0 ? _c : "",
35
+ addressLine2: (_d = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.addressLine2) !== null && _d !== void 0 ? _d : "",
36
+ cityLocality: (_e = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.cityLocality) !== null && _e !== void 0 ? _e : "",
37
+ stateProvince: (_f = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.stateProvince) !== null && _f !== void 0 ? _f : "",
38
+ postalCode: (_g = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.postalCode) !== null && _g !== void 0 ? _g : "",
39
+ countryCode: billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.countryCode,
40
+ email: (_h = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.email) !== null && _h !== void 0 ? _h : "",
41
+ phone: (_j = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.phone) !== null && _j !== void 0 ? _j : ""
42
+ }
43
+ }
24
44
  });
25
45
  const handleSubmit = form.handleSubmit(values => {
26
46
  const {
@@ -57,14 +77,47 @@ const EditBillingForm = ({
57
77
  variant: "subtitle1",
58
78
  children: t("register-wallet:settings.billing.subtitleBilling")
59
79
  })
60
- }), jsx(GridChild, {
80
+ }), billingInfo && !editBillingInfo && jsxs(Fragment, {
81
+ children: [jsx(GridChild, {
82
+ colSpan: 9,
83
+ children: jsx(AddressDisplay, {
84
+ address: Object.assign(Object.assign({}, billingInfo), {
85
+ name: billingInfo.fullName,
86
+ companyName: billingInfo.company
87
+ })
88
+ })
89
+ }), jsx(GridChild, {
90
+ colSpan: 3,
91
+ css: {
92
+ textAlign: "right"
93
+ },
94
+ children: jsx(LinkAction, {
95
+ css: {
96
+ alignSelf: "end"
97
+ },
98
+ onClick: () => {
99
+ toggleEditBillingInfo(true);
100
+ form.reset({
101
+ address: Object.assign(Object.assign({}, billingInfo), {
102
+ name: billingInfo.fullName,
103
+ companyName: billingInfo.company,
104
+ countryCode: billingInfo.countryCode
105
+ })
106
+ }, {
107
+ keepDirtyValues: true
108
+ });
109
+ },
110
+ title: t("actions.edit")
111
+ })
112
+ })]
113
+ }), !billingInfo || editBillingInfo ? jsx(GridChild, {
61
114
  colSpan: 12,
62
115
  children: jsx(AddressFields, {
63
116
  form: form,
64
117
  formatFieldName: fieldName => `address.${fieldName}`,
65
118
  optionalFields: ["addressLine2"]
66
119
  })
67
- }), jsx(GridChild, {
120
+ }) : null, jsx(GridChild, {
68
121
  colSpan: 12,
69
122
  children: jsxs(ButtonGroup, {
70
123
  justify: "end",
@@ -64,7 +64,7 @@ const ServiceCardHeader = ({
64
64
  children: line1
65
65
  }), line2 && jsx(Typography, {
66
66
  children: line2
67
- }), line3 && jsx(Typography, {
67
+ }), line3 && jsx("div", {
68
68
  children: line3
69
69
  })]
70
70
  }), jsx("div", {
@@ -79,15 +79,15 @@ const ServiceCardHeader = ({
79
79
  };
80
80
  const ServiceCardFooter = ({
81
81
  children,
82
- messages
82
+ messages = []
83
83
  }) => {
84
84
  return jsxs("div", {
85
85
  "data-testid": "service-card-footer",
86
86
  children: [jsx(Divider, {
87
87
  css: styles.divider
88
88
  }), jsxs("section", {
89
- css: styles.footer,
90
- children: [messages && jsx("ul", {
89
+ css: styles.footerStyles,
90
+ children: [messages.length > 0 && jsx("ul", {
91
91
  css: [styles.footerList, messages.length > 1 && styles.footerListWithMultipleMessages],
92
92
  children: messages.map((m, index) => jsxs("li", {
93
93
  css: styles.footerListItem,
@@ -14,8 +14,11 @@ const styles = createStyles({
14
14
  opacity: 0.3,
15
15
  width: `calc(100% - ${scopeTheme(theme).spacing(4)}px)`
16
16
  }),
17
- footer: theme => ({
18
- padding: scopeTheme(theme).spacing(2)
17
+ footerStyles: theme => ({
18
+ padding: scopeTheme(theme).spacing(2),
19
+ display: "flex",
20
+ flexDirection: "column",
21
+ gap: scopeTheme(theme).spacing(2)
19
22
  }),
20
23
  footerList: {
21
24
  listStyle: "none"
@@ -1,17 +1,9 @@
1
1
  import { jsxs, jsx, Fragment } from '@emotion/react/jsx-runtime';
2
- import { Icon, IconSize, Typography, Link } from '@shipengine/giger';
3
- import { IconNames } from '@shipengine/giger-theme';
4
- import { useState, useEffect } from 'react';
2
+ import { Typography, Link } from '@shipengine/giger';
5
3
  import { useTranslation } from 'react-i18next';
6
4
  import { OperatingHoursDisplay } from './operating-hours.js';
7
5
  import { styles } from './service-point-display.styles.js';
8
6
 
9
- /* https://auctane.atlassian.net/browse/ENGINE-7329
10
- * For iteration one we would hardcode services for which it will be available (in the future this data will be in the registry. We will change hardcoding then)
11
- * carriersWithPaperless and servicesWithPaperless are hardcoded for iteration one
12
- */
13
- const carriersWithPaperless = "hermes";
14
- const servicesWithPaperless = ["hermes_domestic_parcelshop_dropoff", "hermes_domestic_parcelshop_dropoff_next_day", "hermes_postable", "hermes_postable_next_day"];
15
7
  const formatDistance = meters => {
16
8
  return meters < 1000 ? "< 1 km" : `${parseFloat((meters / 1000).toFixed(1))} km`;
17
9
  };
@@ -25,36 +17,9 @@ const ServicePointDisplay = ({
25
17
  const {
26
18
  t
27
19
  } = useTranslation("purchase-label");
28
- const [isFilteredServicesWithPaperless, setIsFilteredServicesWithPaperless] = useState(false);
29
- /* https://auctane.atlassian.net/browse/ENGINE-7329
30
- * For iteration one we would hardcode services for which it will be available (in the future this data will be in the registry. We will change hardcoding then)
31
- */
32
- useEffect(() => {
33
- if (carriersWithPaperless === servicePoint.carrierCode) {
34
- const filteredServicesWithPaperless = servicePoint.serviceCodes.map(serviceCode => {
35
- return servicesWithPaperless.filter(service => service === serviceCode);
36
- }).length > 0;
37
- setIsFilteredServicesWithPaperless(filteredServicesWithPaperless);
38
- }
39
- }, [servicePoint.carrierCode, servicePoint.serviceCodes]);
40
20
  return jsxs("div", {
41
21
  css: styles.container,
42
- children: [isFilteredServicesWithPaperless && jsxs("section", {
43
- css: styles.paperlessWrapper,
44
- children: [jsx(Icon, {
45
- css: styles.paperlessIcon,
46
- name: IconNames.PRINTER,
47
- size: IconSize.SIZE_MEDIUM
48
- }), jsx(Icon, {
49
- css: styles.paperlessIcon,
50
- name: IconNames.SCAN_QR,
51
- size: IconSize.SIZE_MEDIUM
52
- }), jsx(Typography, {
53
- css: styles.paperlessText,
54
- variant: "small",
55
- children: t("servicePoints.paperless")
56
- })]
57
- }), jsx("div", {
22
+ children: [jsx("div", {
58
23
  css: styles.getSelectedStyles(),
59
24
  children: jsx(Typography, {
60
25
  bold: true,
@@ -17,18 +17,6 @@ const styles = createStyles({
17
17
  gap: scopeTheme(theme).spacing(1),
18
18
  justifyContent: "space-between"
19
19
  }),
20
- paperlessIcon: theme => ({
21
- color: scopeTheme(theme).palette.gray[600],
22
- paddingRight: "4px"
23
- }),
24
- paperlessText: theme => ({
25
- color: scopeTheme(theme).palette.gray[600],
26
- paddingLeft: scopeTheme(theme).spacing(0.5)
27
- }),
28
- paperlessWrapper: () => ({
29
- display: "flex",
30
- marginBottom: "12px"
31
- }),
32
20
  selectButton: theme => ({
33
21
  backgroundColor: scopeTheme(theme).palette.primary.main,
34
22
  borderRadius: scopeTheme(theme).borderRadius.S,
@@ -0,0 +1 @@
1
+ export { ShipmentNotFoundError } from './shipment-not-found-error.js';
@@ -0,0 +1,38 @@
1
+ import { jsxs, jsx } from '@emotion/react/jsx-runtime';
2
+ import { Icon, IconSize, Button } from '@shipengine/giger';
3
+ import { IconNames } from '@shipengine/giger-theme';
4
+ import { useTranslation } from 'react-i18next';
5
+ import { styles } from './shipment-not-found-error.styles.js';
6
+
7
+ const ShipmentNotFoundError = ({
8
+ shipmentId,
9
+ onCreateNewShipment
10
+ }) => {
11
+ const {
12
+ t
13
+ } = useTranslation(["common", "purchase-label"]);
14
+ return jsxs("div", {
15
+ css: styles.container,
16
+ children: [jsx("div", {
17
+ css: styles.iconContainer,
18
+ children: jsx(Icon, {
19
+ name: IconNames.CANCEL,
20
+ size: IconSize.SIZE_LARGE
21
+ })
22
+ }), jsx("div", {
23
+ css: styles.message,
24
+ children: t("common:errorMessages.shipmentNotFound", {
25
+ id: shipmentId
26
+ })
27
+ }), jsx(Button, {
28
+ "data-testid": "create-new-shipment",
29
+ onClick: () => {
30
+ void (onCreateNewShipment === null || onCreateNewShipment === void 0 ? void 0 : onCreateNewShipment());
31
+ },
32
+ type: "button",
33
+ children: t("purchase-label:actions.createNewShipment")
34
+ })]
35
+ });
36
+ };
37
+
38
+ export { ShipmentNotFoundError };
@@ -0,0 +1,22 @@
1
+ import { createStyles, scopeTheme } from '../../utilities/styles.js';
2
+
3
+ const styles = createStyles({
4
+ container: {
5
+ alignItems: "center",
6
+ display: "flex",
7
+ flexDirection: "column",
8
+ height: "100%",
9
+ justifyContent: "center",
10
+ textAlign: "center",
11
+ width: "100%"
12
+ },
13
+ iconContainer: theme => ({
14
+ color: scopeTheme(theme).palette.error.main,
15
+ marginBottom: scopeTheme(theme).spacing(2)
16
+ }),
17
+ message: theme => ({
18
+ marginBottom: scopeTheme(theme).spacing(2)
19
+ })
20
+ });
21
+
22
+ export { styles };
@@ -1,12 +1,15 @@
1
1
  import { jsx } from '@emotion/react/jsx-runtime';
2
2
  import { useTranslation } from 'react-i18next';
3
+ import { ShipmentNotFoundError } from '../shipment-not-found-error/shipment-not-found-error.js';
3
4
  import { Loader } from '../loader/loader.js';
4
5
 
5
6
  const SuspendPurchase = ({
6
7
  children,
7
8
  errors,
8
9
  isLoading,
9
- data
10
+ data,
11
+ onCreateNewShipment,
12
+ shipmentId
10
13
  }) => {
11
14
  const {
12
15
  t
@@ -15,7 +18,7 @@ const SuspendPurchase = ({
15
18
  message: t("loading.shipment")
16
19
  });
17
20
  if (errors) {
18
- errors.forEach(error => {
21
+ for (const error of errors) {
19
22
  switch (error.message) {
20
23
  case "no_carriers":
21
24
  throw new Error(t("common:errorMessages.incompleteLabelPurchaseRequirements", {
@@ -31,8 +34,13 @@ const SuspendPurchase = ({
31
34
  }));
32
35
  case "label_purchased":
33
36
  throw new Error(t("common:errorMessages.labelHasBeenPurchased"));
37
+ case "shipment_not_found":
38
+ return jsx(ShipmentNotFoundError, {
39
+ onCreateNewShipment: onCreateNewShipment,
40
+ shipmentId: shipmentId
41
+ });
34
42
  }
35
- });
43
+ }
36
44
  throw new Error(errors.map(e => e.message).join(", "));
37
45
  }
38
46
  if (!data) throw new Error("errorMessages.unableToLoad.shipment");