@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/README.md
CHANGED
|
@@ -1,15 +1,196 @@
|
|
|
1
1
|
<!-- README for NPM; the one for GitHub is in .github directory. -->
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Creating a New Element
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
ShipEngine Elements is a collection of React components that provide shipping functionality through a standardized interface.
|
|
6
|
+
This guide provides the essential steps for creating new elements in the ShipEngine Elements library.
|
|
6
7
|
|
|
7
|
-
##
|
|
8
|
+
## Element Architecture
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
Each element is composed of:
|
|
11
|
+
|
|
12
|
+
- **Component**: Your main React component logic
|
|
13
|
+
- **createElement Wrapper**: Provides error boundaries, i18n, and styling
|
|
14
|
+
- **Element Provider**: Manages global state and configuration
|
|
15
|
+
|
|
16
|
+
## File Structure
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
libs/elements/src/elements/new-element/
|
|
20
|
+
├── index.ts # Export file
|
|
21
|
+
├── new-element.tsx # Main element file
|
|
22
|
+
├── __stories__/ # Storybook stories
|
|
23
|
+
│ └── new-element.stories.tsx
|
|
24
|
+
└── __tests__/ # Jest tests
|
|
25
|
+
└── new-element.test.tsx
|
|
11
26
|
```
|
|
12
27
|
|
|
28
|
+
## Step-by-Step Guide
|
|
29
|
+
|
|
30
|
+
### 1. Create the Directory Structure
|
|
31
|
+
|
|
13
32
|
```bash
|
|
14
|
-
|
|
33
|
+
mkdir -p libs/elements/src/elements/new-element/{__stories__,__tests__}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. Create the Main Element File
|
|
37
|
+
|
|
38
|
+
**`libs/elements/src/elements/new-element/new-element.tsx`**
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
import { ErrorFallback } from "@components/error-fallback";
|
|
42
|
+
import { Button, Typography } from "@shipengine/giger";
|
|
43
|
+
import { useTranslation } from "react-i18next";
|
|
44
|
+
|
|
45
|
+
import { createElement } from "../../create-element";
|
|
46
|
+
import { en } from "../../locales";
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Props for the NewElement component
|
|
50
|
+
*/
|
|
51
|
+
export type NewElementProps = {
|
|
52
|
+
/**
|
|
53
|
+
* Optional title to display
|
|
54
|
+
*/
|
|
55
|
+
title?: string;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Callback function when action is performed
|
|
59
|
+
*/
|
|
60
|
+
onClick?: (value: any) => void;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* # NewElement Component
|
|
65
|
+
*
|
|
66
|
+
* Brief description of what this element does and its purpose.
|
|
67
|
+
*/
|
|
68
|
+
export const Component = ({ title = "New Element Title", onClick }: NewElementProps) => {
|
|
69
|
+
const { t } = useTranslation();
|
|
70
|
+
|
|
71
|
+
const handleOnClick = () => {
|
|
72
|
+
const value = { name: "ShipEngine Elements" };
|
|
73
|
+
onClick?.(value);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<div>
|
|
78
|
+
<Typography variant="h2">{title}</Typography>
|
|
79
|
+
|
|
80
|
+
<Typography variant="body1">{t("description")}</Typography>
|
|
81
|
+
|
|
82
|
+
<Button onClick={handleOnClick}>{t("actionButton")}</Button>
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* # NewElement Element
|
|
89
|
+
*
|
|
90
|
+
* The registered element that can be used directly in applications.
|
|
91
|
+
*/
|
|
92
|
+
export const Element = createElement(Component, ErrorFallback, {
|
|
93
|
+
css: {
|
|
94
|
+
height: "100%",
|
|
95
|
+
maxWidth: "800px",
|
|
96
|
+
minWidth: "440px",
|
|
97
|
+
width: "100%",
|
|
98
|
+
},
|
|
99
|
+
resources: { en },
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
export type ElementProps = React.ComponentProps<typeof Element>;
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 3. Create the Index File
|
|
106
|
+
|
|
107
|
+
**`libs/elements/src/elements/new-element/index.ts`**
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
export * as NewElement from "./new-element";
|
|
111
|
+
export type { NewElementProps } from "./new-element";
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 4. Add Localization Resources
|
|
115
|
+
|
|
116
|
+
**`libs/elements/src/locales/en/new-element.json`**
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"description": "This is a new Element!",
|
|
121
|
+
"actionButton": "Continue"
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 5. Create Storybook Stories
|
|
126
|
+
|
|
127
|
+
**`libs/elements/src/elements/new-element/__stories__/new-element.stories.tsx`**
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
131
|
+
|
|
132
|
+
import { NewElement } from "../new-element";
|
|
133
|
+
|
|
134
|
+
const meta: Meta<typeof NewElement.Element> = {
|
|
135
|
+
title: "Elements/NewElement",
|
|
136
|
+
component: NewElement.Element,
|
|
137
|
+
parameters: {
|
|
138
|
+
layout: "centered",
|
|
139
|
+
},
|
|
140
|
+
tags: ["autodocs"],
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
export default meta;
|
|
144
|
+
type Story = StoryObj<typeof meta>;
|
|
145
|
+
|
|
146
|
+
export const Default: Story = {
|
|
147
|
+
args: {
|
|
148
|
+
title: "Default Example",
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
export const CustomTitle: Story = {
|
|
153
|
+
args: {
|
|
154
|
+
title: "Custom Element Title",
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 7. Update Package Exports
|
|
160
|
+
|
|
161
|
+
Add your new element to **`libs/elements/package.json`** exports:
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"exports": {
|
|
166
|
+
"./new-element": {
|
|
167
|
+
"source": "./src/elements/new-element/index.ts",
|
|
168
|
+
"import": {
|
|
169
|
+
"types": "./dist/types/elements/new-element/index.d.ts",
|
|
170
|
+
"default": "./dist/esm/elements/new-element/index.js"
|
|
171
|
+
},
|
|
172
|
+
"require": {
|
|
173
|
+
"types": "./dist/types/elements/new-element/index.d.ts",
|
|
174
|
+
"default": "./dist/cjs/elements/new-element/index.cjs"
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
15
179
|
```
|
|
180
|
+
|
|
181
|
+
### 8. Update Main Index File
|
|
182
|
+
|
|
183
|
+
Add your element to **`libs/elements/src/index.ts`**:
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
export * from "./elements/new-element";
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Best Practices
|
|
190
|
+
|
|
191
|
+
- Use TypeScript with proper type definitions
|
|
192
|
+
- Include JSDoc comments where appropriate
|
|
193
|
+
- Write unit tests for functionality
|
|
194
|
+
- Use i18 translation strings for all user-facing text
|
|
195
|
+
- Follow existing code patterns for consistency
|
|
196
|
+
- Test with Storybook during development
|
|
@@ -4,41 +4,58 @@ var _tslib = require('../../../_virtual/_tslib.cjs');
|
|
|
4
4
|
var jsxRuntime = require('@emotion/react/jsx-runtime');
|
|
5
5
|
var giger = require('@shipengine/giger');
|
|
6
6
|
var money = require('../../../utilities/money.cjs');
|
|
7
|
+
var React = require('react');
|
|
7
8
|
var createFieldController = require('../create-field-controller.cjs');
|
|
8
9
|
var field_styles = require('../field.styles.cjs');
|
|
9
10
|
|
|
10
11
|
const CreditCardInputController = createFieldController.createFieldController();
|
|
11
12
|
const transform = {
|
|
12
|
-
in: v
|
|
13
|
+
in: (v, isFocused) => {
|
|
14
|
+
if (!v) return "";
|
|
15
|
+
return isFocused ? money.formatCreditCardNumber(v) : money.maskCreditCardNumber(v);
|
|
16
|
+
},
|
|
13
17
|
out: event => event.target.value === "" ? null : event.target.value.replace(/\s/g, "")
|
|
14
18
|
};
|
|
15
|
-
const CreditCardInput = fieldProps =>
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
19
|
+
const CreditCardInput = fieldProps => {
|
|
20
|
+
const [isFocused, setIsFocused] = React.useState(false);
|
|
21
|
+
return jsxRuntime.jsx(CreditCardInputController, Object.assign({}, fieldProps, {
|
|
22
|
+
children: _a => {
|
|
23
|
+
var {
|
|
24
|
+
onChange,
|
|
25
|
+
value
|
|
26
|
+
} = _a,
|
|
27
|
+
creditCardInputProps = _tslib.__rest(_a, ["onChange", "value"]);
|
|
28
|
+
return jsxRuntime.jsx("div", {
|
|
29
|
+
css: field_styles.styles.overrideStyles,
|
|
30
|
+
children: jsxRuntime.jsx(giger.Input, Object.assign({}, creditCardInputProps, {
|
|
31
|
+
onBlur: () => {
|
|
32
|
+
var _a;
|
|
33
|
+
setIsFocused(false);
|
|
34
|
+
(_a = creditCardInputProps.onBlur) === null || _a === void 0 ? void 0 : _a.call(creditCardInputProps);
|
|
35
|
+
},
|
|
36
|
+
onChange: e => {
|
|
37
|
+
// Amex allows 15 digits, all others allow 16
|
|
38
|
+
if (e.target.value.replace(/\s/g, "").length > 16) {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
} else {
|
|
41
|
+
onChange(transform.out(e));
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
onFocus: e => {
|
|
45
|
+
var _a;
|
|
46
|
+
setIsFocused(true);
|
|
47
|
+
(_a = creditCardInputProps.onFocus) === null || _a === void 0 ? void 0 : _a.call(creditCardInputProps, e);
|
|
48
|
+
},
|
|
49
|
+
onKeyDown: e => {
|
|
50
|
+
// Prevent non-numeric characters
|
|
51
|
+
if (!/^([0-9]|Backspace|Delete|Enter|Tab)$/i.test(e.key)) e.preventDefault();
|
|
52
|
+
},
|
|
53
|
+
type: "text",
|
|
54
|
+
value: transform.in(value, isFocused)
|
|
55
|
+
}))
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
};
|
|
43
60
|
|
|
44
61
|
exports.CreditCardInput = CreditCardInput;
|
|
@@ -84,6 +84,7 @@ const RateCard = ({
|
|
|
84
84
|
messages,
|
|
85
85
|
onClick,
|
|
86
86
|
onClickAcknowledgement,
|
|
87
|
+
onPaperlessAcknowledgementChange,
|
|
87
88
|
onSelectServicePoint,
|
|
88
89
|
otherAmount,
|
|
89
90
|
rateId,
|
|
@@ -101,7 +102,9 @@ const RateCard = ({
|
|
|
101
102
|
selectedRateCost,
|
|
102
103
|
servicePoints: servicePoints$1,
|
|
103
104
|
mapViewEnabled,
|
|
104
|
-
rateDetails
|
|
105
|
+
rateDetails,
|
|
106
|
+
paperlessDisplaySchemes,
|
|
107
|
+
paperlessLabelChecked = false
|
|
105
108
|
}) => {
|
|
106
109
|
/* TODO: ENGINE-7366: TODO Remove showVatSettings flag once this is fully in production */
|
|
107
110
|
const showRateDetails = showVatFeatures && rateDetails && rateDetails.length > 0;
|
|
@@ -145,7 +148,8 @@ const RateCard = ({
|
|
|
145
148
|
return undefined;
|
|
146
149
|
}
|
|
147
150
|
}, [confirmationAmount, insuranceAmount, isPreferredRate, otherAmount, selectedRateCost, shippingAmount, taxAmount]);
|
|
148
|
-
const
|
|
151
|
+
const requiresPaperlessAcknowledgement = paperlessDisplaySchemes === null || paperlessDisplaySchemes === void 0 ? void 0 : paperlessDisplaySchemes.includes("qr_code");
|
|
152
|
+
const hasFooterData = !!(rateMessages === null || rateMessages === void 0 ? void 0 : rateMessages.length) || requiresAcknowledgement || requiresPaperlessAcknowledgement;
|
|
149
153
|
const costBreakdownCommonProps = {
|
|
150
154
|
confirmationAmount,
|
|
151
155
|
insuranceAmount,
|
|
@@ -186,6 +190,17 @@ const RateCard = ({
|
|
|
186
190
|
serviceInfo: {
|
|
187
191
|
line1: carrierNickname,
|
|
188
192
|
line2: getDeliveryDaysLabel(deliveryDays),
|
|
193
|
+
line3: paperlessDisplaySchemes && paperlessDisplaySchemes.length > 0 ? jsxRuntime.jsxs("div", {
|
|
194
|
+
"aria-label": t("purchase-label:paperlessAvailable"),
|
|
195
|
+
css: rateCard_styles.styles.paperlessText,
|
|
196
|
+
children: [jsxRuntime.jsx(giger.Icon, {
|
|
197
|
+
name: gigerTheme.IconNames.SCAN_QR,
|
|
198
|
+
size: giger.IconSize.SIZE_MEDIUM
|
|
199
|
+
}), jsxRuntime.jsx(giger.Typography, {
|
|
200
|
+
variant: "small",
|
|
201
|
+
children: t("purchase-label:paperlessAvailable")
|
|
202
|
+
})]
|
|
203
|
+
}) : undefined,
|
|
189
204
|
type: serviceType
|
|
190
205
|
}
|
|
191
206
|
}), servicePoints$1 && jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
@@ -200,16 +215,25 @@ const RateCard = ({
|
|
|
200
215
|
rateSelected: selected,
|
|
201
216
|
servicePoints: servicePoints$1
|
|
202
217
|
})]
|
|
203
|
-
}), selected && hasFooterData && jsxRuntime.
|
|
218
|
+
}), selected && hasFooterData && jsxRuntime.jsxs(serviceCard.ServiceCardFooter, {
|
|
204
219
|
messages: rateMessages,
|
|
205
|
-
children: requiresAcknowledgement && onClickAcknowledgement && jsxRuntime.jsx(giger.Checkbox, {
|
|
220
|
+
children: [requiresAcknowledgement && onClickAcknowledgement && jsxRuntime.jsx(giger.Checkbox, {
|
|
206
221
|
"aria-required": true,
|
|
207
222
|
checked: isAcknowledged,
|
|
208
223
|
css: rateCard_styles.styles.acknowledgment,
|
|
209
224
|
"data-testid": "rate-acknowledgement",
|
|
210
225
|
label: rateAcknowledgementMessage ? getPreferredRateAcknowledgementLabel(rateAcknowledgementMessage) : getAcknowledgementLabel(serviceCode, packageType),
|
|
211
226
|
onChange: e => onClickAcknowledgement(e.target.checked)
|
|
212
|
-
})
|
|
227
|
+
}), requiresPaperlessAcknowledgement && jsxRuntime.jsx(giger.Checkbox, {
|
|
228
|
+
"aria-required": true,
|
|
229
|
+
checked: paperlessLabelChecked,
|
|
230
|
+
css: rateCard_styles.styles.acknowledgment,
|
|
231
|
+
"data-testid": "paperless-acknowledgement",
|
|
232
|
+
label: t("purchase-label:usePaperlessLabel"),
|
|
233
|
+
onChange: e => {
|
|
234
|
+
onPaperlessAcknowledgementChange === null || onPaperlessAcknowledgementChange === void 0 ? void 0 : onPaperlessAcknowledgementChange(e.target.checked, "qr_code");
|
|
235
|
+
}
|
|
236
|
+
})]
|
|
213
237
|
})]
|
|
214
238
|
});
|
|
215
239
|
};
|
|
@@ -5,10 +5,8 @@ var styles$1 = require('../../../../utilities/styles.cjs');
|
|
|
5
5
|
const getRateCardFirstLineSize = theme => `${styles$1.scopeTheme(theme).spacing(3.25)}px`;
|
|
6
6
|
const styles = styles$1.createStyles({
|
|
7
7
|
acknowledgment: theme => ({
|
|
8
|
-
alignItems: "center",
|
|
9
8
|
color: styles$1.scopeTheme(theme).palette.gray.main,
|
|
10
|
-
display: "flex"
|
|
11
|
-
paddingTop: styles$1.scopeTheme(theme).spacing(1.5)
|
|
9
|
+
display: "flex"
|
|
12
10
|
}),
|
|
13
11
|
divider: theme => ({
|
|
14
12
|
borderColor: styles$1.scopeTheme(theme).palette.primary.main,
|
|
@@ -29,6 +27,13 @@ const styles = styles$1.createStyles({
|
|
|
29
27
|
position: "absolute",
|
|
30
28
|
right: 0,
|
|
31
29
|
top: 0
|
|
30
|
+
}),
|
|
31
|
+
paperlessText: theme => ({
|
|
32
|
+
display: "flex",
|
|
33
|
+
gap: styles$1.scopeTheme(theme).spacing(0.25),
|
|
34
|
+
paddingTop: styles$1.scopeTheme(theme).spacing(0.5),
|
|
35
|
+
color: styles$1.scopeTheme(theme).palette.gray[600],
|
|
36
|
+
alignItems: "center"
|
|
32
37
|
})
|
|
33
38
|
});
|
|
34
39
|
|
|
@@ -22,12 +22,13 @@ const RateSelect = _a => {
|
|
|
22
22
|
nicknameFeature,
|
|
23
23
|
preferredServiceCodes,
|
|
24
24
|
onClick,
|
|
25
|
+
onPaperlessAcknowledgementChange,
|
|
25
26
|
onSelectServicePoint,
|
|
26
27
|
isLoading,
|
|
27
28
|
mapViewEnabled,
|
|
28
29
|
showVatFeatures
|
|
29
30
|
} = _a,
|
|
30
|
-
fieldProps = _tslib.__rest(_a, ["nicknameFeature", "preferredServiceCodes", "onClick", "onSelectServicePoint", "isLoading", "mapViewEnabled", "showVatFeatures"]);
|
|
31
|
+
fieldProps = _tslib.__rest(_a, ["nicknameFeature", "preferredServiceCodes", "onClick", "onPaperlessAcknowledgementChange", "onSelectServicePoint", "isLoading", "mapViewEnabled", "showVatFeatures"]);
|
|
31
32
|
// The calculated cost of the selected rate
|
|
32
33
|
const [selectedRateCost, setSelectedRateCost] = React.useState();
|
|
33
34
|
return jsxRuntime.jsx(RateSelectController, Object.assign({}, fieldProps, {
|
|
@@ -50,17 +51,37 @@ const RateSelect = _a => {
|
|
|
50
51
|
isPreferredRate: preferredServiceCodes && preferredServiceCodes.includes(option.serviceCode),
|
|
51
52
|
key: option.rateId,
|
|
52
53
|
onClick: rateId => {
|
|
54
|
+
var _a;
|
|
53
55
|
onClick === null || onClick === void 0 ? void 0 : onClick(rateId);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
// if the rate supports "label_and_paperless" display scheme, use it by default
|
|
57
|
+
if ((_a = option.paperlessDisplaySchemes) === null || _a === void 0 ? void 0 : _a.includes("label_and_paperless")) {
|
|
58
|
+
field.onChange({
|
|
59
|
+
usePaperlessLabel: true,
|
|
60
|
+
labelDisplayScheme: "label_and_paperless",
|
|
61
|
+
isAcknowledged: !option.requiresAcknowledgement,
|
|
62
|
+
rateId
|
|
63
|
+
});
|
|
64
|
+
} else {
|
|
65
|
+
field.onChange({
|
|
66
|
+
isAcknowledged: !option.requiresAcknowledgement,
|
|
67
|
+
rateId
|
|
68
|
+
});
|
|
69
|
+
}
|
|
58
70
|
setSelectedRateCost(rates.getTotalRateAmount(option));
|
|
59
71
|
},
|
|
60
72
|
onClickAcknowledgement: isAcknowledged => field.onChange(Object.assign(Object.assign({}, field.value), {
|
|
61
73
|
isAcknowledged
|
|
62
74
|
})),
|
|
75
|
+
onPaperlessAcknowledgementChange: (usePaperless, labelDisplayScheme) => {
|
|
76
|
+
field.onChange(Object.assign(Object.assign({}, field.value), {
|
|
77
|
+
usePaperlessLabel: usePaperless,
|
|
78
|
+
labelDisplayScheme
|
|
79
|
+
}));
|
|
80
|
+
onPaperlessAcknowledgementChange === null || onPaperlessAcknowledgementChange === void 0 ? void 0 : onPaperlessAcknowledgementChange(usePaperless, labelDisplayScheme);
|
|
81
|
+
},
|
|
63
82
|
onSelectServicePoint: onSelectServicePoint,
|
|
83
|
+
paperlessDisplaySchemes: option.paperlessDisplaySchemes,
|
|
84
|
+
paperlessLabelChecked: field.value.usePaperlessLabel,
|
|
64
85
|
rateDetails: option.rateDetails,
|
|
65
86
|
selected: option.rateId === field.value.rateId,
|
|
66
87
|
selectedRateCost: selectedRateCost,
|
|
@@ -6,12 +6,12 @@ var address = require('../../../constants/shipengine/address.cjs');
|
|
|
6
6
|
var zod = require('../../../extensions/zod.cjs');
|
|
7
7
|
|
|
8
8
|
zod.extendZod();
|
|
9
|
-
const refineName = n => n.match(/^[a-zA-Z']/);
|
|
10
9
|
const refineNameStrict = n => n.match(address.addressNameRegex);
|
|
11
10
|
const shipToAddressSchema = addressSchema.addressSchema.refine(schema => {
|
|
12
|
-
|
|
11
|
+
// KEEP THIS STRICT, USPS REQUIRES 2 CHARACTERS FOR FIRST AND LAST NAME
|
|
12
|
+
return refineNameStrict(schema.name);
|
|
13
13
|
}, {
|
|
14
|
-
message: "schemaErrors.
|
|
14
|
+
message: "schemaErrors.invalidAddressNameStrict",
|
|
15
15
|
path: ["name"]
|
|
16
16
|
}).refine(schema => !schema.phone || min.isValidPhoneNumber(schema.phone, schema.countryCode), {
|
|
17
17
|
message: "schemaErrors.notAValidPhoneNumber",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('@emotion/react/jsx-runtime');
|
|
4
|
+
var useToggle = require('../../../hooks/use-toggle.cjs');
|
|
4
5
|
var giger = require('@shipengine/giger');
|
|
5
6
|
var formLogger = require('../../../utilities/form-logger.cjs');
|
|
6
7
|
var validation = require('../../../utilities/validation.cjs');
|
|
@@ -10,19 +11,38 @@ var billingFields = require('../wallet-form/billing-fields.cjs');
|
|
|
10
11
|
var editBillingForm_styles = require('./edit-billing-form.styles.cjs');
|
|
11
12
|
var walletSchema = require('../wallet-form/wallet-schema.cjs');
|
|
12
13
|
var addressFields = require('../address-form/address-fields.cjs');
|
|
14
|
+
var addressDisplay = require('../../address-display/address-display.cjs');
|
|
15
|
+
var linkAction = require('../../link-action/link-action.cjs');
|
|
13
16
|
var buttonGroup = require('../../button-group/button-group.cjs');
|
|
14
17
|
var submitButton = require('../../field/submit-button/submit-button.cjs');
|
|
15
18
|
|
|
16
19
|
const EditBillingForm = ({
|
|
17
20
|
onCancel,
|
|
18
21
|
onSubmit,
|
|
19
|
-
isLoading
|
|
22
|
+
isLoading,
|
|
23
|
+
billingInfo
|
|
20
24
|
}) => {
|
|
25
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
21
26
|
const {
|
|
22
27
|
t
|
|
23
28
|
} = reactI18next.useTranslation();
|
|
29
|
+
const [editBillingInfo, toggleEditBillingInfo] = useToggle.useToggle(false);
|
|
24
30
|
const form = reactHookForm.useForm({
|
|
25
|
-
resolver: validation.validationResolver(walletSchema.getWalletSchema("emailRequired", "blackboxOptional"), ["creditCard"])
|
|
31
|
+
resolver: validation.validationResolver(walletSchema.getWalletSchema("emailRequired", "blackboxOptional"), ["creditCard"]),
|
|
32
|
+
defaultValues: {
|
|
33
|
+
address: {
|
|
34
|
+
name: (_a = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.fullName) !== null && _a !== void 0 ? _a : "",
|
|
35
|
+
companyName: (_b = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.company) !== null && _b !== void 0 ? _b : "",
|
|
36
|
+
addressLine1: (_c = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.addressLine1) !== null && _c !== void 0 ? _c : "",
|
|
37
|
+
addressLine2: (_d = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.addressLine2) !== null && _d !== void 0 ? _d : "",
|
|
38
|
+
cityLocality: (_e = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.cityLocality) !== null && _e !== void 0 ? _e : "",
|
|
39
|
+
stateProvince: (_f = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.stateProvince) !== null && _f !== void 0 ? _f : "",
|
|
40
|
+
postalCode: (_g = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.postalCode) !== null && _g !== void 0 ? _g : "",
|
|
41
|
+
countryCode: billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.countryCode,
|
|
42
|
+
email: (_h = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.email) !== null && _h !== void 0 ? _h : "",
|
|
43
|
+
phone: (_j = billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.phone) !== null && _j !== void 0 ? _j : ""
|
|
44
|
+
}
|
|
45
|
+
}
|
|
26
46
|
});
|
|
27
47
|
const handleSubmit = form.handleSubmit(values => {
|
|
28
48
|
const {
|
|
@@ -59,14 +79,47 @@ const EditBillingForm = ({
|
|
|
59
79
|
variant: "subtitle1",
|
|
60
80
|
children: t("register-wallet:settings.billing.subtitleBilling")
|
|
61
81
|
})
|
|
62
|
-
}), jsxRuntime.
|
|
82
|
+
}), billingInfo && !editBillingInfo && jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
83
|
+
children: [jsxRuntime.jsx(giger.GridChild, {
|
|
84
|
+
colSpan: 9,
|
|
85
|
+
children: jsxRuntime.jsx(addressDisplay.AddressDisplay, {
|
|
86
|
+
address: Object.assign(Object.assign({}, billingInfo), {
|
|
87
|
+
name: billingInfo.fullName,
|
|
88
|
+
companyName: billingInfo.company
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
}), jsxRuntime.jsx(giger.GridChild, {
|
|
92
|
+
colSpan: 3,
|
|
93
|
+
css: {
|
|
94
|
+
textAlign: "right"
|
|
95
|
+
},
|
|
96
|
+
children: jsxRuntime.jsx(linkAction.LinkAction, {
|
|
97
|
+
css: {
|
|
98
|
+
alignSelf: "end"
|
|
99
|
+
},
|
|
100
|
+
onClick: () => {
|
|
101
|
+
toggleEditBillingInfo(true);
|
|
102
|
+
form.reset({
|
|
103
|
+
address: Object.assign(Object.assign({}, billingInfo), {
|
|
104
|
+
name: billingInfo.fullName,
|
|
105
|
+
companyName: billingInfo.company,
|
|
106
|
+
countryCode: billingInfo.countryCode
|
|
107
|
+
})
|
|
108
|
+
}, {
|
|
109
|
+
keepDirtyValues: true
|
|
110
|
+
});
|
|
111
|
+
},
|
|
112
|
+
title: t("actions.edit")
|
|
113
|
+
})
|
|
114
|
+
})]
|
|
115
|
+
}), !billingInfo || editBillingInfo ? jsxRuntime.jsx(giger.GridChild, {
|
|
63
116
|
colSpan: 12,
|
|
64
117
|
children: jsxRuntime.jsx(addressFields.AddressFields, {
|
|
65
118
|
form: form,
|
|
66
119
|
formatFieldName: fieldName => `address.${fieldName}`,
|
|
67
120
|
optionalFields: ["addressLine2"]
|
|
68
121
|
})
|
|
69
|
-
}), jsxRuntime.jsx(giger.GridChild, {
|
|
122
|
+
}) : null, jsxRuntime.jsx(giger.GridChild, {
|
|
70
123
|
colSpan: 12,
|
|
71
124
|
children: jsxRuntime.jsxs(buttonGroup.ButtonGroup, {
|
|
72
125
|
justify: "end",
|
|
@@ -66,7 +66,7 @@ const ServiceCardHeader = ({
|
|
|
66
66
|
children: line1
|
|
67
67
|
}), line2 && jsxRuntime.jsx(giger.Typography, {
|
|
68
68
|
children: line2
|
|
69
|
-
}), line3 && jsxRuntime.jsx(
|
|
69
|
+
}), line3 && jsxRuntime.jsx("div", {
|
|
70
70
|
children: line3
|
|
71
71
|
})]
|
|
72
72
|
}), jsxRuntime.jsx("div", {
|
|
@@ -81,15 +81,15 @@ const ServiceCardHeader = ({
|
|
|
81
81
|
};
|
|
82
82
|
const ServiceCardFooter = ({
|
|
83
83
|
children,
|
|
84
|
-
messages
|
|
84
|
+
messages = []
|
|
85
85
|
}) => {
|
|
86
86
|
return jsxRuntime.jsxs("div", {
|
|
87
87
|
"data-testid": "service-card-footer",
|
|
88
88
|
children: [jsxRuntime.jsx(giger.Divider, {
|
|
89
89
|
css: serviceCard_styles.styles.divider
|
|
90
90
|
}), jsxRuntime.jsxs("section", {
|
|
91
|
-
css: serviceCard_styles.styles.
|
|
92
|
-
children: [messages && jsxRuntime.jsx("ul", {
|
|
91
|
+
css: serviceCard_styles.styles.footerStyles,
|
|
92
|
+
children: [messages.length > 0 && jsxRuntime.jsx("ul", {
|
|
93
93
|
css: [serviceCard_styles.styles.footerList, messages.length > 1 && serviceCard_styles.styles.footerListWithMultipleMessages],
|
|
94
94
|
children: messages.map((m, index) => jsxRuntime.jsxs("li", {
|
|
95
95
|
css: serviceCard_styles.styles.footerListItem,
|
|
@@ -16,8 +16,11 @@ const styles = styles$1.createStyles({
|
|
|
16
16
|
opacity: 0.3,
|
|
17
17
|
width: `calc(100% - ${styles$1.scopeTheme(theme).spacing(4)}px)`
|
|
18
18
|
}),
|
|
19
|
-
|
|
20
|
-
padding: styles$1.scopeTheme(theme).spacing(2)
|
|
19
|
+
footerStyles: theme => ({
|
|
20
|
+
padding: styles$1.scopeTheme(theme).spacing(2),
|
|
21
|
+
display: "flex",
|
|
22
|
+
flexDirection: "column",
|
|
23
|
+
gap: styles$1.scopeTheme(theme).spacing(2)
|
|
21
24
|
}),
|
|
22
25
|
footerList: {
|
|
23
26
|
listStyle: "none"
|
|
@@ -2,18 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('@emotion/react/jsx-runtime');
|
|
4
4
|
var giger = require('@shipengine/giger');
|
|
5
|
-
var gigerTheme = require('@shipengine/giger-theme');
|
|
6
|
-
var React = require('react');
|
|
7
5
|
var reactI18next = require('react-i18next');
|
|
8
6
|
var operatingHours = require('./operating-hours.cjs');
|
|
9
7
|
var servicePointDisplay_styles = require('./service-point-display.styles.cjs');
|
|
10
8
|
|
|
11
|
-
/* https://auctane.atlassian.net/browse/ENGINE-7329
|
|
12
|
-
* 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)
|
|
13
|
-
* carriersWithPaperless and servicesWithPaperless are hardcoded for iteration one
|
|
14
|
-
*/
|
|
15
|
-
const carriersWithPaperless = "hermes";
|
|
16
|
-
const servicesWithPaperless = ["hermes_domestic_parcelshop_dropoff", "hermes_domestic_parcelshop_dropoff_next_day", "hermes_postable", "hermes_postable_next_day"];
|
|
17
9
|
const formatDistance = meters => {
|
|
18
10
|
return meters < 1000 ? "< 1 km" : `${parseFloat((meters / 1000).toFixed(1))} km`;
|
|
19
11
|
};
|
|
@@ -27,36 +19,9 @@ const ServicePointDisplay = ({
|
|
|
27
19
|
const {
|
|
28
20
|
t
|
|
29
21
|
} = reactI18next.useTranslation("purchase-label");
|
|
30
|
-
const [isFilteredServicesWithPaperless, setIsFilteredServicesWithPaperless] = React.useState(false);
|
|
31
|
-
/* https://auctane.atlassian.net/browse/ENGINE-7329
|
|
32
|
-
* 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)
|
|
33
|
-
*/
|
|
34
|
-
React.useEffect(() => {
|
|
35
|
-
if (carriersWithPaperless === servicePoint.carrierCode) {
|
|
36
|
-
const filteredServicesWithPaperless = servicePoint.serviceCodes.map(serviceCode => {
|
|
37
|
-
return servicesWithPaperless.filter(service => service === serviceCode);
|
|
38
|
-
}).length > 0;
|
|
39
|
-
setIsFilteredServicesWithPaperless(filteredServicesWithPaperless);
|
|
40
|
-
}
|
|
41
|
-
}, [servicePoint.carrierCode, servicePoint.serviceCodes]);
|
|
42
22
|
return jsxRuntime.jsxs("div", {
|
|
43
23
|
css: servicePointDisplay_styles.styles.container,
|
|
44
|
-
children: [
|
|
45
|
-
css: servicePointDisplay_styles.styles.paperlessWrapper,
|
|
46
|
-
children: [jsxRuntime.jsx(giger.Icon, {
|
|
47
|
-
css: servicePointDisplay_styles.styles.paperlessIcon,
|
|
48
|
-
name: gigerTheme.IconNames.PRINTER,
|
|
49
|
-
size: giger.IconSize.SIZE_MEDIUM
|
|
50
|
-
}), jsxRuntime.jsx(giger.Icon, {
|
|
51
|
-
css: servicePointDisplay_styles.styles.paperlessIcon,
|
|
52
|
-
name: gigerTheme.IconNames.SCAN_QR,
|
|
53
|
-
size: giger.IconSize.SIZE_MEDIUM
|
|
54
|
-
}), jsxRuntime.jsx(giger.Typography, {
|
|
55
|
-
css: servicePointDisplay_styles.styles.paperlessText,
|
|
56
|
-
variant: "small",
|
|
57
|
-
children: t("servicePoints.paperless")
|
|
58
|
-
})]
|
|
59
|
-
}), jsxRuntime.jsx("div", {
|
|
24
|
+
children: [jsxRuntime.jsx("div", {
|
|
60
25
|
css: servicePointDisplay_styles.styles.getSelectedStyles(),
|
|
61
26
|
children: jsxRuntime.jsx(giger.Typography, {
|
|
62
27
|
bold: true,
|