@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
|
@@ -3,7 +3,7 @@ import { jsxs, jsx, Fragment } from '@emotion/react/jsx-runtime';
|
|
|
3
3
|
import { useQueryClient } from '@tanstack/react-query';
|
|
4
4
|
import { formLogger } from '../../../../utilities/form-logger.js';
|
|
5
5
|
import { validationResolver } from '../../../../utilities/validation.js';
|
|
6
|
-
import { useRef, useState,
|
|
6
|
+
import { useRef, useState, useCallback, useMemo, useEffect } from 'react';
|
|
7
7
|
import { useForm } from 'react-hook-form';
|
|
8
8
|
import { useTranslation } from 'react-i18next';
|
|
9
9
|
import { rateSchema } from './rate-schema.js';
|
|
@@ -62,19 +62,28 @@ const RateForm = ({
|
|
|
62
62
|
defaultValues: {
|
|
63
63
|
rate: {
|
|
64
64
|
isAcknowledged: true,
|
|
65
|
-
rateId: undefined
|
|
65
|
+
rateId: undefined,
|
|
66
|
+
labelDisplayScheme: undefined
|
|
66
67
|
}
|
|
67
68
|
},
|
|
68
69
|
mode: "onChange",
|
|
69
70
|
resolver: validationResolver(rateSchema)
|
|
70
71
|
});
|
|
72
|
+
const handlePaperlessAcknowledgementChange = useCallback((_usePaperlessLabel, labelDisplayScheme) => {
|
|
73
|
+
form.setValue("rate.labelDisplayScheme", labelDisplayScheme, {
|
|
74
|
+
shouldDirty: true
|
|
75
|
+
});
|
|
76
|
+
}, [form]);
|
|
71
77
|
const {
|
|
72
78
|
rateId: selectedRateId
|
|
73
79
|
} = form.watch("rate");
|
|
74
80
|
const handleSubmit = formLogger.capture(form.handleSubmit(values => __awaiter(void 0, void 0, void 0, function* () {
|
|
75
|
-
const
|
|
81
|
+
const {
|
|
82
|
+
rateId,
|
|
83
|
+
labelDisplayScheme
|
|
84
|
+
} = values;
|
|
76
85
|
try {
|
|
77
|
-
yield onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(rateId, selectedServicePoint);
|
|
86
|
+
yield onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(rateId, selectedServicePoint, labelDisplayScheme);
|
|
78
87
|
} finally {
|
|
79
88
|
// Invalidate carrier queries after the rate form is submitted, regardless of success.
|
|
80
89
|
// This allows the carrier balance to refresh if the purchase failed but funding succeeded.
|
|
@@ -177,6 +186,7 @@ const RateForm = ({
|
|
|
177
186
|
form: form,
|
|
178
187
|
isCalculatingRates: isCalculatingRates,
|
|
179
188
|
isSavingRate: isSavingRate,
|
|
189
|
+
onPaperlessAcknowledgementChange: handlePaperlessAcknowledgementChange,
|
|
180
190
|
onSelectRate: rateId => {
|
|
181
191
|
const selectedRate = rateOptions.find(r => r.rateId === rateId);
|
|
182
192
|
if (selectedRate) {
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
+
const labelDisplaySchemeEnum = z.enum(["label", "paperless", "qr_code", "label_and_paperless"]);
|
|
3
4
|
const rateSchema = z.object({
|
|
4
5
|
rate: z.object({
|
|
5
6
|
isAcknowledged: z.boolean().refine(v => v === true, "purchase-label:schemaErrors.needToAcknowledge"),
|
|
6
|
-
rateId: z.string()
|
|
7
|
+
rateId: z.string(),
|
|
8
|
+
labelDisplayScheme: labelDisplaySchemeEnum.optional()
|
|
7
9
|
})
|
|
8
|
-
}).transform(schema =>
|
|
10
|
+
}).transform(schema => ({
|
|
11
|
+
rateId: schema.rate.rateId,
|
|
12
|
+
labelDisplayScheme: schema.rate.labelDisplayScheme
|
|
13
|
+
}));
|
|
9
14
|
|
|
10
15
|
export { rateSchema };
|
|
@@ -21,6 +21,7 @@ const RateView = ({
|
|
|
21
21
|
form,
|
|
22
22
|
isCalculatingRates,
|
|
23
23
|
isSavingRate,
|
|
24
|
+
onPaperlessAcknowledgementChange,
|
|
24
25
|
onSelectRate,
|
|
25
26
|
preferredServiceCodes,
|
|
26
27
|
pudoServicePointDetails = {
|
|
@@ -194,6 +195,7 @@ const RateView = ({
|
|
|
194
195
|
label: "Rate",
|
|
195
196
|
name: "rate",
|
|
196
197
|
onClick: onSelectRate,
|
|
198
|
+
onPaperlessAcknowledgementChange: onPaperlessAcknowledgementChange,
|
|
197
199
|
onSelectServicePoint: onSelectServicePoint,
|
|
198
200
|
options: showHiddenRates ? expandedRateOptionList : collapsedRateOptionList
|
|
199
201
|
}, rateSelectCommonProps)), expandedRateOptionList.length > COLLAPSED_RATE_VIEW_LIMIT && jsx(LinkAction, {
|
|
@@ -9,6 +9,22 @@ import { useWindsorFramework } from './use-windsor-framework.js';
|
|
|
9
9
|
import { PudoType } from '../../../types/pudo.js';
|
|
10
10
|
import { CanadaDeliveredDutyOptions } from '../../../types/canada-ddp.js';
|
|
11
11
|
|
|
12
|
+
/* https://auctane.atlassian.net/browse/ENGINE-7329
|
|
13
|
+
* 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)
|
|
14
|
+
* carriersWithPaperless and servicesWithPaperless are hardcoded for iteration one
|
|
15
|
+
*/
|
|
16
|
+
const hermesPaperlessSupportedServices = ["hermes_domestic_parcelshop_dropoff", "hermes_domestic_parcelshop_dropoff_next_day", "hermes_postable", "hermes_postable_next_day"];
|
|
17
|
+
const paperlessSupportedCarriers = [{
|
|
18
|
+
carrier: "hermes",
|
|
19
|
+
services: hermesPaperlessSupportedServices,
|
|
20
|
+
displaySchemes: ["label_and_paperless"]
|
|
21
|
+
}, {
|
|
22
|
+
carrier: "usps",
|
|
23
|
+
displaySchemes: ["qr_code"]
|
|
24
|
+
}, {
|
|
25
|
+
carrier: "stamps_com",
|
|
26
|
+
displaySchemes: ["qr_code"]
|
|
27
|
+
}];
|
|
12
28
|
/**
|
|
13
29
|
* @internal
|
|
14
30
|
*
|
|
@@ -35,6 +51,17 @@ const useRateOptions = (rates, fundingOrigin, preferredRates, carriers, shipment
|
|
|
35
51
|
var _a;
|
|
36
52
|
return ((_a = shipment === null || shipment === void 0 ? void 0 : shipment.advancedOptions) === null || _a === void 0 ? void 0 : _a.canadaDeliveredDuty) === CanadaDeliveredDutyOptions.SENDER_PREPAY;
|
|
37
53
|
}, [(_a = shipment === null || shipment === void 0 ? void 0 : shipment.advancedOptions) === null || _a === void 0 ? void 0 : _a.canadaDeliveredDuty]);
|
|
54
|
+
const buildSupportedLabelDisplaySchemes = (carrierCode, serviceCode) => {
|
|
55
|
+
const carrier = paperlessSupportedCarriers.find(c => c.carrier === carrierCode);
|
|
56
|
+
if (!carrier || carrier.services && !carrier.services.includes(serviceCode)) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
// Only return USPS/stamps_com display schemes for domestic shipments
|
|
60
|
+
if ((carrierCode === 'usps' || carrierCode === 'stamps_com') && isInternational) {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
return [...carrier.displaySchemes];
|
|
64
|
+
};
|
|
38
65
|
const rateOptionsFilters = useCallback(carrierCode => {
|
|
39
66
|
return (
|
|
40
67
|
// Filter out non-USPS carriers for Canada Delivered Duty prepaid shipments
|
|
@@ -57,7 +84,8 @@ const useRateOptions = (rates, fundingOrigin, preferredRates, carriers, shipment
|
|
|
57
84
|
messages: r.rate.warningMessages,
|
|
58
85
|
rateAcknowledgementMessage: r.rateAcknowledgementMessage,
|
|
59
86
|
requiresAcknowledgement: !!r.rateAcknowledgementMessage,
|
|
60
|
-
requiresFundedAmount: false
|
|
87
|
+
requiresFundedAmount: false,
|
|
88
|
+
paperlessDisplaySchemes: buildSupportedLabelDisplaySchemes(r.rate.carrierCode, r.rate.serviceCode)
|
|
61
89
|
}));
|
|
62
90
|
}, [preferredRates, rateOptionsFilters]);
|
|
63
91
|
const noRatesForServiceMessage = t("purchase-label:rates.noRateService");
|
|
@@ -73,7 +101,8 @@ const useRateOptions = (rates, fundingOrigin, preferredRates, carriers, shipment
|
|
|
73
101
|
balance: fundingOrigin === null || fundingOrigin === void 0 ? void 0 : fundingOrigin.balance,
|
|
74
102
|
messages: r.warningMessages,
|
|
75
103
|
requiresAcknowledgement: getRateRequiresAcknowledgement(r.serviceCode, r.packageType, !!requireDhlTermsAcknowledgement),
|
|
76
|
-
requiresFundedAmount
|
|
104
|
+
requiresFundedAmount,
|
|
105
|
+
paperlessDisplaySchemes: buildSupportedLabelDisplaySchemes(r.carrierCode, r.serviceCode)
|
|
77
106
|
});
|
|
78
107
|
if (r.shippingAmount.amount === 0 && !r.warningMessages.includes(noRatesForServiceMessage)) {
|
|
79
108
|
baseRateOption.messages.push(noRatesForServiceMessage);
|
|
@@ -12,11 +12,6 @@ import { useRatesWithCache } from './use-rates-with-cache.js';
|
|
|
12
12
|
import { useServicePoints } from './use-service-points.js';
|
|
13
13
|
import { useElements } from '../../../elements-provider/elements-context-provider.js';
|
|
14
14
|
|
|
15
|
-
/* https://auctane.atlassian.net/browse/ENGINE-7329
|
|
16
|
-
* 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)
|
|
17
|
-
* carriersWithPaperless and servicesWithPaperless are hardcoded for iteration one
|
|
18
|
-
*/
|
|
19
|
-
const servicesWithPaperless = ["hermes_domestic_parcelshop_dropoff", "hermes_domestic_parcelshop_dropoff_next_day", "hermes_postable", "hermes_postable_next_day"];
|
|
20
15
|
const useRatesForm = ({
|
|
21
16
|
getPreferredRates,
|
|
22
17
|
disabledShippingServices,
|
|
@@ -89,17 +84,11 @@ const useRatesForm = ({
|
|
|
89
84
|
listServicePointsErrors,
|
|
90
85
|
servicePointSearchQuery
|
|
91
86
|
} = useServicePoints(ratesResponse === null || ratesResponse === void 0 ? void 0 : ratesResponse.rates, shipment);
|
|
92
|
-
const
|
|
93
|
-
if ("hermes" === rate.carrierCode) {
|
|
94
|
-
return !!servicesWithPaperless.find(service => service === rate.serviceCode);
|
|
95
|
-
}
|
|
96
|
-
return false;
|
|
97
|
-
};
|
|
98
|
-
const purchaseLabel = useCallback((rateId, shipment, rate, servicePoint) => __awaiter(void 0, void 0, void 0, function* () {
|
|
87
|
+
const purchaseLabel = useCallback((rateId, shipment, rate, servicePoint, displayScheme) => __awaiter(void 0, void 0, void 0, function* () {
|
|
99
88
|
var _a;
|
|
100
89
|
try {
|
|
101
90
|
const label = yield createLabel({
|
|
102
|
-
displayScheme:
|
|
91
|
+
displayScheme: displayScheme !== null && displayScheme !== void 0 ? displayScheme : "label",
|
|
103
92
|
labelDownloadType: "url",
|
|
104
93
|
labelFormat: "pdf",
|
|
105
94
|
labelLayout: (_a = printLabelLayout === null || printLabelLayout === void 0 ? void 0 : printLabelLayout.toLowerCase()) !== null && _a !== void 0 ? _a : "4x6",
|
|
@@ -112,8 +101,15 @@ const useRatesForm = ({
|
|
|
112
101
|
} else {
|
|
113
102
|
yield onLabelCreateFailure === null || onLabelCreateFailure === void 0 ? void 0 : onLabelCreateFailure(rate, shipment);
|
|
114
103
|
}
|
|
115
|
-
} catch (
|
|
116
|
-
|
|
104
|
+
} catch (error) {
|
|
105
|
+
// Only return errors from the createLabel mutation in the callback
|
|
106
|
+
let callbackErrors;
|
|
107
|
+
if (Array.isArray(error)) {
|
|
108
|
+
if (error[0] instanceof SE.CodedError) {
|
|
109
|
+
callbackErrors = error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
yield onLabelCreateFailure === null || onLabelCreateFailure === void 0 ? void 0 : onLabelCreateFailure(rate, shipment, callbackErrors);
|
|
117
113
|
}
|
|
118
114
|
}), [createLabel, onLabelCreateFailure, onLabelCreateSuccess, printLabelLayout]);
|
|
119
115
|
const onUpdatedShipment = useCallback(shipment => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -187,7 +183,7 @@ const useRatesForm = ({
|
|
|
187
183
|
return;
|
|
188
184
|
}
|
|
189
185
|
}), [onBeforeRateSaved, onUpdatedShipment, resetRates, shipment, updateShipment]);
|
|
190
|
-
const handleSubmit = useCallback((rateId, servicePoint) => __awaiter(void 0, void 0, void 0, function* () {
|
|
186
|
+
const handleSubmit = useCallback((rateId, servicePoint, displayScheme) => __awaiter(void 0, void 0, void 0, function* () {
|
|
191
187
|
var _a, _b, _c, _d;
|
|
192
188
|
setBeforeCreateError(undefined);
|
|
193
189
|
if (!shipment) return;
|
|
@@ -235,12 +231,12 @@ const useRatesForm = ({
|
|
|
235
231
|
});
|
|
236
232
|
throw new Error("Insufficient funds. Please add funds before purchasing and try again.");
|
|
237
233
|
} else {
|
|
238
|
-
yield purchaseLabel(rate.rateId, updatedShipment !== null && updatedShipment !== void 0 ? updatedShipment : shipment, rate, servicePoint);
|
|
234
|
+
yield purchaseLabel(rate.rateId, updatedShipment !== null && updatedShipment !== void 0 ? updatedShipment : shipment, rate, servicePoint, displayScheme);
|
|
239
235
|
return;
|
|
240
236
|
}
|
|
241
237
|
}
|
|
242
238
|
// The user has selected a standard rate and no further action is required before purchase
|
|
243
|
-
yield purchaseLabel(rateId, shipment, rate, servicePoint);
|
|
239
|
+
yield purchaseLabel(rateId, shipment, rate, servicePoint, displayScheme);
|
|
244
240
|
return;
|
|
245
241
|
} catch (e) {
|
|
246
242
|
if (Array.isArray(e)) {
|
|
@@ -2,7 +2,7 @@ import { __awaiter } from '../../../_virtual/_tslib.js';
|
|
|
2
2
|
import { useListCarriers, useListCustomPackageTypes, useCalculateRates } from '@shipengine/react-api';
|
|
3
3
|
import { omitTime } from '../../../utilities/date.js';
|
|
4
4
|
import { useCallback, useMemo } from 'react';
|
|
5
|
-
import
|
|
5
|
+
import { buildRateWarningMessages } from '../../../utilities/rate-warning-messages.js';
|
|
6
6
|
import { useRequestPreferredRates } from './use-request-preferred-rates.js';
|
|
7
7
|
import { isShippingServiceServiceDisabled } from '../../../utilities/feature-flags/utils.js';
|
|
8
8
|
|
|
@@ -89,26 +89,26 @@ const useRequestRates = ({
|
|
|
89
89
|
}, [ratedShipment]);
|
|
90
90
|
const ratesCalculating = getPreferredRates ? preferredRatesCalculating || standardRatesCalculating : standardRatesCalculating;
|
|
91
91
|
ratesResponse = useMemo(() => ratesResponse && Object.assign(Object.assign({}, ratesResponse), {
|
|
92
|
-
rates: ratesResponse.rates.map(rate => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
})
|
|
99
|
-
})
|
|
92
|
+
rates: ratesResponse.rates.map(rate => Object.assign(Object.assign({}, rate), {
|
|
93
|
+
warningMessages: buildRateWarningMessages({
|
|
94
|
+
serviceCode: rate.serviceCode,
|
|
95
|
+
packageType: rate.packageType,
|
|
96
|
+
shipDay,
|
|
97
|
+
existingWarningMessages: rate.warningMessages
|
|
98
|
+
})
|
|
99
|
+
}))
|
|
100
100
|
}), [ratesResponse, shipDay]);
|
|
101
|
-
const preferredRatesResponse = useMemo(() => preferredResponse && preferredResponse.map(r => {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}), [preferredResponse, shipDay]);
|
|
101
|
+
const preferredRatesResponse = useMemo(() => preferredResponse && preferredResponse.map(r => ({
|
|
102
|
+
rate: Object.assign(Object.assign({}, r.rate), {
|
|
103
|
+
warningMessages: buildRateWarningMessages({
|
|
104
|
+
serviceCode: r.rate.serviceCode,
|
|
105
|
+
packageType: r.rate.packageType,
|
|
106
|
+
shipDay,
|
|
107
|
+
existingWarningMessages: r.rate.warningMessages
|
|
108
|
+
})
|
|
109
|
+
}),
|
|
110
|
+
rateAcknowledgementMessage: r.rateAcknowledgementMessage
|
|
111
|
+
})), [preferredResponse, shipDay]);
|
|
112
112
|
return {
|
|
113
113
|
isCalculating: ratesCalculating,
|
|
114
114
|
preferredRatesResponse,
|
|
@@ -63,7 +63,8 @@ const Component = _a => {
|
|
|
63
63
|
salesOrder,
|
|
64
64
|
refetchPendingSalesOrderShipments,
|
|
65
65
|
isLoading,
|
|
66
|
-
errors
|
|
66
|
+
errors,
|
|
67
|
+
createNewShipmentForNotFound
|
|
67
68
|
} = useConfigureShipment({
|
|
68
69
|
errorWhenShipmentCancelled: features === null || features === void 0 ? void 0 : features.enableErrorWhenShipmentCancelled,
|
|
69
70
|
externalOrderId,
|
|
@@ -90,6 +91,8 @@ const Component = _a => {
|
|
|
90
91
|
data: shipment || salesOrder,
|
|
91
92
|
errors: errors,
|
|
92
93
|
isLoading: isLoading || insuranceIsLoading,
|
|
94
|
+
onCreateNewShipment: createNewShipmentForNotFound,
|
|
95
|
+
shipmentId: shipmentId,
|
|
93
96
|
children: jsx(ConfigureShipment, Object.assign({
|
|
94
97
|
currency: currency,
|
|
95
98
|
features: features,
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from '@emotion/react/jsx-runtime';
|
|
2
2
|
import { useToggle } from '../../../../hooks/use-toggle.js';
|
|
3
|
-
import {
|
|
3
|
+
import { Icon, IconSize, Tag, Next, Typography } from '@shipengine/giger';
|
|
4
4
|
import { IconNames } from '@shipengine/giger-theme';
|
|
5
5
|
import { formatDateDDMMYY } from '../../../../utilities/date.js';
|
|
6
6
|
import { trackingStatusFormatter } from '../../../../utilities/tracking-formatter.js';
|
|
7
|
-
import { useRef } from 'react';
|
|
7
|
+
import { useRef, useMemo } from 'react';
|
|
8
8
|
import { useTranslation } from 'react-i18next';
|
|
9
9
|
import { styles } from './label-card.styles.js';
|
|
10
|
+
import { PaperlessLabelDisplay } from './paperless-label-display.js';
|
|
10
11
|
import { ServiceCardContainer, ServiceCardHeader, ServiceCardFooter } from '../../../../components/service-card/service-card.js';
|
|
11
12
|
import { InsurancePopover } from '../../../../components/insurance-popover/insurance-popover.js';
|
|
12
13
|
import { useElements } from '../../../../elements-provider/elements-context-provider.js';
|
|
@@ -44,7 +45,8 @@ const LabelCard = ({
|
|
|
44
45
|
trackable = undefined,
|
|
45
46
|
trackingNumber = undefined,
|
|
46
47
|
trackingStatus = undefined,
|
|
47
|
-
trackingUrl = undefined
|
|
48
|
+
trackingUrl = undefined,
|
|
49
|
+
qrCodeDownload = undefined
|
|
48
50
|
} = !displayAsVoided ? label : {};
|
|
49
51
|
const carrierCode = carrier === null || carrier === void 0 ? void 0 : carrier.carrierCode;
|
|
50
52
|
const carrierFriendlyName = carrier === null || carrier === void 0 ? void 0 : carrier.friendlyName;
|
|
@@ -142,6 +144,18 @@ const LabelCard = ({
|
|
|
142
144
|
shippingAmount,
|
|
143
145
|
showExtendedData: selected
|
|
144
146
|
};
|
|
147
|
+
const paperlessDownloadProps = useMemo(() => {
|
|
148
|
+
// USPS paperless labels populate the qrCodeDownload property instead of paperlessDownload, use qrCodeDownload href if available and paperlessDownload is empty
|
|
149
|
+
if (!paperlessDownload || Object.keys(paperlessDownload).length === 0) {
|
|
150
|
+
if (qrCodeDownload && qrCodeDownload.href) {
|
|
151
|
+
return {
|
|
152
|
+
href: qrCodeDownload.href
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
return paperlessDownload;
|
|
158
|
+
}, [paperlessDownload, qrCodeDownload]);
|
|
145
159
|
return jsxs(ServiceCardContainer, {
|
|
146
160
|
selected: selected,
|
|
147
161
|
voided: displayAsVoided,
|
|
@@ -158,36 +172,7 @@ const LabelCard = ({
|
|
|
158
172
|
},
|
|
159
173
|
voided: displayAsVoided,
|
|
160
174
|
children: trackable && jsx(TrackingNumberDisplay, {})
|
|
161
|
-
}),
|
|
162
|
-
css: styles.paperlessDownloadwrapper,
|
|
163
|
-
children: [jsxs("div", {
|
|
164
|
-
css: styles.codewrapper,
|
|
165
|
-
children: [jsx("img", {
|
|
166
|
-
alt: "paperless code",
|
|
167
|
-
css: styles.codeImage,
|
|
168
|
-
src: paperlessDownload === null || paperlessDownload === void 0 ? void 0 : paperlessDownload.href
|
|
169
|
-
}), jsx("div", {
|
|
170
|
-
css: styles.handoffCode,
|
|
171
|
-
children: paperlessDownload === null || paperlessDownload === void 0 ? void 0 : paperlessDownload.handoffCode.toString()
|
|
172
|
-
}), jsxs(Next.Link, {
|
|
173
|
-
buttonProps: {
|
|
174
|
-
variant: ButtonVariant.OUTLINED
|
|
175
|
-
},
|
|
176
|
-
css: styles.button,
|
|
177
|
-
download: true,
|
|
178
|
-
href: paperlessDownload === null || paperlessDownload === void 0 ? void 0 : paperlessDownload.href,
|
|
179
|
-
isButton: true,
|
|
180
|
-
children: [jsx(Icon, {
|
|
181
|
-
name: IconNames.PRINTER,
|
|
182
|
-
size: IconSize.SIZE_SMALL
|
|
183
|
-
}), jsx("span", {
|
|
184
|
-
children: t("view-shipment:actions.download")
|
|
185
|
-
})]
|
|
186
|
-
})]
|
|
187
|
-
}), jsx(Typography, {
|
|
188
|
-
children: paperlessDownload === null || paperlessDownload === void 0 ? void 0 : paperlessDownload.instructions
|
|
189
|
-
})]
|
|
190
|
-
}), showFooter && jsx(ServiceCardFooter, {
|
|
175
|
+
}), paperlessDownloadProps && "href" in paperlessDownloadProps && jsx(PaperlessLabelDisplay, Object.assign({}, paperlessDownloadProps)), showFooter && jsx(ServiceCardFooter, {
|
|
191
176
|
messages: labelMessages
|
|
192
177
|
})]
|
|
193
178
|
});
|
|
@@ -1,31 +1,12 @@
|
|
|
1
1
|
import { createStyles, scopeTheme } from '../../../../utilities/styles.js';
|
|
2
2
|
|
|
3
3
|
const styles = createStyles({
|
|
4
|
-
button: () => ({
|
|
5
|
-
cursor: "pointer"
|
|
6
|
-
}),
|
|
7
|
-
codeImage: () => ({
|
|
8
|
-
height: "120px",
|
|
9
|
-
maxWidth: "200px",
|
|
10
|
-
width: "auto"
|
|
11
|
-
}),
|
|
12
|
-
codewrapper: () => ({
|
|
13
|
-
alignItems: "center",
|
|
14
|
-
display: "flex",
|
|
15
|
-
flexDirection: "column"
|
|
16
|
-
}),
|
|
17
|
-
handoffCode: theme => ({
|
|
18
|
-
margin: `${scopeTheme(theme).spacing(2)}px 0`
|
|
19
|
-
}),
|
|
20
4
|
insuranceInfoIcon: theme => ({
|
|
21
5
|
":hover": {
|
|
22
6
|
cursor: "pointer"
|
|
23
7
|
},
|
|
24
8
|
marginLeft: scopeTheme(theme).spacing(0.5)
|
|
25
9
|
}),
|
|
26
|
-
paperlessDownloadwrapper: theme => ({
|
|
27
|
-
padding: scopeTheme(theme).spacing(2)
|
|
28
|
-
}),
|
|
29
10
|
trackingNumber: () => ({
|
|
30
11
|
maxWidth: "100%",
|
|
31
12
|
overflow: "hidden",
|
package/dist/esm/elements/shipment-summary/components/label-display/paperless-label-display.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from '@emotion/react/jsx-runtime';
|
|
2
|
+
import { Next, ButtonVariant, Icon, IconSize, Typography } from '@shipengine/giger';
|
|
3
|
+
import { IconNames } from '@shipengine/giger-theme';
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
import { styles } from './paperless-label-display.styles.js';
|
|
6
|
+
import { Spacer } from '../../../../components/spacer/spacer.js';
|
|
7
|
+
|
|
8
|
+
const PaperlessLabelDisplay = ({
|
|
9
|
+
handoffCode,
|
|
10
|
+
href,
|
|
11
|
+
instructions
|
|
12
|
+
}) => {
|
|
13
|
+
const {
|
|
14
|
+
t
|
|
15
|
+
} = useTranslation();
|
|
16
|
+
return jsxs("div", {
|
|
17
|
+
css: styles.paperlessDownloadwrapper,
|
|
18
|
+
children: [jsxs("div", {
|
|
19
|
+
css: styles.codewrapper,
|
|
20
|
+
children: [jsx("img", {
|
|
21
|
+
alt: "paperless code",
|
|
22
|
+
css: styles.codeImage,
|
|
23
|
+
src: href
|
|
24
|
+
}), handoffCode && jsx("div", {
|
|
25
|
+
css: styles.handoffCode,
|
|
26
|
+
children: handoffCode
|
|
27
|
+
}), jsxs(Next.Link, {
|
|
28
|
+
buttonProps: {
|
|
29
|
+
variant: ButtonVariant.OUTLINED
|
|
30
|
+
},
|
|
31
|
+
css: styles.button,
|
|
32
|
+
download: true,
|
|
33
|
+
href: href,
|
|
34
|
+
isButton: true,
|
|
35
|
+
children: [jsx(Icon, {
|
|
36
|
+
name: IconNames.PRINTER,
|
|
37
|
+
size: IconSize.SIZE_SMALL
|
|
38
|
+
}), jsx("span", {
|
|
39
|
+
children: t("view-shipment:actions.download")
|
|
40
|
+
})]
|
|
41
|
+
})]
|
|
42
|
+
}), instructions && jsxs(Fragment, {
|
|
43
|
+
children: [jsx(Spacer, {
|
|
44
|
+
multiplier: 2
|
|
45
|
+
}), " ", jsx(Typography, {
|
|
46
|
+
children: instructions
|
|
47
|
+
})]
|
|
48
|
+
})]
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export { PaperlessLabelDisplay };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createStyles, scopeTheme } from '../../../../utilities/styles.js';
|
|
2
|
+
|
|
3
|
+
const styles = createStyles({
|
|
4
|
+
button: () => ({
|
|
5
|
+
cursor: "pointer"
|
|
6
|
+
}),
|
|
7
|
+
codeImage: () => ({
|
|
8
|
+
height: "120px",
|
|
9
|
+
maxWidth: "200px",
|
|
10
|
+
width: "auto"
|
|
11
|
+
}),
|
|
12
|
+
codewrapper: () => ({
|
|
13
|
+
alignItems: "center",
|
|
14
|
+
display: "flex",
|
|
15
|
+
flexDirection: "column"
|
|
16
|
+
}),
|
|
17
|
+
handoffCode: theme => ({
|
|
18
|
+
margin: `${scopeTheme(theme).spacing(2)}px 0`
|
|
19
|
+
}),
|
|
20
|
+
paperlessDownloadwrapper: theme => ({
|
|
21
|
+
padding: scopeTheme(theme).spacing(2)
|
|
22
|
+
})
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export { styles };
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { __awaiter } from '../../_virtual/_tslib.js';
|
|
2
|
-
import { jsx } from '@emotion/react/jsx-runtime';
|
|
2
|
+
import { jsxs, Fragment, jsx } from '@emotion/react/jsx-runtime';
|
|
3
3
|
import { useToggle } from '../../hooks/use-toggle.js';
|
|
4
|
+
import { InlineNotification, NotificationType } from '@shipengine/giger';
|
|
4
5
|
import { useUpdateFundingSource, useListFundingSources } from '@shipengine/react-api';
|
|
5
6
|
import { useState } from 'react';
|
|
6
7
|
import { useTranslation } from 'react-i18next';
|
|
7
8
|
import { EditBillingForm } from '../../components/forms/edit-billing-form/edit-billing-form.js';
|
|
8
9
|
import { WalletCard } from '../../components/wallet-card/wallet-card.js';
|
|
10
|
+
import { useElements } from '../../elements-provider/elements-context-provider.js';
|
|
11
|
+
import { Spacer } from '../../components/spacer/spacer.js';
|
|
9
12
|
import { Loader } from '../../components/loader/loader.js';
|
|
10
13
|
import { ZeroState } from '../../components/zero-state/zero-state.js';
|
|
11
14
|
|
|
@@ -16,37 +19,72 @@ const PaymentMethodSettings = ({
|
|
|
16
19
|
const {
|
|
17
20
|
t
|
|
18
21
|
} = useTranslation();
|
|
22
|
+
const {
|
|
23
|
+
globalFeatures
|
|
24
|
+
} = useElements();
|
|
25
|
+
const {
|
|
26
|
+
supportEmailAddress
|
|
27
|
+
} = globalFeatures;
|
|
19
28
|
const [showEditBilling, toggleShowEditBilling] = useToggle(false);
|
|
20
29
|
const [isUpdatingBilling, setIsUpdatingBilling] = useState(false);
|
|
21
30
|
const {
|
|
22
|
-
|
|
31
|
+
error: updateBillingError,
|
|
32
|
+
mutateAsync: updateBilling,
|
|
33
|
+
reset: resetUpdateFundingSource
|
|
23
34
|
} = useUpdateFundingSource();
|
|
24
35
|
const {
|
|
25
36
|
data: fundingSources,
|
|
26
37
|
refetch: refetchFundingSources,
|
|
27
38
|
isLoading: fundingSourceLoading
|
|
28
39
|
} = useListFundingSources();
|
|
29
|
-
const
|
|
40
|
+
const {
|
|
41
|
+
fundingSourceId,
|
|
42
|
+
billingInfo
|
|
43
|
+
} = (_a = fundingSources === null || fundingSources === void 0 ? void 0 : fundingSources[0]) !== null && _a !== void 0 ? _a : {};
|
|
30
44
|
const handleUpdateBilling = (billingInfo, creditCardInfo) => __awaiter(void 0, void 0, void 0, function* () {
|
|
31
45
|
if (fundingSourceId) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
46
|
+
try {
|
|
47
|
+
setIsUpdatingBilling(true);
|
|
48
|
+
yield updateBilling({
|
|
49
|
+
billingInfo,
|
|
50
|
+
creditCardInfo,
|
|
51
|
+
fundingSourceId
|
|
52
|
+
});
|
|
53
|
+
yield refetchFundingSources();
|
|
54
|
+
toggleShowEditBilling(false);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.error("Error updating billing:", error);
|
|
57
|
+
// error is handled by the mutation
|
|
58
|
+
} finally {
|
|
59
|
+
setIsUpdatingBilling(false);
|
|
60
|
+
}
|
|
41
61
|
}
|
|
42
62
|
});
|
|
43
|
-
if (showEditBilling) return
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
63
|
+
if (showEditBilling) return jsxs(Fragment, {
|
|
64
|
+
children: [jsx(EditBillingForm, {
|
|
65
|
+
billingInfo: billingInfo,
|
|
66
|
+
isLoading: isUpdatingBilling,
|
|
67
|
+
onCancel: () => {
|
|
68
|
+
toggleShowEditBilling(false);
|
|
69
|
+
resetUpdateFundingSource();
|
|
70
|
+
},
|
|
71
|
+
onSubmit: (billingInfo, creditCardInfo) => {
|
|
72
|
+
void handleUpdateBilling(billingInfo, creditCardInfo);
|
|
73
|
+
}
|
|
74
|
+
}), (updateBillingError === null || updateBillingError === void 0 ? void 0 : updateBillingError.length) && jsxs(Fragment, {
|
|
75
|
+
children: [jsx(Spacer, {
|
|
76
|
+
multiplier: 2
|
|
77
|
+
}), jsx(InlineNotification, {
|
|
78
|
+
css: {
|
|
79
|
+
textAlign: "left"
|
|
80
|
+
},
|
|
81
|
+
title: t("account-settings:errors.paymentMethod.title"),
|
|
82
|
+
type: NotificationType.ERROR,
|
|
83
|
+
children: t("account-settings:errors.paymentMethod.description", {
|
|
84
|
+
email: supportEmailAddress
|
|
85
|
+
})
|
|
86
|
+
})]
|
|
87
|
+
})]
|
|
50
88
|
});else {
|
|
51
89
|
if (fundingSourceLoading) return jsx(Loader, {
|
|
52
90
|
message: t("loading.paymentMethod")
|