diff --git a/lerna.json b/lerna.json index b9868e36..5cef670c 100644 --- a/lerna.json +++ b/lerna.json @@ -2,7 +2,7 @@ "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useNx": false, "npmClient": "pnpm", - "version": "4.14.5", + "version": "4.15.0-beta.3", "command": { "version": { "preid": "beta" diff --git a/packages/docs/stories/examples/checkout/002.addresses.stories.tsx b/packages/docs/stories/examples/checkout/002.addresses.stories.tsx index edec82fe..e8d9b8f5 100644 --- a/packages/docs/stories/examples/checkout/002.addresses.stories.tsx +++ b/packages/docs/stories/examples/checkout/002.addresses.stories.tsx @@ -274,20 +274,7 @@ export const CustomerInvertAddresses: StoryFn = (args) => { {/* Use `key` to re-render the ShippingAddressForm once we have the order from `fetchOrder`. */} {/* When you are in your own project, you can retrieve the order before rendering the form. */} - { - const textWithSpace = /^[a-zA-Z0-9\s]{1,20}$/ - console.log('props.value', props.value) - if ( - props.field === 'shipping_address_line_1' && - !textWithSpace.test(props.value) - ) { - return 'Validation error - The address should be 1-20 characters long - this is a custom message' - } - return null - }} - > +
+
+
+ + + +
+ +
+ + + +
+
+
+
+ + + +
+ +
+ + + +
+
diff --git a/packages/react-components/package.json b/packages/react-components/package.json index c62f9f2e..0e091124 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -1,6 +1,6 @@ { "name": "@commercelayer/react-components", - "version": "4.14.5", + "version": "4.15.0-beta.3", "description": "The Official Commerce Layer React Components", "main": "lib/cjs/index.js", "module": "lib/esm/index.js", diff --git a/packages/react-components/src/components/addresses/AddressStateSelector.tsx b/packages/react-components/src/components/addresses/AddressStateSelector.tsx index 45393d00..ec900e47 100644 --- a/packages/react-components/src/components/addresses/AddressStateSelector.tsx +++ b/packages/react-components/src/components/addresses/AddressStateSelector.tsx @@ -203,18 +203,27 @@ export function AddressStateSelector(props: Props): JSX.Element { /> ) : ( { + setVal(e.target.value) + if (billingAddress.setValue != null) { + billingAddress.setValue(name, e.target.value) + } + if (shippingAddress.setValue != null) { + shippingAddress.setValue(name, e.target.value) + } + }} /> ) } diff --git a/packages/react-components/src/components/addresses/BillingAddressForm.tsx b/packages/react-components/src/components/addresses/BillingAddressForm.tsx index 8bc2a72e..665aa22c 100644 --- a/packages/react-components/src/components/addresses/BillingAddressForm.tsx +++ b/packages/react-components/src/components/addresses/BillingAddressForm.tsx @@ -91,22 +91,53 @@ export function BillingAddressForm(props: Props): JSX.Element { fieldName != null && value != null ) { + values[fieldName.replace('shipping_address_', '')] = value const customMessage = customFieldMessageError({ field: fieldName, - value + value, + values }) if (customMessage != null) { - if (inError) { - const errorMsg = errors[fieldName]?.message - if (errorMsg != null && errorMsg !== customMessage) { - // @ts-expect-error no type - errors[fieldName].message = customMessage + if (typeof customMessage === 'string') { + if (inError) { + const errorMsg = errors[fieldName]?.message + if (errorMsg != null && errorMsg !== customMessage) { + // @ts-expect-error no type + errors[fieldName].message = customMessage + } + } else { + setErrorForm({ + name: fieldName, + code: 'VALIDATION_ERROR', + message: customMessage + }) } } else { - setErrorForm({ - name: fieldName, - code: 'VALIDATION_ERROR', - message: customMessage + const elements = customMessage + elements.forEach((element) => { + const { field, value, isValid, message } = element + const fieldInError = errors[field] != null + if (!isValid) { + if (fieldInError) { + const errorMsg = errors[field]?.message + if (errorMsg != null && errorMsg !== message) { + // @ts-expect-error no type + errors[field].message = message + setValueForm(field, value ?? '') + } + } else { + setErrorForm({ + name: field, + code: 'VALIDATION_ERROR', + message: message + }) + } + } else { + if (fieldInError) { + delete errors[field] + setValueForm(field, value ?? '') + } + } }) } } @@ -119,26 +150,12 @@ export function BillingAddressForm(props: Props): JSX.Element { for (const fieldName in errors) { const code = errors[fieldName]?.code const message = errors[fieldName]?.message - if (['billing_address_state_code'].includes(fieldName)) { - if (!values?.['state_code']) { - // eslint-disable-next-line @typescript-eslint/no-dynamic-delete - delete errors[fieldName] - } else { - formErrors.push({ - code: code as CodeErrorType, - message: message || '', - resource: 'billing_address', - field: fieldName - }) - } - } else { - formErrors.push({ - code: code as CodeErrorType, - message: message ?? '', - resource: 'billing_address', - field: fieldName - }) - } + formErrors.push({ + code: code as CodeErrorType, + message: message ?? '', + resource: 'billing_address', + field: fieldName + }) } setAddressErrors(formErrors, 'billing_address') } else if (values && Object.keys(values).length > 0) { diff --git a/packages/react-components/src/components/addresses/ShippingAddressForm.tsx b/packages/react-components/src/components/addresses/ShippingAddressForm.tsx index 72451991..1491782b 100644 --- a/packages/react-components/src/components/addresses/ShippingAddressForm.tsx +++ b/packages/react-components/src/components/addresses/ShippingAddressForm.tsx @@ -90,22 +90,53 @@ export function ShippingAddressForm(props: Props): JSX.Element { fieldName != null && value != null ) { + values[fieldName.replace('shipping_address_', '')] = value const customMessage = customFieldMessageError({ field: fieldName, - value + value, + values }) if (customMessage != null) { - if (inError) { - const errorMsg = errors[fieldName]?.message - if (errorMsg != null && errorMsg !== customMessage) { - // @ts-expect-error no type - errors[fieldName].message = customMessage + if (typeof customMessage === 'string') { + if (inError) { + const errorMsg = errors[fieldName]?.message + if (errorMsg != null && errorMsg !== customMessage) { + // @ts-expect-error no type + errors[fieldName].message = customMessage + } + } else { + setErrorForm({ + name: fieldName, + code: 'VALIDATION_ERROR', + message: customMessage + }) } } else { - setErrorForm({ - name: fieldName, - code: 'VALIDATION_ERROR', - message: customMessage + const elements = customMessage + elements.forEach((element) => { + const { field, value, isValid, message } = element + const fieldInError = errors[field] != null + if (!isValid) { + if (fieldInError) { + const errorMsg = errors[field]?.message + if (errorMsg != null && errorMsg !== message) { + // @ts-expect-error no type + errors[field].message = message + setValueForm(field, value ?? '') + } + } else { + setErrorForm({ + name: field, + code: 'VALIDATION_ERROR', + message: message + }) + } + } else { + if (fieldInError) { + delete errors[field] + setValueForm(field, value ?? '') + } + } }) } } @@ -118,26 +149,12 @@ export function ShippingAddressForm(props: Props): JSX.Element { for (const fieldName in errors) { const code = errors[fieldName]?.code const message = errors[fieldName]?.message - if (['shipping_address_state_code'].includes(fieldName)) { - if (!values['state_code']) { - // eslint-disable-next-line @typescript-eslint/no-dynamic-delete - delete errors[fieldName] - } else { - formErrors.push({ - code: code as CodeErrorType, - message: message || '', - resource: 'shipping_address', - field: fieldName - }) - } - } else { - formErrors.push({ - code: code as CodeErrorType, - message: message ?? '', - resource: 'shipping_address', - field: fieldName - }) - } + formErrors.push({ + code: code as CodeErrorType, + message: message ?? '', + resource: 'shipping_address', + field: fieldName + }) } if (shipToDifferentAddress || invertAddresses) { setAddressErrors(formErrors, 'shipping_address') diff --git a/packages/react-components/src/reducers/AddressReducer.ts b/packages/react-components/src/reducers/AddressReducer.ts index fa565625..cacaf307 100644 --- a/packages/react-components/src/reducers/AddressReducer.ts +++ b/packages/react-components/src/reducers/AddressReducer.ts @@ -24,7 +24,13 @@ export type CustomFieldMessageError = (props: { code?: Extract | undefined message?: string | undefined value: string -}) => string | null + values?: Record +}) => string | null | { + field: Extract | string + value: string + isValid: boolean + message?: string +}[] export type AddressActionType = | 'setErrors'