@shipengine/elements 2.26.4 → 2.27.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 (200) hide show
  1. package/dist/cjs/assets/xcover/logo.svg.cjs +44 -0
  2. package/dist/cjs/components/field/rate-select/rate-card/rate-attribute-item/index.cjs +7 -0
  3. package/dist/cjs/components/field/rate-select/rate-card/rate-attribute-item/rate-attribute-item.cjs +56 -0
  4. package/dist/cjs/components/field/rate-select/rate-card/rate-attribute-item/rate-attribute-item.styles.cjs +27 -0
  5. package/dist/cjs/components/field/rate-select/rate-card/rate-card.cjs +52 -42
  6. package/dist/cjs/components/field/rate-select/rate-card/rate-card.styles.cjs +4 -0
  7. package/dist/cjs/components/field/rate-select/rate-select.cjs +80 -49
  8. package/dist/cjs/components/forms/register-funding-source-insurance-form/register-funding-source-insurance-form.cjs +1 -1
  9. package/dist/cjs/components/shipment-not-found-error/shipment-not-found-error.cjs +2 -17
  10. package/dist/cjs/components/suspend-purchase/suspend-purchase.cjs +3 -3
  11. package/dist/cjs/data/insurance-provider-metadatas.json.cjs +10 -4
  12. package/dist/cjs/elements/customs-form/customs-form-element.cjs +294 -0
  13. package/dist/cjs/elements/customs-form/customs-form-element.stories.cjs +243 -0
  14. package/dist/cjs/elements/customs-form/customs-form-schema.cjs +59 -0
  15. package/dist/cjs/elements/customs-form/customs-form-types.cjs +63 -0
  16. package/dist/cjs/elements/customs-form/index.cjs +10 -0
  17. package/dist/cjs/elements/index.cjs +5 -0
  18. package/dist/cjs/elements/manage-carriers/manage-carriers.cjs +1 -1
  19. package/dist/cjs/elements/purchase-label/components/customs-forms/tax-ids/tax-ids.cjs +1 -1
  20. package/dist/cjs/elements/purchase-label/components/index.cjs +2 -0
  21. package/dist/cjs/elements/purchase-label/components/rate-form/rate-view.cjs +1 -1
  22. package/dist/cjs/elements/purchase-label/components/shipment-form/shipment-form.cjs +4 -3
  23. package/dist/cjs/elements/purchase-label/hooks/use-filter-visible-rate-options/use-filter-visible-rate-options.cjs +35 -11
  24. package/dist/cjs/elements/purchase-label/hooks/use-insurance-provider-options.cjs +2 -2
  25. package/dist/cjs/elements/purchase-label/purchase-label.cjs +1 -7
  26. package/dist/cjs/factories/shipengine/address.cjs +114 -0
  27. package/dist/cjs/factories/shipengine/money.cjs +21 -0
  28. package/dist/cjs/factories/shipengine/order-source.cjs +37 -0
  29. package/dist/cjs/factories/shipengine/package.cjs +41 -0
  30. package/dist/cjs/factories/shipengine/resource.cjs +23 -0
  31. package/dist/cjs/factories/shipengine/shipment.cjs +176 -0
  32. package/dist/cjs/factories/shipengine/weight.cjs +44 -0
  33. package/dist/cjs/factories/utils.cjs +19 -0
  34. package/dist/cjs/features/manage-carriers/hooks/use-list-funding-source-carriers.cjs +4 -6
  35. package/dist/cjs/features/manage-carriers/manage-carriers.cjs +8 -6
  36. package/dist/cjs/hooks/use-configure-shipment.cjs +3 -80
  37. package/dist/cjs/hooks/use-get-funding-source-insurance-provider.cjs +7 -7
  38. package/dist/cjs/hooks/use-manage-funding-source-insurance.cjs +15 -23
  39. package/dist/cjs/index.cjs +5 -0
  40. package/dist/cjs/locales/en/common.json.cjs +2 -2
  41. package/dist/cjs/locales/en/purchase-label.json.cjs +9 -8
  42. package/dist/cjs/package.json.cjs +1 -1
  43. package/dist/cjs/utilities/feature-flags/feature-flags.cjs +1 -0
  44. package/dist/cjs/utilities/shipengine/carrier.cjs +4 -0
  45. package/dist/cjs/utilities/shipengine/index.cjs +3 -0
  46. package/dist/cjs/utilities/shipengine/insurance.cjs +63 -0
  47. package/dist/cjs/workflows/label-workflow/label-workflow.cjs +2 -26
  48. package/dist/cjs/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.cjs +9 -9
  49. package/dist/cjs/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.cjs +3 -2
  50. package/dist/cjs/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.cjs +8 -6
  51. package/dist/cjs/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.cjs +4 -19
  52. package/dist/esm/assets/xcover/logo.svg.js +23 -0
  53. package/dist/esm/components/field/rate-select/rate-card/rate-attribute-item/index.js +1 -0
  54. package/dist/esm/components/field/rate-select/rate-card/rate-attribute-item/rate-attribute-item.js +54 -0
  55. package/dist/esm/components/field/rate-select/rate-card/rate-attribute-item/rate-attribute-item.styles.js +25 -0
  56. package/dist/esm/components/field/rate-select/rate-card/rate-card.js +52 -42
  57. package/dist/esm/components/field/rate-select/rate-card/rate-card.styles.js +4 -0
  58. package/dist/esm/components/field/rate-select/rate-select.js +80 -49
  59. package/dist/esm/components/forms/register-funding-source-insurance-form/register-funding-source-insurance-form.js +1 -1
  60. package/dist/esm/components/shipment-not-found-error/shipment-not-found-error.js +2 -17
  61. package/dist/esm/components/suspend-purchase/suspend-purchase.js +3 -3
  62. package/dist/esm/data/insurance-provider-metadatas.json.js +9 -4
  63. package/dist/esm/elements/customs-form/customs-form-element.js +291 -0
  64. package/dist/esm/elements/customs-form/customs-form-element.stories.js +232 -0
  65. package/dist/esm/elements/customs-form/customs-form-schema.js +56 -0
  66. package/dist/esm/elements/customs-form/customs-form-types.js +60 -0
  67. package/dist/esm/elements/customs-form/index.js +3 -0
  68. package/dist/esm/elements/index.js +3 -0
  69. package/dist/esm/elements/manage-carriers/manage-carriers.js +1 -1
  70. package/dist/esm/elements/purchase-label/components/customs-forms/tax-ids/tax-ids.js +1 -1
  71. package/dist/esm/elements/purchase-label/components/index.js +1 -0
  72. package/dist/esm/elements/purchase-label/components/rate-form/rate-view.js +1 -1
  73. package/dist/esm/elements/purchase-label/components/shipment-form/shipment-form.js +4 -3
  74. package/dist/esm/elements/purchase-label/hooks/use-filter-visible-rate-options/use-filter-visible-rate-options.js +35 -11
  75. package/dist/esm/elements/purchase-label/hooks/use-insurance-provider-options.js +2 -2
  76. package/dist/esm/elements/purchase-label/purchase-label.js +1 -7
  77. package/dist/esm/elements-provider/elements-context-provider.js +1 -1
  78. package/dist/esm/factories/shipengine/address.js +111 -0
  79. package/dist/esm/factories/shipengine/money.js +19 -0
  80. package/dist/esm/factories/shipengine/order-source.js +34 -0
  81. package/dist/esm/factories/shipengine/package.js +39 -0
  82. package/dist/esm/factories/shipengine/resource.js +21 -0
  83. package/dist/esm/factories/shipengine/shipment.js +168 -0
  84. package/dist/esm/factories/shipengine/weight.js +40 -0
  85. package/dist/esm/factories/utils.js +15 -0
  86. package/dist/esm/features/manage-carriers/hooks/use-list-funding-source-carriers.js +5 -7
  87. package/dist/esm/features/manage-carriers/manage-carriers.js +8 -6
  88. package/dist/esm/hooks/use-configure-shipment.js +3 -80
  89. package/dist/esm/hooks/use-get-funding-source-insurance-provider.js +7 -7
  90. package/dist/esm/hooks/use-manage-funding-source-insurance.js +15 -23
  91. package/dist/esm/index.js +3 -0
  92. package/dist/esm/locales/en/common.json.js +2 -2
  93. package/dist/esm/locales/en/purchase-label.json.js +9 -8
  94. package/dist/esm/package.json.js +1 -1
  95. package/dist/esm/utilities/feature-flags/feature-flags.js +1 -0
  96. package/dist/esm/utilities/shipengine/carrier.js +4 -0
  97. package/dist/esm/utilities/shipengine/index.js +1 -1
  98. package/dist/esm/utilities/shipengine/insurance.js +61 -1
  99. package/dist/esm/workflows/label-workflow/label-workflow.js +2 -26
  100. package/dist/esm/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.js +9 -9
  101. package/dist/esm/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.js +3 -2
  102. package/dist/esm/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.js +8 -6
  103. package/dist/esm/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.js +5 -20
  104. package/dist/types/components/field/rate-select/rate-card/rate-attribute-item/index.d.ts +2 -0
  105. package/dist/types/components/field/rate-select/rate-card/rate-attribute-item/index.d.ts.map +1 -0
  106. package/dist/types/components/field/rate-select/rate-card/rate-attribute-item/rate-attribute-item.d.ts +8 -0
  107. package/dist/types/components/field/rate-select/rate-card/rate-attribute-item/rate-attribute-item.d.ts.map +1 -0
  108. package/dist/types/components/field/rate-select/rate-card/rate-attribute-item/rate-attribute-item.styles.d.ts +22 -0
  109. package/dist/types/components/field/rate-select/rate-card/rate-attribute-item/rate-attribute-item.styles.d.ts.map +1 -0
  110. package/dist/types/components/field/rate-select/rate-card/rate-card.d.ts +3 -2
  111. package/dist/types/components/field/rate-select/rate-card/rate-card.d.ts.map +1 -1
  112. package/dist/types/components/field/rate-select/rate-card/rate-card.styles.d.ts +4 -0
  113. package/dist/types/components/field/rate-select/rate-card/rate-card.styles.d.ts.map +1 -1
  114. package/dist/types/components/field/rate-select/rate-select.d.ts.map +1 -1
  115. package/dist/types/components/forms/register-funding-source-insurance-form/register-funding-source-insurance-form.d.ts.map +1 -1
  116. package/dist/types/components/shipment-not-found-error/shipment-not-found-error.d.ts +2 -3
  117. package/dist/types/components/shipment-not-found-error/shipment-not-found-error.d.ts.map +1 -1
  118. package/dist/types/components/suspend-purchase/suspend-purchase.d.ts +2 -3
  119. package/dist/types/components/suspend-purchase/suspend-purchase.d.ts.map +1 -1
  120. package/dist/types/elements/customs-form/customs-form-element.d.ts +1219 -0
  121. package/dist/types/elements/customs-form/customs-form-element.d.ts.map +1 -0
  122. package/dist/types/elements/customs-form/customs-form-element.stories.d.ts +12 -0
  123. package/dist/types/elements/customs-form/customs-form-element.stories.d.ts.map +1 -0
  124. package/dist/types/elements/customs-form/customs-form-schema.d.ts +398 -0
  125. package/dist/types/elements/customs-form/customs-form-schema.d.ts.map +1 -0
  126. package/dist/types/elements/customs-form/customs-form-types.d.ts +139 -0
  127. package/dist/types/elements/customs-form/customs-form-types.d.ts.map +1 -0
  128. package/dist/types/elements/customs-form/index.d.ts +4 -0
  129. package/dist/types/elements/customs-form/index.d.ts.map +1 -0
  130. package/dist/types/elements/index.d.ts +1 -0
  131. package/dist/types/elements/index.d.ts.map +1 -1
  132. package/dist/types/elements/labels-grid/labels-grid.d.ts +9 -8
  133. package/dist/types/elements/labels-grid/labels-grid.d.ts.map +1 -1
  134. package/dist/types/elements/manage-carriers/manage-carriers.d.ts +9 -8
  135. package/dist/types/elements/manage-carriers/manage-carriers.d.ts.map +1 -1
  136. package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts +9 -8
  137. package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts.map +1 -1
  138. package/dist/types/elements/manage-funding/manage-funding-element.d.ts +9 -8
  139. package/dist/types/elements/manage-funding/manage-funding-element.d.ts.map +1 -1
  140. package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts +9 -8
  141. package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts.map +1 -1
  142. package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts +9 -8
  143. package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts.map +1 -1
  144. package/dist/types/elements/purchase-label/components/index.d.ts +1 -0
  145. package/dist/types/elements/purchase-label/components/index.d.ts.map +1 -1
  146. package/dist/types/elements/purchase-label/components/shipment-form/shipment-form.d.ts.map +1 -1
  147. package/dist/types/elements/purchase-label/hooks/use-filter-visible-rate-options/use-filter-visible-rate-options.d.ts +5 -1
  148. package/dist/types/elements/purchase-label/hooks/use-filter-visible-rate-options/use-filter-visible-rate-options.d.ts.map +1 -1
  149. package/dist/types/elements/purchase-label/hooks/use-insurance-provider-options.d.ts.map +1 -1
  150. package/dist/types/elements/purchase-label/purchase-label.d.ts +9 -8
  151. package/dist/types/elements/purchase-label/purchase-label.d.ts.map +1 -1
  152. package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts +9 -8
  153. package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts.map +1 -1
  154. package/dist/types/elements/shipment-summary/shipment-summary.d.ts +9 -8
  155. package/dist/types/elements/shipment-summary/shipment-summary.d.ts.map +1 -1
  156. package/dist/types/elements/shipments-grid/shipments-grid.d.ts +9 -8
  157. package/dist/types/elements/shipments-grid/shipments-grid.d.ts.map +1 -1
  158. package/dist/types/elements/theme-creator/theme-creator.d.ts +9 -8
  159. package/dist/types/elements/theme-creator/theme-creator.d.ts.map +1 -1
  160. package/dist/types/elements/transaction-history/transaction-history-element.d.ts +9 -8
  161. package/dist/types/elements/transaction-history/transaction-history-element.d.ts.map +1 -1
  162. package/dist/types/elements/unit-settings/unit-settings-element.d.ts +9 -8
  163. package/dist/types/elements/unit-settings/unit-settings-element.d.ts.map +1 -1
  164. package/dist/types/elements/vat-settings/vat-settings-element.d.ts +9 -8
  165. package/dist/types/elements/vat-settings/vat-settings-element.d.ts.map +1 -1
  166. package/dist/types/elements/void-label/void-label.d.ts +9 -8
  167. package/dist/types/elements/void-label/void-label.d.ts.map +1 -1
  168. package/dist/types/features/manage-carriers/hooks/use-list-funding-source-carriers.d.ts.map +1 -1
  169. package/dist/types/features/manage-carriers/manage-carriers.d.ts.map +1 -1
  170. package/dist/types/hooks/use-configure-shipment.d.ts.map +1 -1
  171. package/dist/types/hooks/use-get-funding-source-insurance-provider.d.ts.map +1 -1
  172. package/dist/types/hooks/use-manage-funding-source-insurance.d.ts +3 -4
  173. package/dist/types/hooks/use-manage-funding-source-insurance.d.ts.map +1 -1
  174. package/dist/types/locales/en/index.d.ts +9 -8
  175. package/dist/types/locales/en/index.d.ts.map +1 -1
  176. package/dist/types/types/insurance-metadata.d.ts +1 -1
  177. package/dist/types/types/insurance-metadata.d.ts.map +1 -1
  178. package/dist/types/types/rates.d.ts +1 -0
  179. package/dist/types/types/rates.d.ts.map +1 -1
  180. package/dist/types/utilities/feature-flags/feature-flags.d.ts.map +1 -1
  181. package/dist/types/utilities/feature-flags/types.d.ts +4 -0
  182. package/dist/types/utilities/feature-flags/types.d.ts.map +1 -1
  183. package/dist/types/utilities/shipengine/carrier.d.ts.map +1 -1
  184. package/dist/types/utilities/shipengine/insurance.d.ts +31 -0
  185. package/dist/types/utilities/shipengine/insurance.d.ts.map +1 -1
  186. package/dist/types/workflows/account-settings/account-settings.d.ts +9 -8
  187. package/dist/types/workflows/account-settings/account-settings.d.ts.map +1 -1
  188. package/dist/types/workflows/carrier-services/carrier-services.d.ts +9 -8
  189. package/dist/types/workflows/carrier-services/carrier-services.d.ts.map +1 -1
  190. package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts +9 -8
  191. package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts.map +1 -1
  192. package/dist/types/workflows/label-workflow/label-workflow.d.ts +9 -8
  193. package/dist/types/workflows/label-workflow/label-workflow.d.ts.map +1 -1
  194. package/dist/types/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.d.ts.map +1 -1
  195. package/dist/types/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.d.ts.map +1 -1
  196. package/dist/types/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.d.ts +1 -5
  197. package/dist/types/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.d.ts.map +1 -1
  198. package/dist/types/workflows/onboarding/onboarding.d.ts +9 -8
  199. package/dist/types/workflows/onboarding/onboarding.d.ts.map +1 -1
  200. package/package.json +3 -3
