diff --git a/src/components/DatePicker/index.tsx b/src/components/DatePicker/index.tsx index b7c871d4a9381..96047d4f55786 100644 --- a/src/components/DatePicker/index.tsx +++ b/src/components/DatePicker/index.tsx @@ -35,10 +35,10 @@ type DatePickerProps = { maxDate?: Date; /** A function that is passed by FormWrapper */ - onInputChange: (value: Date) => void; + onInputChange?: (value: Date) => void; /** A function that is passed by FormWrapper */ - onTouched: () => void; + onTouched?: () => void; /** Saves a draft of the input value when used in a form */ shouldSaveDraft?: boolean; diff --git a/src/pages/settings/Profile/PersonalDetails/DateOfBirthPage.tsx b/src/pages/settings/Profile/PersonalDetails/DateOfBirthPage.tsx index 5e8e4ea493a0b..fed313b69c7ef 100644 --- a/src/pages/settings/Profile/PersonalDetails/DateOfBirthPage.tsx +++ b/src/pages/settings/Profile/PersonalDetails/DateOfBirthPage.tsx @@ -1,76 +1,50 @@ +import {subYears} from 'date-fns'; import React, {useCallback} from 'react'; -import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; +import DatePicker from '@components/DatePicker'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; import type {FormOnyxValues} from '@components/Form/types'; import FullscreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; -import TextInput from '@components/TextInput'; import useLocalize from '@hooks/useLocalize'; import usePrivatePersonalDetails from '@hooks/usePrivatePersonalDetails'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as ErrorUtils from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import * as ValidationUtils from '@libs/ValidationUtils'; import * as PersonalDetails from '@userActions/PersonalDetails'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import INPUT_IDS from '@src/types/form/LegalNameForm'; +import INPUT_IDS from '@src/types/form/DateOfBirthForm'; import type {PrivatePersonalDetails} from '@src/types/onyx'; -import type {Errors} from '@src/types/onyx/OnyxCommon'; -type LegalNamePageOnyxProps = { +type DateOfBirthPageOnyxProps = { /** User's private personal details */ privatePersonalDetails: OnyxEntry; }; +type DateOfBirthPageProps = DateOfBirthPageOnyxProps; -type LegalNamePageProps = LegalNamePageOnyxProps; - -const updateLegalName = (values: PrivatePersonalDetails) => { - PersonalDetails.updateLegalName(values.legalFirstName?.trim() ?? '', values.legalLastName?.trim() ?? ''); -}; - -function LegalNamePage({privatePersonalDetails}: LegalNamePageProps) { - const styles = useThemeStyles(); +function DateOfBirthPage({privatePersonalDetails}: DateOfBirthPageProps) { const {translate} = useLocalize(); + const styles = useThemeStyles(); usePrivatePersonalDetails(); - const legalFirstName = privatePersonalDetails?.legalFirstName ?? ''; - const legalLastName = privatePersonalDetails?.legalLastName ?? ''; const isLoadingPersonalDetails = privatePersonalDetails?.isLoading ?? true; - const validate = useCallback((values: FormOnyxValues) => { - const errors: Errors = {}; + /** + * @returns An object containing the errors for each inputID + */ + const validate = useCallback((values: FormOnyxValues) => { + const requiredFields = ['dob' as const]; + const errors = ValidationUtils.getFieldRequiredErrors(values, requiredFields); - if (typeof values.legalFirstName === 'string') { - if (!ValidationUtils.isValidLegalName(values.legalFirstName)) { - ErrorUtils.addErrorMessage(errors, 'legalFirstName', 'privatePersonalDetails.error.hasInvalidCharacter'); - } else if (!values.legalFirstName) { - errors.legalFirstName = 'common.error.fieldRequired'; - } else if (values.legalFirstName.length > CONST.TITLE_CHARACTER_LIMIT) { - ErrorUtils.addErrorMessage(errors, 'legalFirstName', [ - 'common.error.characterLimitExceedCounter', - {length: values.legalFirstName.length, limit: CONST.TITLE_CHARACTER_LIMIT}, - ]); - } - if (ValidationUtils.doesContainReservedWord(values.legalFirstName, CONST.DISPLAY_NAME.RESERVED_NAMES)) { - ErrorUtils.addErrorMessage(errors, 'legalFirstName', 'personalDetails.error.containsReservedWord'); - } - } + const minimumAge = CONST.DATE_BIRTH.MIN_AGE; + const maximumAge = CONST.DATE_BIRTH.MAX_AGE; + const dateError = ValidationUtils.getAgeRequirementError(values.dob ?? '', minimumAge, maximumAge); - if (typeof values.legalLastName === 'string') { - if (!ValidationUtils.isValidLegalName(values.legalLastName)) { - ErrorUtils.addErrorMessage(errors, 'legalLastName', 'privatePersonalDetails.error.hasInvalidCharacter'); - } else if (!values.legalLastName) { - errors.legalLastName = 'common.error.fieldRequired'; - } else if (values.legalLastName.length > CONST.TITLE_CHARACTER_LIMIT) { - ErrorUtils.addErrorMessage(errors, 'legalLastName', ['common.error.characterLimitExceedCounter', {length: values.legalLastName.length, limit: CONST.TITLE_CHARACTER_LIMIT}]); - } - if (ValidationUtils.doesContainReservedWord(values.legalLastName, CONST.DISPLAY_NAME.RESERVED_NAMES)) { - ErrorUtils.addErrorMessage(errors, 'legalLastName', 'personalDetails.error.containsReservedWord'); - } + if (values.dob && dateError) { + errors.dob = dateError; } return errors; @@ -79,11 +53,10 @@ function LegalNamePage({privatePersonalDetails}: LegalNamePageProps) { return ( Navigation.goBack()} /> {isLoadingPersonalDetails ? ( @@ -91,46 +64,30 @@ function LegalNamePage({privatePersonalDetails}: LegalNamePageProps) { ) : ( - - - - - - + )} ); } -LegalNamePage.displayName = 'LegalNamePage'; +DateOfBirthPage.displayName = 'DateOfBirthPage'; -export default withOnyx({ +export default withOnyx({ privatePersonalDetails: { key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS, }, -})(LegalNamePage); +})(DateOfBirthPage);