@financial-times/n-conversion-forms
Version:
Containing jsx components and styles for forms included on Accounts and Acquisition apps (next-signup, next-profile, next-retention, etc).
164 lines (157 loc) • 4.2 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import deliveryAddressMap from './delivery-address-map';
import {
addressLine1AutoComplete,
addressLine2AutoComplete,
addressLine3AutoComplete,
} from '../helpers/constants';
import { identifyShippingZone } from '../helpers/supportedCountries';
export function DeliveryAddress({
fieldId = 'deliveryAddressFields',
hasError = false,
line1 = '',
line2 = '',
line3 = '',
isDisabled = false,
isHidden = false,
country = 'GBR',
addressType = 'home',
}) {
const divClassNames = classNames([{ ncf__hidden: isHidden }]);
const inputWrapperClassNames = classNames([
'o-forms-input',
'o-forms-input--text',
{ 'o-forms-input--invalid': hasError },
]);
const shippingZone = identifyShippingZone(country);
const addressLine1 = (
<label
className="o-forms-field ncf__validation-error"
htmlFor="deliveryAddressLine1"
>
<span className="o-forms-title">
<span className="o-forms-title__main">
{deliveryAddressMap[addressType].addressLine1Title[shippingZone] ||
'Address line 1'}
</span>
</span>
<span className={inputWrapperClassNames}>
<input
type="text"
id="deliveryAddressLine1"
name="deliveryAddressLine1"
data-trackable="field-deliveryAddressLine1"
autoComplete={addressLine1AutoComplete}
placeholder={
deliveryAddressMap[addressType].addressLine1Placeholder[
shippingZone
] || ''
}
maxLength={50}
aria-required="true"
required
disabled={isDisabled}
defaultValue={line1}
/>
<span className="o-forms-input__error">
Please enter a valid address
</span>
</span>
</label>
);
const addressLine2 = (
<label
className="o-forms-field o-forms-field--optional"
htmlFor="deliveryAddressLine2"
>
<span className="o-forms-title">
<span className="o-forms-title__main">Address line 2</span>
</span>
<span className={inputWrapperClassNames}>
<input
type="text"
id="deliveryAddressLine2"
name="deliveryAddressLine2"
data-trackable="field-deliveryAddressLine2"
autoComplete={
deliveryAddressMap[addressType].addressLine2AutoComplete[
shippingZone
] || addressLine2AutoComplete
}
placeholder={
deliveryAddressMap[addressType].addressLine2Placeholder[
shippingZone
] || ''
}
maxLength={50}
disabled={isDisabled}
defaultValue={line2}
/>
</span>
</label>
);
const addressLine3 = (
<label
className="o-forms-field o-forms-field--optional"
htmlFor="deliveryAddressLine3"
>
<span className="o-forms-title">
<span className="o-forms-title__main">
{deliveryAddressMap[addressType].addressLine3Title[shippingZone] ||
'Address line 3'}
</span>
<span className="o-forms-title__prompt">
{deliveryAddressMap[addressType].addressLine3Prompt[shippingZone] ||
''}
</span>
</span>
<span className={inputWrapperClassNames}>
<input
type="text"
id="deliveryAddressLine3"
name="deliveryAddressLine3"
data-trackable="field-deliveryAddressLine3"
autoComplete={
deliveryAddressMap[addressType].addressLine3AutoComplete[
shippingZone
] || addressLine3AutoComplete
}
placeholder={
deliveryAddressMap[addressType].addressLine3Placeholder[
shippingZone
] || 'e.g. Apt. 1'
}
maxLength={
deliveryAddressMap[addressType].addressLine3MaxLength[country] || 50
}
disabled={isDisabled}
defaultValue={line3}
/>
</span>
</label>
);
const addressLines = deliveryAddressMap[addressType].template(
addressLine1,
addressLine2,
addressLine3,
shippingZone
);
return (
<div id={fieldId} data-validate="required" className={divClassNames}>
{addressLines}
</div>
);
}
DeliveryAddress.propTypes = {
fieldId: PropTypes.string,
hasError: PropTypes.bool,
line1: PropTypes.string,
line2: PropTypes.string,
line3: PropTypes.string,
isDisabled: PropTypes.bool,
isHidden: PropTypes.bool,
country: PropTypes.string,
addressType: PropTypes.oneOf(['home', 'company', 'pobox']),
};