@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.
- package/README.md +187 -6
- package/dist/cjs/components/field/credit-card-input/credit-card-input.cjs +46 -29
- package/dist/cjs/components/field/rate-select/rate-card/rate-card.cjs +29 -5
- package/dist/cjs/components/field/rate-select/rate-card/rate-card.styles.cjs +8 -3
- package/dist/cjs/components/field/rate-select/rate-select.cjs +26 -5
- package/dist/cjs/components/forms/address-form/address-form-schema.cjs +3 -3
- package/dist/cjs/components/forms/edit-billing-form/edit-billing-form.cjs +57 -4
- package/dist/cjs/components/service-card/service-card.cjs +4 -4
- package/dist/cjs/components/service-card/service-card.styles.cjs +5 -2
- package/dist/cjs/components/service-point-display/service-point-display.cjs +1 -36
- package/dist/cjs/components/service-point-display/service-point-display.styles.cjs +0 -12
- package/dist/cjs/components/shipment-not-found-error/index.cjs +7 -0
- package/dist/cjs/components/shipment-not-found-error/shipment-not-found-error.cjs +40 -0
- package/dist/cjs/components/shipment-not-found-error/shipment-not-found-error.styles.cjs +24 -0
- package/dist/cjs/components/suspend-purchase/suspend-purchase.cjs +11 -3
- package/dist/cjs/elements/purchase-label/components/rate-form/rate-form.cjs +13 -3
- package/dist/cjs/elements/purchase-label/components/rate-form/rate-schema.cjs +7 -2
- package/dist/cjs/elements/purchase-label/components/rate-form/rate-view.cjs +2 -0
- package/dist/cjs/elements/purchase-label/hooks/use-rate-options.cjs +31 -2
- package/dist/cjs/elements/purchase-label/hooks/use-rates-form.cjs +14 -18
- package/dist/cjs/elements/purchase-label/hooks/use-request-rates.cjs +20 -20
- package/dist/cjs/elements/purchase-label/purchase-label.cjs +4 -1
- package/dist/cjs/elements/shipment-summary/components/label-display/label-card.cjs +16 -31
- package/dist/cjs/elements/shipment-summary/components/label-display/label-card.styles.cjs +0 -19
- package/dist/cjs/elements/shipment-summary/components/label-display/paperless-label-display.cjs +54 -0
- package/dist/cjs/elements/shipment-summary/components/label-display/paperless-label-display.styles.cjs +27 -0
- package/dist/cjs/features/payment-method-settings/payment-method-settings.cjs +56 -18
- package/dist/cjs/hooks/use-configure-shipment.cjs +32 -11
- package/dist/cjs/hooks/use-helpers.cjs +4 -1
- package/dist/cjs/index.cjs +15 -12
- package/dist/cjs/locales/en/account-settings.json.cjs +6 -0
- package/dist/cjs/locales/en/common.json.cjs +2 -0
- package/dist/cjs/locales/en/purchase-label.json.cjs +5 -3
- package/dist/cjs/package.json.cjs +1 -1
- package/dist/cjs/utilities/address.cjs +29 -0
- package/dist/cjs/utilities/index.cjs +3 -0
- package/dist/cjs/utilities/money.cjs +14 -0
- package/dist/cjs/utilities/rate-warning-messages.cjs +25 -0
- package/dist/cjs/utilities/shipengine/warehouses.cjs +2 -1
- package/dist/cjs/workflows/connect-external-carrier/connect-external-carrier.cjs +7 -3
- package/dist/cjs/workflows/label-workflow/label-workflow.cjs +11 -3
- package/dist/cjs/workflows/onboarding/components/confirmation-and-submission-step/confirmation-and-submission-step.cjs +1 -1
- package/dist/cjs/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.cjs +17 -1
- package/dist/cjs/workflows/onboarding/components/onboarding-wizard/onboarding-wizard.cjs +4 -1
- package/dist/cjs/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.cjs +4 -1
- package/dist/cjs/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.cjs +14 -3
- package/dist/cjs/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.cjs +12 -12
- package/dist/esm/components/field/credit-card-input/credit-card-input.js +47 -30
- package/dist/esm/components/field/rate-select/rate-card/rate-card.js +30 -6
- package/dist/esm/components/field/rate-select/rate-card/rate-card.styles.js +8 -3
- package/dist/esm/components/field/rate-select/rate-select.js +26 -5
- package/dist/esm/components/forms/address-form/address-form-schema.js +3 -3
- package/dist/esm/components/forms/edit-billing-form/edit-billing-form.js +58 -5
- package/dist/esm/components/service-card/service-card.js +4 -4
- package/dist/esm/components/service-card/service-card.styles.js +5 -2
- package/dist/esm/components/service-point-display/service-point-display.js +2 -37
- package/dist/esm/components/service-point-display/service-point-display.styles.js +0 -12
- package/dist/esm/components/shipment-not-found-error/index.js +1 -0
- package/dist/esm/components/shipment-not-found-error/shipment-not-found-error.js +38 -0
- package/dist/esm/components/shipment-not-found-error/shipment-not-found-error.styles.js +22 -0
- package/dist/esm/components/suspend-purchase/suspend-purchase.js +11 -3
- package/dist/esm/elements/purchase-label/components/rate-form/rate-form.js +14 -4
- package/dist/esm/elements/purchase-label/components/rate-form/rate-schema.js +7 -2
- package/dist/esm/elements/purchase-label/components/rate-form/rate-view.js +2 -0
- package/dist/esm/elements/purchase-label/hooks/use-rate-options.js +31 -2
- package/dist/esm/elements/purchase-label/hooks/use-rates-form.js +14 -18
- package/dist/esm/elements/purchase-label/hooks/use-request-rates.js +20 -20
- package/dist/esm/elements/purchase-label/purchase-label.js +4 -1
- package/dist/esm/elements/shipment-summary/components/label-display/label-card.js +18 -33
- package/dist/esm/elements/shipment-summary/components/label-display/label-card.styles.js +0 -19
- package/dist/esm/elements/shipment-summary/components/label-display/paperless-label-display.js +52 -0
- package/dist/esm/elements/shipment-summary/components/label-display/paperless-label-display.styles.js +25 -0
- package/dist/esm/features/payment-method-settings/payment-method-settings.js +57 -19
- package/dist/esm/hooks/use-configure-shipment.js +33 -12
- package/dist/esm/hooks/use-helpers.js +4 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/locales/en/account-settings.json.js +6 -0
- package/dist/esm/locales/en/common.json.js +2 -0
- package/dist/esm/locales/en/purchase-label.json.js +5 -3
- package/dist/esm/package.json.js +1 -1
- package/dist/esm/utilities/address.js +26 -0
- package/dist/esm/utilities/index.js +1 -0
- package/dist/esm/utilities/money.js +14 -1
- package/dist/esm/utilities/rate-warning-messages.js +23 -0
- package/dist/esm/utilities/shipengine/warehouses.js +2 -1
- package/dist/esm/workflows/connect-external-carrier/connect-external-carrier.js +7 -3
- package/dist/esm/workflows/label-workflow/label-workflow.js +11 -3
- package/dist/esm/workflows/onboarding/components/confirmation-and-submission-step/confirmation-and-submission-step.js +1 -1
- package/dist/esm/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.js +17 -1
- package/dist/esm/workflows/onboarding/components/onboarding-wizard/onboarding-wizard.js +4 -1
- package/dist/esm/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.js +4 -1
- package/dist/esm/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.js +14 -3
- package/dist/esm/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.js +12 -12
- package/dist/types/components/field/credit-card-input/credit-card-input.d.ts.map +1 -1
- package/dist/types/components/field/rate-select/rate-card/rate-card.d.ts +4 -2
- package/dist/types/components/field/rate-select/rate-card/rate-card.d.ts.map +1 -1
- package/dist/types/components/field/rate-select/rate-card/rate-card.styles.d.ts +7 -2
- package/dist/types/components/field/rate-select/rate-card/rate-card.styles.d.ts.map +1 -1
- package/dist/types/components/field/rate-select/rate-select.d.ts +1 -0
- package/dist/types/components/field/rate-select/rate-select.d.ts.map +1 -1
- package/dist/types/components/forms/address-form/address-form-schema.d.ts.map +1 -1
- package/dist/types/components/forms/edit-billing-form/edit-billing-form.d.ts +2 -1
- package/dist/types/components/forms/edit-billing-form/edit-billing-form.d.ts.map +1 -1
- package/dist/types/components/service-card/service-card.d.ts +1 -1
- package/dist/types/components/service-card/service-card.d.ts.map +1 -1
- package/dist/types/components/service-card/service-card.styles.d.ts +4 -1
- package/dist/types/components/service-card/service-card.styles.d.ts.map +1 -1
- package/dist/types/components/service-point-display/service-point-display.d.ts.map +1 -1
- package/dist/types/components/service-point-display/service-point-display.styles.d.ts +0 -12
- package/dist/types/components/service-point-display/service-point-display.styles.d.ts.map +1 -1
- package/dist/types/components/shipment-not-found-error/index.d.ts +2 -0
- package/dist/types/components/shipment-not-found-error/index.d.ts.map +1 -0
- package/dist/types/components/shipment-not-found-error/shipment-not-found-error.d.ts +6 -0
- package/dist/types/components/shipment-not-found-error/shipment-not-found-error.d.ts.map +1 -0
- package/dist/types/components/shipment-not-found-error/shipment-not-found-error.styles.d.ts +19 -0
- package/dist/types/components/shipment-not-found-error/shipment-not-found-error.styles.d.ts.map +1 -0
- package/dist/types/components/suspend-purchase/suspend-purchase.d.ts +4 -2
- package/dist/types/components/suspend-purchase/suspend-purchase.d.ts.map +1 -1
- package/dist/types/elements/labels-grid/labels-grid.d.ts +11 -1
- package/dist/types/elements/labels-grid/labels-grid.d.ts.map +1 -1
- package/dist/types/elements/manage-carriers/manage-carriers.d.ts +11 -1
- package/dist/types/elements/manage-carriers/manage-carriers.d.ts.map +1 -1
- package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts +11 -1
- package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts.map +1 -1
- package/dist/types/elements/manage-funding/manage-funding-element.d.ts +11 -1
- package/dist/types/elements/manage-funding/manage-funding-element.d.ts.map +1 -1
- package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts +11 -1
- package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts.map +1 -1
- package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts +11 -1
- package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts.map +1 -1
- package/dist/types/elements/purchase-label/components/rate-form/rate-form.d.ts +1 -1
- package/dist/types/elements/purchase-label/components/rate-form/rate-form.d.ts.map +1 -1
- package/dist/types/elements/purchase-label/components/rate-form/rate-schema.d.ts +10 -1
- package/dist/types/elements/purchase-label/components/rate-form/rate-schema.d.ts.map +1 -1
- package/dist/types/elements/purchase-label/components/rate-form/rate-view.d.ts +2 -1
- package/dist/types/elements/purchase-label/components/rate-form/rate-view.d.ts.map +1 -1
- package/dist/types/elements/purchase-label/hooks/use-rate-options.d.ts.map +1 -1
- package/dist/types/elements/purchase-label/hooks/use-rates-form.d.ts +2 -2
- package/dist/types/elements/purchase-label/hooks/use-rates-form.d.ts.map +1 -1
- package/dist/types/elements/purchase-label/hooks/use-request-rates.d.ts.map +1 -1
- package/dist/types/elements/purchase-label/purchase-label.d.ts +11 -1
- package/dist/types/elements/purchase-label/purchase-label.d.ts.map +1 -1
- package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts +11 -1
- package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts.map +1 -1
- package/dist/types/elements/shipment-summary/components/label-display/label-card.d.ts.map +1 -1
- package/dist/types/elements/shipment-summary/components/label-display/label-card.styles.d.ts +0 -19
- package/dist/types/elements/shipment-summary/components/label-display/label-card.styles.d.ts.map +1 -1
- package/dist/types/elements/shipment-summary/components/label-display/paperless-label-display.d.ts +8 -0
- package/dist/types/elements/shipment-summary/components/label-display/paperless-label-display.d.ts.map +1 -0
- package/dist/types/elements/shipment-summary/components/label-display/paperless-label-display.styles.d.ts +22 -0
- package/dist/types/elements/shipment-summary/components/label-display/paperless-label-display.styles.d.ts.map +1 -0
- package/dist/types/elements/shipment-summary/shipment-summary.d.ts +11 -1
- package/dist/types/elements/shipment-summary/shipment-summary.d.ts.map +1 -1
- package/dist/types/elements/shipments-grid/hooks/use-shipments-grid.d.ts.map +1 -1
- package/dist/types/elements/shipments-grid/shipments-grid.d.ts +11 -1
- package/dist/types/elements/shipments-grid/shipments-grid.d.ts.map +1 -1
- package/dist/types/elements/theme-creator/theme-creator.d.ts +11 -1
- package/dist/types/elements/theme-creator/theme-creator.d.ts.map +1 -1
- package/dist/types/elements/transaction-history/transaction-history-element.d.ts +11 -1
- package/dist/types/elements/transaction-history/transaction-history-element.d.ts.map +1 -1
- package/dist/types/elements/unit-settings/unit-settings-element.d.ts +11 -1
- package/dist/types/elements/unit-settings/unit-settings-element.d.ts.map +1 -1
- package/dist/types/elements/vat-settings/vat-settings-element.d.ts +11 -1
- package/dist/types/elements/vat-settings/vat-settings-element.d.ts.map +1 -1
- package/dist/types/elements/void-label/void-label.d.ts +11 -1
- package/dist/types/elements/void-label/void-label.d.ts.map +1 -1
- package/dist/types/features/payment-method-settings/payment-method-settings.d.ts.map +1 -1
- package/dist/types/hooks/use-configure-shipment.d.ts +1 -0
- package/dist/types/hooks/use-configure-shipment.d.ts.map +1 -1
- package/dist/types/hooks/use-helpers.d.ts +2 -0
- package/dist/types/hooks/use-helpers.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/locales/en/index.d.ts +11 -1
- package/dist/types/locales/en/index.d.ts.map +1 -1
- package/dist/types/types/rates.d.ts +1 -0
- package/dist/types/types/rates.d.ts.map +1 -1
- package/dist/types/utilities/address.d.ts +21 -0
- package/dist/types/utilities/address.d.ts.map +1 -0
- package/dist/types/utilities/feature-flags/types.d.ts +1 -1
- package/dist/types/utilities/feature-flags/types.d.ts.map +1 -1
- package/dist/types/utilities/index.d.ts +1 -0
- package/dist/types/utilities/index.d.ts.map +1 -1
- package/dist/types/utilities/money.d.ts +6 -0
- package/dist/types/utilities/money.d.ts.map +1 -1
- package/dist/types/utilities/rate-warning-messages.d.ts +15 -0
- package/dist/types/utilities/rate-warning-messages.d.ts.map +1 -0
- package/dist/types/workflows/account-settings/account-settings.d.ts +11 -1
- package/dist/types/workflows/account-settings/account-settings.d.ts.map +1 -1
- package/dist/types/workflows/carrier-services/carrier-services.d.ts +11 -1
- package/dist/types/workflows/carrier-services/carrier-services.d.ts.map +1 -1
- package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts +11 -1
- package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts.map +1 -1
- package/dist/types/workflows/label-workflow/label-workflow.d.ts +11 -1
- package/dist/types/workflows/label-workflow/label-workflow.d.ts.map +1 -1
- package/dist/types/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.d.ts.map +1 -1
- package/dist/types/workflows/onboarding/components/onboarding-wizard/onboarding-wizard.d.ts.map +1 -1
- package/dist/types/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.d.ts +2 -1
- package/dist/types/workflows/onboarding/components/terms-agreement-form/terms-agreement-form.d.ts.map +1 -1
- package/dist/types/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.d.ts +3 -1
- package/dist/types/workflows/onboarding/components/terms-agreement-step/terms-agreement-step.d.ts.map +1 -1
- package/dist/types/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.d.ts +1 -0
- package/dist/types/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.d.ts.map +1 -1
- package/dist/types/workflows/onboarding/onboarding.d.ts +11 -1
- package/dist/types/workflows/onboarding/onboarding.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/cjs/workflows/onboarding/components/terms-agreement-step/use-terms-agreement-step.cjs
CHANGED
|
@@ -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 =>
|
|
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
|
|
53
|
+
if (!fundingSourceId || !carriers) return enabledCarrierProfiles;
|
|
55
54
|
const connectedCarriers = carriers.filter(c => c.fundingSourceId === fundingSourceId);
|
|
56
|
-
return
|
|
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
|
|
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 =>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
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 &&
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
9
|
+
// KEEP THIS STRICT, USPS REQUIRES 2 CHARACTERS FOR FIRST AND LAST NAME
|
|
10
|
+
return refineNameStrict(schema.name);
|
|
11
11
|
}, {
|
|
12
|
-
message: "schemaErrors.
|
|
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
|
-
}),
|
|
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(
|
|
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.
|
|
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
|
-
|
|
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 {
|
|
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: [
|
|
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
|
-
|
|
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");
|