UNPKG

@financial-times/n-conversion-forms

Version:

Containing jsx components and styles for forms included on Accounts and Acqusition apps (next-signup, next-profile, next-retention, etc).

140 lines (130 loc) 3.72 kB
import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { countriesSupported } from '../helpers/supportedCountries'; import { allSupportedPostcodeExamples } from '../helpers/supportedPostcodeExamples'; const postcodeLabel = Object.keys(countriesSupported).reduce( (previous, countryCode) => { if (countryCode === 'USA') { previous[countryCode] = 'Zip Code'; } else if (countryCode === 'GBR') { previous[countryCode] = 'Postcode'; } else { previous[countryCode] = 'Postal Code'; } return previous; }, {} ); const promptLabel = Object.keys(countriesSupported).reduce( (previous, countryCode) => { if (countryCode === 'USA') { previous[countryCode] = 'Please enter your 5 digit Zip Code'; } else if (countryCode === 'CAN') { previous[countryCode] = 'Please enter your 6 digit postal code'; } else if (countryCode !== 'GBR') { //GBR has no label previous[countryCode] = 'Please enter your postal code'; } return previous; }, {} ); const placeholderLabel = Object.keys(allSupportedPostcodeExamples).reduce( (previous, countryCode) => { previous[countryCode] = 'e.g. ' + allSupportedPostcodeExamples[countryCode]; return previous; }, {} ); export function DeliveryPostcode({ value = '', country = '', isDisabled = false, hasError = false, isHidden = false, pattern, additionalFieldInformation, changePostcodeUrl = '', }) { const postcodeReference = postcodeLabel[country.toUpperCase()] || 'Postcode'; const promptReference = promptLabel[country.toUpperCase()]; const placeholderReference = placeholderLabel[country.toUpperCase()] || `Enter your ${postcodeReference}`; const inputWrapperClassNames = classNames([ 'o-forms-input', 'o-forms-input--text', { 'o-forms-input--invalid': hasError }, ]); const deliveryPostcodeFieldClassNames = classNames([ 'o-forms-field', { ncf__hidden: isHidden }, ]); const fieldErrorClassNames = classNames([ 'o-forms-input__error', { 'additional-field-information__with-field-error': additionalFieldInformation, }, ]); return ( <label id="deliveryPostcodeField" className={deliveryPostcodeFieldClassNames} data-validate="required" htmlFor="deliveryPostcode" > <span className="o-forms-title"> <span className="o-forms-title__main"> <span data-reference="postcode">{postcodeReference}</span> </span> <span className="o-forms-title__prompt">{promptReference}</span> </span> <span className={inputWrapperClassNames}> <input type="text" id="deliveryPostcode" name="deliveryPostcode" defaultValue={`${value}`} placeholder={placeholderReference} autoComplete="postal-code" data-trackable="delivery-postcode" aria-required="true" required pattern={pattern} disabled={isDisabled} /> <span className={fieldErrorClassNames}> Please enter a valid{' '} <span data-reference="postcode">{postcodeReference}</span>. </span> {additionalFieldInformation ? ( <p className="additional-field-information"> {additionalFieldInformation} </p> ) : null} {changePostcodeUrl ? ( <a href={changePostcodeUrl} style={{ fontSize: '12px' }} className="change-postcode-url" data-trackable="change-progress" > {`Change ${postcodeReference}`} </a> ) : null} </span> </label> ); } DeliveryPostcode.propTypes = { country: PropTypes.string, value: PropTypes.string, pattern: PropTypes.string, isDisabled: PropTypes.bool, hasError: PropTypes.bool, isHidden: PropTypes.bool, additionalFieldInformation: PropTypes.node, changePostcodeUrl: PropTypes.string, };