diff --git a/src/components/BirthdayInputField/BirthdayInputField.example.js b/src/components/BirthdayInputField/BirthdayInputField.example.js index 13a989cf..c82ff930 100644 --- a/src/components/BirthdayInputField/BirthdayInputField.example.js +++ b/src/components/BirthdayInputField/BirthdayInputField.example.js @@ -8,6 +8,8 @@ const formName = 'Styleguide.BirthdayInput.Form'; const FormComponent = () => { const required = validators.required('A valid date is required'); + const minAge = 18; + const minAgeRequired = validators.ageAtLeast(`Age should be at least ${minAge}`, minAge); return (
); diff --git a/src/containers/PayoutDetailsForm/PayoutDetailsForm.js b/src/containers/PayoutDetailsForm/PayoutDetailsForm.js index 5b3da997..1c134b9e 100644 --- a/src/containers/PayoutDetailsForm/PayoutDetailsForm.js +++ b/src/containers/PayoutDetailsForm/PayoutDetailsForm.js @@ -17,6 +17,8 @@ import * as validators from '../../util/validators'; import css from './PayoutDetailsForm.css'; +const MIN_STRIPE_ACCOUNT_AGE = 18; + const supportedCountries = config.stripe.supportedCountries.map(c => c.code); export const stripeCountryConfigs = countryCode => { @@ -78,6 +80,17 @@ const PayoutDetailsFormComponent = props => { id: 'PayoutDetailsForm.birthdayRequired', }) ); + const birthdayMinAge = validators.ageAtLeast( + intl.formatMessage( + { + id: 'PayoutDetailsForm.birthdayMinAge', + }, + { + minAge: MIN_STRIPE_ACCOUNT_AGE, + } + ), + MIN_STRIPE_ACCOUNT_AGE + ); const countryLabel = intl.formatMessage({ id: 'PayoutDetailsForm.countryLabel' }); const countryPlaceholder = intl.formatMessage({ id: 'PayoutDetailsForm.countryPlaceholder' }); @@ -218,7 +231,7 @@ const PayoutDetailsFormComponent = props => { labelForMonth={birthdayLabelMonth} labelForYear={birthdayLabelYear} format={null} - validate={birthdayRequired} + validate={[birthdayRequired, birthdayMinAge]} /> diff --git a/src/translations/en.json b/src/translations/en.json index 3bd4f990..5359f8ec 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -317,6 +317,7 @@ "PayoutDetailsForm.birthdayLabel": "Birth date", "PayoutDetailsForm.birthdayLabelMonth": "Month", "PayoutDetailsForm.birthdayLabelYear": "Year", + "PayoutDetailsForm.birthdayMinAge": "You should be at least {minAge} years old.", "PayoutDetailsForm.birthdayMonthPlaceholder": "mm", "PayoutDetailsForm.birthdayRequired": "Birthday is required and must be a valid date.", "PayoutDetailsForm.birthdayYearPlaceholder": "yyyy", diff --git a/src/util/validators.js b/src/util/validators.js index 0e916365..9fedaaa9 100644 --- a/src/util/validators.js +++ b/src/util/validators.js @@ -1,3 +1,4 @@ +import moment from 'moment'; import { types } from 'sharetribe-sdk'; const { LatLng } = types; @@ -68,3 +69,10 @@ export const emailFormatValid = message => value => { return value && EMAIL_RE.test(value) ? VALID : message; }; + +export const ageAtLeast = (message, minYears) => + value => { + const now = moment(); + const ageInYears = now.diff(moment(value), 'years', true); + return value && value instanceof Date && ageInYears >= minYears ? VALID : message; + };