@@ -104,7 +104,8 @@ const ShipmentForm = ({
104
104
  const {
105
105
  locale: defaultLocale,
106
106
  globalFeatures: {
107
- enableParcelGuard
107
+ enableParcelGuard,
108
+ enableXCover
108
109
  }
109
110
  } = useElements();
110
111
  const {
@@ -532,7 +533,7 @@ const ShipmentForm = ({
532
533
  }, []);
533
534
  const insuranceProviderKey = useMemo(() => {
534
535
  var _a, _b, _c;
535
- if (enableParcelGuard && !hasInsuranceToRegister) {
536
+ if ((enableParcelGuard || enableXCover) && !hasInsuranceToRegister) {
536
537
  const provider = (_a = insuranceProviderProfiles === null || insuranceProviderProfiles === void 0 ? void 0 : insuranceProviderProfiles[0]) === null || _a === void 0 ? void 0 : _a.provider;
537
538
  const fundingSourceProviderKey = getFundingSourceInsuranceProviderKey(provider);
538
539
  if (fundingSourceProviderKey) {
@@ -540,7 +541,7 @@ const ShipmentForm = ({
540
541
  }
541
542
  }
542
543
  return (_c = (_b = insuranceProviderOptions[0]) === null || _b === void 0 ? void 0 : _b.value.toUpperCase()) !== null && _c !== void 0 ? _c : "NONE";
543
- }, [enableParcelGuard, hasInsuranceToRegister, insuranceProviderOptions, insuranceProviderProfiles, getFundingSourceInsuranceProviderKey]);
544
+ }, [enableParcelGuard, enableXCover, hasInsuranceToRegister, insuranceProviderOptions, insuranceProviderProfiles, getFundingSourceInsuranceProviderKey]);
544
545
  const [registerInsuranceForm, isRegisterInsuranceFormOpen, toggleisRegisterInsuranceFormOpen] = useNestedForm(RegisterFundingSourceInsuranceForm, {
545
546
  formId: "register-funding-source-insurance-form",
546
547
  insuranceProviderProfile: insuranceProviderProfiles === null || insuranceProviderProfiles === void 0 ? void 0 : insuranceProviderProfiles[0],
@@ -1,24 +1,48 @@
1
1
  import { useMemo, useCallback } from 'react';
2
2
 
3
3
  const COLLAPSED_RATE_VIEW_LIMIT = 4;
4
- const filterRateOptions = (rateOptions, selectedRate, preferredServiceCodes) => {
5
- // Show the selected rate
6
- const isSelectedRate = option => !!(selectedRate === null || selectedRate === void 0 ? void 0 : selectedRate.rateId) && option.rateId === selectedRate.rateId;
7
- // Show the rate if it is a preferred service
8
- const isPreferredService = option => !!option.serviceCode && !!(preferredServiceCodes === null || preferredServiceCodes === void 0 ? void 0 : preferredServiceCodes.includes(option.serviceCode));
9
- // Show the first 5 rates in the list
10
- const isWithinRateViewLimit = index => index < COLLAPSED_RATE_VIEW_LIMIT;
11
- return rateOptions.filter((option, index) => isSelectedRate(option) || isPreferredService(option) || isWithinRateViewLimit(index));
4
+ const filterRateOptions = rateOptions => {
5
+ const hasRateAttributes = option => {
6
+ var _a;
7
+ return !!((_a = option.rateAttributes) === null || _a === void 0 ? void 0 : _a.length);
8
+ };
9
+ const isMediaMail = option => option.serviceCode === "usps_media_mail";
10
+ const result = [];
11
+ const ratesWithAttributes = [];
12
+ const ratesWithoutAttributes = [];
13
+ // Classify rates (excluding Media Mail from both categories)
14
+ for (const option of rateOptions) {
15
+ if (isMediaMail(option)) {
16
+ continue; // Skip Media Mail entirely - it will only show in "Show more"
17
+ }
18
+ if (hasRateAttributes(option)) {
19
+ ratesWithAttributes.push(option);
20
+ } else {
21
+ ratesWithoutAttributes.push(option);
22
+ }
23
+ }
24
+ // Add up to 3 rates with attributes
25
+ const attributedRatesToShow = ratesWithAttributes.slice(0, 3);
26
+ result.push(...attributedRatesToShow);
27
+ // Fill remaining slots up to COLLAPSED_RATE_VIEW_LIMIT (4) with regular rates
28
+ const remainingSlots = COLLAPSED_RATE_VIEW_LIMIT - result.length;
29
+ const regularRatesToShow = ratesWithoutAttributes.slice(0, remainingSlots);
30
+ result.push(...regularRatesToShow);
31
+ return result;
12
32
  };
13
33
  /**
14
34
  * @internal
15
35
  *
16
36
  * # Filter Visible Rate Options Hook
17
37
  *
38
+ * Filters rate options for the collapsed view, showing up to 4 rates:
39
+ * - Up to 3 rates with attributes (best_value, cheapest, fastest)
40
+ * - Fill remaining slots with regular rates
41
+ * - Media Mail is always excluded from the collapsed view
18
42
  */
19
- const useFilterVisibleRateOptions = (rateOptions, selectedRate, preferredServiceCodes) => {
20
- const collapsedRateOptionList = useMemo(() => filterRateOptions(rateOptions, selectedRate, preferredServiceCodes), [rateOptions, selectedRate, preferredServiceCodes]);
21
- const filterVisibleRateOptions = useCallback(options => filterRateOptions(options, selectedRate, preferredServiceCodes), [selectedRate, preferredServiceCodes]);
43
+ const useFilterVisibleRateOptions = rateOptions => {
44
+ const collapsedRateOptionList = useMemo(() => filterRateOptions(rateOptions), [rateOptions]);
45
+ const filterVisibleRateOptions = useCallback(options => filterRateOptions(options), []);
22
46
  return {
23
47
  COLLAPSED_RATE_VIEW_LIMIT,
24
48
  collapsedRateOptionList,
@@ -24,11 +24,11 @@ const useInsuranceProviderOptions = (insuranceAccount, features) => {
24
24
  refetchInsuranceAcceptedTerms
25
25
  } = useGetFundingSourceInsuranceProvider();
26
26
  const insuranceProviderOptions = useMemo(() => Object.values(SE.InsuranceProviderType).flatMap(v => {
27
- return v === "none" || v === "funding_source" || v === "parcelguard" && (v !== fundingSourceInsuranceProvider || !globalFeatures.enableParcelGuard) || v === "x_cover" && v !== fundingSourceInsuranceProvider || v === "carrier" && !(features === null || features === void 0 ? void 0 : features.includeCarrierInsurance) || v === "third_party" && !(features === null || features === void 0 ? void 0 : features.includeThirdPartyInsurance) || v === "shipsurance" && (!(insuranceAccount === null || insuranceAccount === void 0 ? void 0 : insuranceAccount.amount) || !(features === null || features === void 0 ? void 0 : features.includeShipsuranceInsurance)) ? [] : {
27
+ return v === "none" || v === "funding_source" || v === "parcelguard" && (v !== fundingSourceInsuranceProvider || !globalFeatures.enableParcelGuard) || v === "x_cover" && (v !== fundingSourceInsuranceProvider || !globalFeatures.enableXCover) || v === "carrier" && !(features === null || features === void 0 ? void 0 : features.includeCarrierInsurance) || v === "third_party" && !(features === null || features === void 0 ? void 0 : features.includeThirdPartyInsurance) || v === "shipsurance" && (!(insuranceAccount === null || insuranceAccount === void 0 ? void 0 : insuranceAccount.amount) || !(features === null || features === void 0 ? void 0 : features.includeShipsuranceInsurance)) ? [] : {
28
28
  label: t(`insuranceProviders.${humps.camelize(v)}`),
29
29
  value: v
30
30
  };
31
- }), [fundingSourceInsuranceProvider, globalFeatures.enableParcelGuard, features, insuranceAccount === null || insuranceAccount === void 0 ? void 0 : insuranceAccount.amount, t]);
31
+ }), [fundingSourceInsuranceProvider, globalFeatures.enableParcelGuard, globalFeatures.enableXCover, features, insuranceAccount === null || insuranceAccount === void 0 ? void 0 : insuranceAccount.amount, t]);
32
32
  return {
33
33
  fundingSourceInsuranceProvider,
34
34
  insuranceProviderOptions,
@@ -90,15 +90,9 @@ const Component = _a => {
90
90
  return jsx(SuspendPurchase, {
91
91
  data: shipment || salesOrder,
92
92
  errors: errors,
93
- identifier: {
94
- externalOrderId,
95
- externalOrderNumber,
96
- externalShipmentId,
97
- salesOrderId,
98
- shipmentId
99
- },
100
93
  isLoading: isLoading || insuranceIsLoading,
101
94
  onCreateNewShipment: createNewShipmentForNotFound,
95
+ shipmentId: shipmentId,
102
96
  children: jsx(ConfigureShipment, Object.assign({
103
97
  currency: currency,
104
98
  features: features,
@@ -1,5 +1,5 @@
1
1
  import { jsx } from '@emotion/react/jsx-runtime';
2
- import { createContext, useContext } from 'react';
2
+ import { useContext, createContext } from 'react';
3
3
  import { getDefaultFeatures, deepMergeFeatures } from '../utilities/feature-flags/feature-flags.js';
4
4
 
5
5
  const DEFAULT_LOCALE = "en-US";
@@ -0,0 +1,111 @@
1
+ import { faker } from '@faker-js/faker';
2
+ import { Factory } from 'fishery';
3
+
4
+ /**
5
+ * @category Factories
6
+ */
7
+ const addressFactory = Factory.define(({
8
+ params,
9
+ transientParams
10
+ }) => {
11
+ var _a, _b, _c, _d;
12
+ const addressLine2 = (_a = params.addressLine2) !== null && _a !== void 0 ? _a : faker.helpers.maybe(() => faker.address.secondaryAddress(), {
13
+ probability: 0.25
14
+ });
15
+ const addressLine3 = (_b = params.addressLine3) !== null && _b !== void 0 ? _b : addressLine2 && faker.helpers.maybe(() => faker.address.secondaryAddress());
16
+ let countryCode = (_c = params.countryCode) !== null && _c !== void 0 ? _c : "US";
17
+ // Random country code could still be US
18
+ while (transientParams.isInternational && countryCode === "US") {
19
+ countryCode = faker.address.countryCode();
20
+ }
21
+ const stateProvince = (_d = params.stateProvince) !== null && _d !== void 0 ? _d : faker.address.stateAbbr();
22
+ return {
23
+ addressLine1: faker.address.streetAddress(),
24
+ addressLine2,
25
+ addressLine3,
26
+ addressResidentialIndicator: faker.helpers.maybe(() => faker.helpers.arrayElement(["yes", "no"])),
27
+ cityLocality: faker.address.city(),
28
+ companyName: faker.helpers.maybe(() => faker.company.name()),
29
+ countryCode,
30
+ name: faker.name.fullName(),
31
+ phone: faker.phone.number(),
32
+ postalCode: faker.address.zipCodeByState(stateProvince),
33
+ stateProvince
34
+ };
35
+ });
36
+ /**
37
+ * @category Factories
38
+ */
39
+ const addressValidationFactory = Factory.define(({
40
+ associations,
41
+ params
42
+ }) => {
43
+ var _a, _b;
44
+ const status = params.status || faker.helpers.arrayElement(["unverified", "verified", "warning", "error"]);
45
+ return {
46
+ matchedAddress: (_a = associations.matchedAddress) !== null && _a !== void 0 ? _a : faker.helpers.maybe(() => addressFactory.build(), {
47
+ probability: ["verified", "error"].includes(status) ? 0 : 0.8
48
+ }),
49
+ messages: [],
50
+ originalAddress: (_b = associations.originalAddress) !== null && _b !== void 0 ? _b : addressFactory.build(),
51
+ status
52
+ };
53
+ });
54
+ /**
55
+ * Mock the addressValidation object used to hyrdate address valiation feature
56
+ * on the shipment form.
57
+ * @category Factory
58
+ */
59
+ Factory.define(({
60
+ params
61
+ }) => {
62
+ const addressValidation = addressValidationFactory.build({
63
+ status: params.status
64
+ }, {
65
+ associations: {
66
+ matchedAddress: addressFactory.build()
67
+ }
68
+ });
69
+ if (!addressValidation.matchedAddress) throw new Error("addressPreferenceFactory did not generate a matchedAddress");
70
+ return Object.assign(Object.assign({}, addressValidation), {
71
+ alternative: addressValidation.originalAddress,
72
+ alternativeSource: "originalAddress",
73
+ isModified: true,
74
+ selection: addressValidation.matchedAddress,
75
+ selectionSource: "matchedAddress",
76
+ toggle: () => addressFactory.build()
77
+ });
78
+ });
79
+ /**
80
+ * Mock the addressValidationPreference object used to hyrdate the address valiation feature
81
+ * used for warehouse management and onboarding.
82
+ * @category Factory
83
+ */
84
+ Factory.define(() => {
85
+ const addressValidation = addressValidationFactory.build();
86
+ const address = addressFactory.build();
87
+ const validationType = faker.helpers.arrayElement(["EXACT", "SOFT", "SUGGESTED", "ERROR"]);
88
+ switch (validationType) {
89
+ case "EXACT":
90
+ case "SOFT":
91
+ return {
92
+ address: address,
93
+ validationType: faker.helpers.arrayElement(["EXACT", "SOFT"])
94
+ };
95
+ case "SUGGESTED":
96
+ case "ERROR":
97
+ return {
98
+ validation: addressValidation,
99
+ validationType: faker.helpers.arrayElement(["SUGGESTED", "ERROR"])
100
+ };
101
+ default:
102
+ {
103
+ return {
104
+ validation: addressValidation,
105
+ validationType: "ERROR"
106
+ };
107
+ }
108
+ }
109
+ });
110
+
111
+ export { addressFactory, addressValidationFactory };
@@ -0,0 +1,19 @@
1
+ import { faker } from '@faker-js/faker';
2
+ import { SE } from '@shipengine/react-api';
3
+ import { Factory } from 'fishery';
4
+
5
+ /**
6
+ * @category Factories
7
+ */
8
+ const moneyFactory = Factory.define(({
9
+ transientParams
10
+ }) => ({
11
+ amount: faker.datatype.number({
12
+ max: 1000,
13
+ min: 5,
14
+ precision: 0.01
15
+ }),
16
+ currency: (transientParams === null || transientParams === void 0 ? void 0 : transientParams.isInternational) ? faker.helpers.arrayElement(Object.values(SE.Currency)) : SE.Currency.USD
17
+ }));
18
+
19
+ export { moneyFactory };
@@ -0,0 +1,34 @@
1
+ import { faker } from '@faker-js/faker';
2
+ import { Factory } from 'fishery';
3
+
4
+ const randomOrderSourceCode = () => faker.helpers.arrayElement(["3dcart", "abantecart", "acumatica", "acumatica_v2", "alibaba", "amazon", "amazon_au", "amazon_ca", "amazon_de", "amazon_es", "amazon_fr", "amazon_it", "amazon_jp", "amazon_mx", "amazon_uk", "americommerce", "auctane-orders", "back-market", "bandcamp", "big_cartel", "bigcommerce", "bigcommerce_v3", "bigcommerce_v2", "bizelo", "bluepark", "bonanza", "brightpearl", "cdiscount", "celery", "channeladvisor", "channelsale", "choxi", "cin7", "commerceinterface", "corecommerce", "coupang", "cratejoy", "cs-cart", "custom_store", "dear_systems", "dummy-marketplace", "ebay", "ebay_au", "ebay_ca", "ebay_uk", "ebay_fr", "ebay_v2", "ecwid", "ecwid_v1", "edesk", "ekm", "etsy", "facebook", "fnac", "foxycart", "freestyle", "fullscreen_direct", "geekseller", "goodsie", "google", "google_checkout", "gorgias", "groopdealz", "groupon_goods", "handshake", "hatch", "highwire", "homeroots", "houzz", "idealo_de", "inksoft", "jane", "jet", "kaufland", "labelapi", "lemonstand", "lengow", "liftoff", "linnworks", "listingmirror", "magento", "zoey", "magento_go", "memberly", "mercado_libre", "mijoshop", "best_buy_ca", "catch", "darty", "fanatics", "kohls", "kroger", "urbn", "miva_merchant", "morecommerce", "mozu", "neto", "newegg", "newegg_business", "newegg_ca", "notonthehighstreet", "oauth_dummy", "odbc", "onbuy", "opencart", "order_time", "ordersource_api", "oscommerce", "overstock", "oxatis", "paypal", "paypal_v2", "payvment", "penny", "prestashop", "rakuten", "best_buy", "rakuten-fr", "rate_browser", "redditgifts", "reverb", "revolutionparts", "salesforce_commerce_cloud", "salesforce_core", "sap_anywhere", "scout_topshelf", "sears", "securestore", "sellbrite", "selleractive", "shipengine_api", "shipengine_merchant", "shipstation", "shop_premium_outlets", "shopify", "shoppingfeed", "shopware_de", "simplepart", "skuvault", "soldsie", "sophio", "spark_shipping", "spree", "spreesy", "square", "squarespace", "stitch_labs", "storenvy", "stripe", "suredone", "tanga", "tophatter", "trade_me", "tradegecko", "ultracart", "unbranded_ecommerce_store", "unleashed", "vault", "visualsoft", "volo", "volusion", "vtex", "walmart", "walmart_ca", "wayfair", "webflow", "weebly", "wish", "wix", "woocommerce", "woocommerce_v2", "woot", "x-cart", "yahoo", "sec_yumbles", "zen_cart", "zonos"]);
5
+ /**
6
+ * @category Factories
7
+ */
8
+ const orderSourceRefreshInfoFactory = Factory.define(() => {
9
+ const lastRefreshAttempt = faker.date.recent();
10
+ return {
11
+ lastRefreshAttempt: lastRefreshAttempt.toISOString(),
12
+ refreshDate: faker.date.recent(1, lastRefreshAttempt).toISOString(),
13
+ status: faker.helpers.arrayElement(["idle", "preparing_update", "updating", "error", "unknown"])
14
+ };
15
+ });
16
+ /**
17
+ * @category Factories
18
+ */
19
+ Factory.define(({
20
+ associations,
21
+ params
22
+ }) => {
23
+ var _a;
24
+ return {
25
+ active: faker.datatype.boolean(),
26
+ orderSourceCode: randomOrderSourceCode(),
27
+ orderSourceFriendlyName: faker.company.name(),
28
+ orderSourceId: faker.datatype.uuid(),
29
+ orderSourceNickname: faker.random.words(),
30
+ refreshInfo: (_a = associations.refreshInfo) !== null && _a !== void 0 ? _a : orderSourceRefreshInfoFactory.build(params.refreshInfo)
31
+ };
32
+ });
33
+
34
+ export { orderSourceRefreshInfoFactory, randomOrderSourceCode };
@@ -0,0 +1,39 @@
1
+ import { faker } from '@faker-js/faker';
2
+ import { Factory } from 'fishery';
3
+ import { randomShipengineSlug } from '../utils.js';
4
+
5
+ /**
6
+ * @internal
7
+ *
8
+ * # Package Factory
9
+ *
10
+ * @category Factories
11
+ */
12
+ const packageFactory = Factory.define(({
13
+ transientParams
14
+ }) => ({
15
+ description: faker.lorem.sentence(),
16
+ dimensions: (transientParams === null || transientParams === void 0 ? void 0 : transientParams.noDimensions) ? undefined : {
17
+ height: faker.datatype.number({
18
+ max: 50,
19
+ min: 1,
20
+ precision: 0.1
21
+ }),
22
+ length: faker.datatype.number({
23
+ max: 50,
24
+ min: 1,
25
+ precision: 0.1
26
+ }),
27
+ unit: faker.helpers.arrayElement(["inch", "centimeter"]),
28
+ width: faker.datatype.number({
29
+ max: 50,
30
+ min: 1,
31
+ precision: 0.1
32
+ })
33
+ },
34
+ name: faker.random.words(),
35
+ packageCode: randomShipengineSlug(2),
36
+ packageId: randomShipengineSlug(3)
37
+ }));
38
+
39
+ export { packageFactory };
@@ -0,0 +1,21 @@
1
+ import { faker } from '@faker-js/faker';
2
+ import { Factory } from 'fishery';
3
+
4
+ /**
5
+ * @category Factories
6
+ */
7
+ const downloadFactory = Factory.define(() => ({
8
+ href: faker.internet.url(),
9
+ pdf: faker.internet.url(),
10
+ png: faker.internet.url(),
11
+ zpl: faker.internet.url()
12
+ }));
13
+ /**
14
+ * @category Factories
15
+ */
16
+ Factory.define(() => ({
17
+ href: faker.internet.url(),
18
+ type: faker.word.noun()
19
+ }));
20
+
21
+ export { downloadFactory };
@@ -0,0 +1,168 @@
1
+ import { __rest } from '../../_virtual/_tslib.js';
2
+ import { faker } from '@faker-js/faker';
3
+ import { SE } from '@shipengine/react-api';
4
+ import { Factory } from 'fishery';
5
+ import { randomShipengineSlug, randomShipengineId, tristateValue } from '../utils.js';
6
+ import { addressFactory, addressValidationFactory } from './address.js';
7
+ import { moneyFactory } from './money.js';
8
+ import { randomOrderSourceCode } from './order-source.js';
9
+ import { packageFactory } from './package.js';
10
+ import { downloadFactory } from './resource.js';
11
+ import { weightWithUnitFactory } from './weight.js';
12
+
13
+ const randomDeliveryConfirmation = () => faker.helpers.arrayElement(Object.values(SE.ConfirmationType));
14
+ const randomInsuranceProvider = (allowNone = true) => {
15
+ const availableProviders = Object.values(SE.InsuranceProviderType).filter(p => allowNone ? p : p !== "none");
16
+ return faker.helpers.arrayElement(availableProviders);
17
+ };
18
+ /**
19
+ * @category Factories
20
+ */
21
+ const productFactory = Factory.define(() => ({
22
+ countryOfOrigin: faker.address.countryCode(),
23
+ description: faker.commerce.productName(),
24
+ harmonizedTariffCode: faker.datatype.string(),
25
+ quantity: faker.datatype.number({
26
+ max: 10,
27
+ min: 1
28
+ }),
29
+ sku: faker.random.numeric(10),
30
+ skuDescription: faker.helpers.maybe(() => faker.lorem.sentence()),
31
+ unitOfMeasure: faker.helpers.maybe(() => faker.word.noun()),
32
+ value: moneyFactory.build()
33
+ }));
34
+ /**
35
+ * @category Factories
36
+ */
37
+ const shipmentItemFactory = Factory.define(({
38
+ params
39
+ }) => ({
40
+ asin: faker.helpers.maybe(() => faker.random.alphaNumeric(10)),
41
+ externalOrderId: faker.random.alphaNumeric(10),
42
+ externalOrderItemId: faker.random.alphaNumeric(10),
43
+ name: faker.commerce.productName(),
44
+ orderSourceCode: randomOrderSourceCode(),
45
+ quantity: faker.datatype.number({
46
+ max: 10,
47
+ min: 1
48
+ }),
49
+ salesOrderItemId: params.salesOrderId && faker.random.alphaNumeric(6),
50
+ sku: faker.random.numeric(10)
51
+ }));
52
+ /**
53
+ * @category Factories
54
+ */
55
+ const shipmentPackageFactory = Factory.define(({
56
+ associations,
57
+ params,
58
+ transientParams
59
+ }) => {
60
+ var _a, _b, _c, _d, _e;
61
+ const _f = packageFactory.build(params),
62
+ pkg = __rest(_f, ["name"]);
63
+ const isInsured = tristateValue(true, false, faker.datatype.boolean(), (_b = (_a = params.insuredValue) === null || _a === void 0 ? void 0 : _a.amount) !== null && _b !== void 0 ? _b : transientParams.isInsured);
64
+ return Object.assign(Object.assign({}, pkg), {
65
+ insuredValue: (_c = associations.insuredValue) !== null && _c !== void 0 ? _c : isInsured ? moneyFactory.build(params.insuredValue) : undefined,
66
+ labelDownload: (_d = associations.labelDownload) !== null && _d !== void 0 ? _d : transientParams.isShipped ? downloadFactory.build(params.labelDownload) : undefined,
67
+ labelMessages: associations.labelMessages,
68
+ products: transientParams.isInternational ? productFactory.buildList(1) : [],
69
+ trackingNumber: transientParams.isShipped ? faker.random.alphaNumeric(12, {
70
+ casing: "upper"
71
+ }) : undefined,
72
+ weight: (_e = associations.weight) !== null && _e !== void 0 ? _e : weightWithUnitFactory.build(params.weight)
73
+ });
74
+ });
75
+ /**
76
+ * @category Factories
77
+ */
78
+ const shipmentFactory = Factory.define(({
79
+ associations,
80
+ params,
81
+ sequence,
82
+ transientParams
83
+ }) => {
84
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
85
+ const shipTo = (_a = associations.shipTo) !== null && _a !== void 0 ? _a : addressFactory.build(params.shipTo, {
86
+ transient: {
87
+ isInternational: transientParams.isInternational
88
+ }
89
+ });
90
+ let insuranceProvider = SE.InsuranceProviderType.NONE;
91
+ if (transientParams.insuredValue || transientParams.isInsured) {
92
+ insuranceProvider = (_b = params.insuranceProvider) !== null && _b !== void 0 ? _b : randomInsuranceProvider(false);
93
+ } else if (transientParams.insuredValue === undefined && transientParams.isInsured === undefined) {
94
+ insuranceProvider = randomInsuranceProvider(true);
95
+ }
96
+ const shipDateObj = faker.date.soon(7);
97
+ shipDateObj.setHours(0, 0, 0, 0);
98
+ const totalWeight = (_c = associations.totalWeight) !== null && _c !== void 0 ? _c : weightWithUnitFactory.build(params.totalWeight);
99
+ return {
100
+ addressValidation: (_d = associations.addressValidation) !== null && _d !== void 0 ? _d : addressValidationFactory.build(params.addressValidation, {
101
+ associations: {
102
+ originalAddress: shipTo
103
+ }
104
+ }),
105
+ amountPaid: moneyFactory.build(),
106
+ carrierId: (_f = (_e = transientParams === null || transientParams === void 0 ? void 0 : transientParams.service) === null || _e === void 0 ? void 0 : _e.carrierId) !== null && _f !== void 0 ? _f : randomShipengineId(),
107
+ confirmation: randomDeliveryConfirmation(),
108
+ createdAt: faker.date.past().toISOString(),
109
+ customs: (_g = associations.customs) !== null && _g !== void 0 ? _g : transientParams.isInternational ? {
110
+ contents: faker.helpers.arrayElement(["documents", "gift", "merchandise", "returned_goods", "sample"]),
111
+ nonDelivery: faker.helpers.arrayElement(["return_to_sender", "treat_as_abandoned"])
112
+ } : undefined,
113
+ externalOrderId: faker.random.alphaNumeric(10),
114
+ externalShipmentId: faker.random.alphaNumeric(10),
115
+ insuranceProvider,
116
+ items: shipmentItemFactory.buildList(faker.datatype.number({
117
+ max: 10,
118
+ min: 1
119
+ }), transientParams.salesOrder ? {
120
+ externalOrderId: transientParams.salesOrder.externalOrderId,
121
+ orderSourceCode: transientParams.salesOrder.orderSource.orderSourceCode,
122
+ salesOrderId: (_h = transientParams.salesOrder) === null || _h === void 0 ? void 0 : _h.salesOrderId
123
+ } : {}),
124
+ modifiedAt: faker.date.recent().toISOString(),
125
+ orderSourceCode: (_k = (_j = transientParams.salesOrder) === null || _j === void 0 ? void 0 : _j.orderSource.orderSourceCode) !== null && _k !== void 0 ? _k : randomOrderSourceCode(),
126
+ packages: (_l = associations.packages) !== null && _l !== void 0 ? _l : shipmentPackageFactory.buildList(1, (_m = params.packages) === null || _m === void 0 ? void 0 : _m[0], {
127
+ associations: {
128
+ weight: totalWeight
129
+ },
130
+ transient: {
131
+ isInsured: insuranceProvider !== "none",
132
+ isInternational: transientParams.isInternational,
133
+ isShipped: transientParams.isShipped
134
+ }
135
+ }),
136
+ returnTo: (_q = (_o = associations.returnTo) !== null && _o !== void 0 ? _o : (_p = transientParams.warehouse) === null || _p === void 0 ? void 0 : _p.returnAddress) !== null && _q !== void 0 ? _q : addressFactory.build(),
137
+ serviceCode: (_s = (_r = transientParams.service) === null || _r === void 0 ? void 0 : _r.serviceCode) !== null && _s !== void 0 ? _s : randomShipengineSlug(),
138
+ shipDate: shipDateObj.toISOString(),
139
+ shipFrom: (_v = (_t = associations.shipFrom) !== null && _t !== void 0 ? _t : (_u = transientParams.warehouse) === null || _u === void 0 ? void 0 : _u.originAddress) !== null && _v !== void 0 ? _v : addressFactory.build(),
140
+ shipmentId: `se-${30000 + sequence}`,
141
+ shipmentStatus: transientParams.isShipped ? "label_purchased" : "pending",
142
+ shippingPaid: moneyFactory.build(),
143
+ shipTo,
144
+ tags: (_w = associations.tags) !== null && _w !== void 0 ? _w : [],
145
+ taxPaid: moneyFactory.build(),
146
+ totalWeight,
147
+ warehouseId: (_x = transientParams.warehouse) === null || _x === void 0 ? void 0 : _x.warehouseId
148
+ };
149
+ });
150
+ /**
151
+ * @category Factories
152
+ */
153
+ const salesOrderShipmentFactory = Factory.define(({
154
+ associations,
155
+ params,
156
+ transientParams
157
+ }) => {
158
+ var _a, _b, _c;
159
+ const shipment = shipmentFactory.build(params, {
160
+ associations,
161
+ transient: transientParams
162
+ });
163
+ return Object.assign(Object.assign({}, shipment), {
164
+ salesOrderIds: (_a = associations.salesOrderIds) !== null && _a !== void 0 ? _a : [(_c = (_b = transientParams.salesOrder) === null || _b === void 0 ? void 0 : _b.salesOrderId) !== null && _c !== void 0 ? _c : faker.datatype.uuid()]
165
+ });
166
+ });
167
+
168
+ export { productFactory, randomDeliveryConfirmation, randomInsuranceProvider, salesOrderShipmentFactory, shipmentFactory, shipmentItemFactory, shipmentPackageFactory };
@@ -0,0 +1,40 @@
1
+ import { faker } from '@faker-js/faker';
2
+ import { Factory } from 'fishery';
3
+
4
+ const randomWeightUnit = () => faker.helpers.arrayElement(["pound", "ounce", "gram", "kilogram"]);
5
+ /**
6
+ * @category Factories
7
+ */
8
+ Factory.define(() => ({
9
+ fractional: faker.datatype.number({
10
+ max: 16,
11
+ min: 0
12
+ }),
13
+ whole: faker.datatype.number({
14
+ max: 20,
15
+ min: 0
16
+ })
17
+ }));
18
+ /**
19
+ * @category Factories
20
+ */
21
+ const weightFactory = Factory.define(() => ({
22
+ value: faker.datatype.number({
23
+ max: 20,
24
+ min: 1,
25
+ precision: 0.1
26
+ })
27
+ }));
28
+ /**
29
+ * @category Factories
30
+ */
31
+ const weightWithUnitFactory = Factory.define(({
32
+ params
33
+ }) => {
34
+ const weight = weightFactory.build(params);
35
+ return Object.assign(Object.assign({}, weight), {
36
+ unit: randomWeightUnit()
37
+ });
38
+ });
39
+
40
+ export { randomWeightUnit, weightFactory, weightWithUnitFactory };
@@ -0,0 +1,15 @@
1
+ import { faker } from '@faker-js/faker';
2
+
3
+ const randomShipengineId = (length = 5) => `se-${faker.random.numeric(length)}`;
4
+ const randomShipengineSlug = wordCount => faker.lorem.slug(wordCount).replace("-", "_");
5
+ const tristateValue = (ifTrue, ifFalse, ifUndefined, value) => {
6
+ if (value === undefined) {
7
+ return ifUndefined;
8
+ }
9
+ if (value) {
10
+ return ifTrue;
11
+ }
12
+ return ifFalse;
13
+ };
14
+
15
+ export { randomShipengineId, randomShipengineSlug, tristateValue };
@@ -1,6 +1,6 @@
1
1
  import { useListCarriers, useGetFundingSourceMetadata, useGetInsuranceFundingSourceAcceptedTerms } from '@shipengine/react-api';
2
2
  import { filterFundingSourceCarriers } from '../../../utilities/shipengine/carrier.js';
3
- import { getIsInsuraceProviderAccepted, getInsuranceProviderWithFriendlyName } from '../../../utilities/shipengine/insurance.js';
3
+ import { groupTermsByProvider, getIsInsuraceProviderAccepted } from '../../../utilities/shipengine/insurance.js';
4
4
  import { useMemo } from 'react';
5
5
  import { useCarrierMetadata } from './use-carrier-metadata.js';
6
6
 
@@ -36,12 +36,10 @@ const useListFundingSourceCarriers = () => {
36
36
  //TODO: Remove hardcoded carrierMetadata and insuranceProviderMetadata when the friendlyName is available in the funding source metadata response
37
37
  const carrierMetadata = useCarrierMetadata();
38
38
  const insuranceProviderProfiles = useMemo(() => {
39
- return optionalTerms.map(t => {
40
- return Object.assign({
41
- agreedToTerms: getIsInsuraceProviderAccepted(t.termType, insuranceProviderAcceptedTerms === null || insuranceProviderAcceptedTerms === void 0 ? void 0 : insuranceProviderAcceptedTerms.acceptedTerms),
42
- terms: Object.assign({}, t)
43
- }, getInsuranceProviderWithFriendlyName(t.termType));
44
- });
39
+ const groupedProfiles = groupTermsByProvider(optionalTerms);
40
+ return groupedProfiles.map(profile => Object.assign(Object.assign({}, profile), {
41
+ agreedToTerms: profile.terms.some(term => getIsInsuraceProviderAccepted(term.termType, insuranceProviderAcceptedTerms === null || insuranceProviderAcceptedTerms === void 0 ? void 0 : insuranceProviderAcceptedTerms.acceptedTerms))
42
+ }));
45
43
  }, [optionalTerms, insuranceProviderAcceptedTerms]);
46
44
  const normalizeCarrierCode = (carrierCode, nickname) => carrierCode === "usps" || (nickname === null || nickname === void 0 ? void 0 : nickname.includes("free")) ? "stamps_com" : carrierCode;
47
45
  const normalizeConnectedCarrierCodes = new Set(connectedCarriers === null || connectedCarriers === void 0 ? void 0 : connectedCarriers.map(c => normalizeCarrierCode(c.carrierCode, c.nickname)));