AddressForm
The AddressForm component provides a pre-built UI for collecting billing address information. It integrates seamlessly with react-hook-form and includes built-in, country-specific validation for fields like postal codes.
This component is designed to be flexible, supporting both full address collection and a simplified version for Stripe postal code verification.
Props#
Prop | Type | Description | Default |
|---|---|---|---|
|
| Determines the fields to display. Set to |
|
|
| If |
|
|
| MUI's |
|
|
| An object for providing custom validation rules, such as regex patterns, for specific fields. See the validation section for details. |
|
|
| Specifies where to display validation error messages relative to the input field. |
|
Usage#
AddressForm must be used within a FormProvider from react-hook-form because it relies on its context to register fields and manage state.
Standard Billing Address#
To collect a full billing address, set the mode prop to 'required'. This will render all standard address fields, each with a 'required' validation rule.
AddressForm with Full Address
import { FormProvider, useForm } from 'react-hook-form';
import { Button, Stack } from '@mui/material';
import AddressForm from './AddressForm'; // Adjust the import path
export default function FullAddressExample() {
const methods = useForm({
defaultValues: {
billing_address: {
line1: '',
city: '',
state: '',
postal_code: '',
country: 'US', // Default country
},
},
});
const onSubmit = (data) => {
console.log('Form data:', data);
};
return (
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit(onSubmit)}>
<Stack spacing={2}>See all 9 lines
This setup renders input fields for the address line, city, state, and postal code. The country is selected via the integrated CountrySelect component.
Stripe Postal Code Verification#
When using payment methods like Stripe, you often only need the postal code and country for card verification. Set the stripe prop to true to render a simplified form containing only these two fields.
AddressForm for Stripe
import { FormProvider, useForm } from 'react-hook-form';
import { Button, Stack } from '@mui/material';
import AddressForm from './AddressForm'; // Adjust the import path
export default function StripeAddressExample() {
const methods = useForm({
defaultValues: {
billing_address: {
postal_code: '',
country: 'US', // Default country
},
},
});
const onSubmit = (data) => {
console.log('Form data:', data);
};
return (
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit(onSubmit)}>
<Stack spacing={2}>
<AddressForm stripe={true} />
<Button type="submit" variant="contained">
SubmitSee all 6 lines
Validation#
The component includes automatic validation for required fields. The most notable feature is the dynamic postal code validation, which adjusts its rules based on the selected country.
- Required Fields: All visible fields are automatically marked as required.
- Postal Code: The validation logic uses the
validator/lib/isPostalCodelibrary. It checks the postal code format against the selected country's standard format (e.g., 5 digits for the US, alphanumeric for Canada). If a country's format is not explicitly supported, a general validation is applied. - Custom Validation: You can pass additional validation rules via the
fieldValidationprop. For example, to enforce a specific pattern on thestatefield:
const customValidation = {
'billing_address.state': {
pattern: '^[A-Z]{2}$',
pattern_message: {
en: 'State must be a 2-letter code.',
},
},
};
<AddressForm mode="required" fieldValidation={customValidation} />;