diff --git a/packages/account/src/Components/forms/form-fields.jsx b/packages/account/src/Components/forms/form-fields.jsx deleted file mode 100644 index 00f0f728df19..000000000000 --- a/packages/account/src/Components/forms/form-fields.jsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; -import { Field } from 'formik'; -import { DateOfBirthPicker, Input } from '@deriv/components'; -import { toMoment } from '@deriv/shared'; - -export const DateOfBirthField = ({ name, portal_id, ...rest }) => ( - - {({ field: { value }, form: { setFieldValue, errors, touched, setFieldTouched } }) => ( - setFieldTouched(name)} - onChange={({ target }) => - setFieldValue(name, target?.value ? toMoment(target.value).format('YYYY-MM-DD') : '', true) - } - value={value} - portal_id={portal_id} - {...rest} - /> - )} - -); - -export const FormInputField = ({ name, optional = false, warn, ...rest }) => ( - - {({ field, form: { errors, touched } }) => ( - - )} - -); diff --git a/packages/account/src/Components/forms/form-fields/__tests__/date-of-birth-field.spec.tsx b/packages/account/src/Components/forms/form-fields/__tests__/date-of-birth-field.spec.tsx new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/account/src/Components/forms/form-fields/__tests__/form-input-field.spec.tsx b/packages/account/src/Components/forms/form-fields/__tests__/form-input-field.spec.tsx new file mode 100644 index 000000000000..00fa36a34253 --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/__tests__/form-input-field.spec.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import FormInputField from '../form-input-field'; +import { Formik } from 'formik'; + +describe('Tesing component', () => { + it('should render properties', () => { + const props = { + name: 'test-name', + optional: true, + }; + render( + + + + ); + + expect(screen.getByRole('textbox')).toBeInTheDocument(); + }); + + it('should render Input field with optional status', () => { + const props = { + name: 'test-name', + optional: true, + }; + render( + + + + ); + + expect(screen.getByRole('textbox')).toBeInTheDocument(); + expect(screen.getByRole('textbox')).not.toBeRequired(); + }); +}); diff --git a/packages/account/src/Components/forms/form-fields/date-of-birth-field.tsx b/packages/account/src/Components/forms/form-fields/date-of-birth-field.tsx new file mode 100644 index 000000000000..fc10f30db161 --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/date-of-birth-field.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { Field, FieldInputProps, FormikHelpers, FormikState } from 'formik'; +import { DateOfBirthPicker, TDatePickerOnChangeEvent } from '@deriv/components'; +import { toMoment } from '@deriv/shared'; + +type TDateOfBirthFieldProps = { + name: string; + portal_id: string; +} & React.ComponentProps; + +type TDateOfBirthFieldHelpers = { + field: FieldInputProps; + form: FormikHelpers<{ date_of_birth: string | moment.Moment }> & + FormikState<{ date_of_birth: string | moment.Moment }>; +}; + +/** + * DateOfBirthField is a wrapper around DateOfBirthPicker that can be used with Formik. + * @name DateOfBirthField + * @param {string} name - Name of the field + * @param {string} portal_id - Portal ID + * @param {TDatePicker} [props] - Other props to pass to DateOfBirthPicker + * @returns {React.ReactNode} + */ +const DateOfBirthField = ({ name, portal_id, ...rest }: TDateOfBirthFieldProps) => ( + + {({ + field: { value }, + form: { setFieldValue, errors, touched, setFieldTouched }, + }: TDateOfBirthFieldHelpers) => ( + setFieldTouched(name)} + onChange={({ target }: TDatePickerOnChangeEvent) => + setFieldValue(name, target?.value ? toMoment(target.value).format('YYYY-MM-DD') : '', true) + } + value={value} + portal_id={portal_id} + /> + )} + +); + +export default DateOfBirthField; diff --git a/packages/account/src/Components/forms/form-fields/form-input-field.tsx b/packages/account/src/Components/forms/form-fields/form-input-field.tsx new file mode 100644 index 000000000000..15f1942e27d9 --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/form-input-field.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { FieldInputProps, FormikHelpers, FormikState, Field } from 'formik'; +import { Input } from '@deriv/components'; + +type FormInputFieldProps = { + name: string; + optional?: boolean; + warn?: string; +} & React.ComponentProps; + +type TFormInputFieldHelpers = { + field: FieldInputProps; + form: FormikHelpers> & FormikState>; +}; + +/** + * FormInputField is a wrapper around Input that can be used with Formik. + * @name FormInputField + * @param {string} name - Name of the field + * @param {boolean} [optional] - Whether the field is optional + * @param {string} [warn] - Display a warning message + * @param {Input} [props] - Other props to pass to Input + * @returns {React.ReactNode} + */ +const FormInputField = ({ name, optional = false, warn, ...rest }: FormInputFieldProps) => ( + + {({ field, form: { errors, touched } }: TFormInputFieldHelpers) => ( + + )} + +); + +export default FormInputField; diff --git a/packages/account/src/Components/forms/form-fields/index.ts b/packages/account/src/Components/forms/form-fields/index.ts new file mode 100644 index 000000000000..8ecb3a2bce22 --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/index.ts @@ -0,0 +1,4 @@ +import FormInputField from './form-input-field'; +import DateOfBirthField from './date-of-birth-field'; + +export { FormInputField, DateOfBirthField }; diff --git a/packages/components/src/components/date-picker/date-picker.tsx b/packages/components/src/components/date-picker/date-picker.tsx index f3934fad7ec6..48f18e94678e 100644 --- a/packages/components/src/components/date-picker/date-picker.tsx +++ b/packages/components/src/components/date-picker/date-picker.tsx @@ -7,12 +7,8 @@ import MobileWrapper from '../mobile-wrapper'; import DesktopWrapper from '../desktop-wrapper'; import { useOnClickOutside } from '../../hooks/use-onclickoutside'; import { MomentInput } from 'moment'; +import { TDatePickerOnChangeEvent } from '../types'; -type TDatePickerOnChangeEvent = { - date?: string; - duration?: number | null | string; - target?: { name: string; value: number | string | moment.Moment | null }; -}; type TDatePicker = Omit< React.ComponentProps & React.ComponentProps & React.ComponentProps, 'value' | 'onSelect' | 'is_datepicker_visible' | 'placement' | 'style' | 'calendar_el_ref' | 'parent_ref' diff --git a/packages/components/src/components/date-picker/index.ts b/packages/components/src/components/date-picker/index.ts index e1fd3c52ef90..adfc2a303a54 100644 --- a/packages/components/src/components/date-picker/index.ts +++ b/packages/components/src/components/date-picker/index.ts @@ -1,4 +1,3 @@ import DatePicker from './date-picker'; import './date-picker.scss'; - export default DatePicker; diff --git a/packages/components/src/components/types/common.types.ts b/packages/components/src/components/types/common.types.ts index 8b459a97081b..5f9096828d8b 100644 --- a/packages/components/src/components/types/common.types.ts +++ b/packages/components/src/components/types/common.types.ts @@ -14,3 +14,9 @@ export type TItem = { }; export type TTableRowItem = { component: React.ReactNode }; + +export type TDatePickerOnChangeEvent = { + date?: string; + duration?: number | null | string; + target?: { name?: string; value?: number | string | moment.Moment | null }; +}; diff --git a/packages/components/src/components/types/index.ts b/packages/components/src/components/types/index.ts index 7911e1a631d9..98187945e4e1 100644 --- a/packages/components/src/components/types/index.ts +++ b/packages/components/src/components/types/index.ts @@ -2,7 +2,7 @@ import { TIconsManifest, TIconProps } from './icons.types'; import { TAccordionProps, TAccordionItem } from './accordion.types'; import { TMultiStepProps, TMultiStepRefProps } from './multi-step.types'; import { TPopoverProps } from './popover.types'; -import { TGetCardLables, TGetContractTypeDisplay } from './common.types'; +import { TGetCardLables, TGetContractTypeDisplay, TDatePickerOnChangeEvent } from './common.types'; import { TErrorMessages, TGetContractPath, TToastConfig } from './contract.types'; export type { @@ -18,4 +18,5 @@ export type { TGetContractPath, TToastConfig, TGetContractTypeDisplay, + TDatePickerOnChangeEvent, }; diff --git a/packages/components/src/index.js b/packages/components/src/index.ts similarity index 99% rename from packages/components/src/index.js rename to packages/components/src/index.ts index 5c95f4df7fdd..6f0b2fe5fd57 100644 --- a/packages/components/src/index.js +++ b/packages/components/src/index.ts @@ -113,3 +113,4 @@ export { default as UnhandledErrorModal } from './components/unhandled-error-mod export { default as VerticalTab } from './components/vertical-tab'; export { default as Wizard } from './components/wizard'; export * from './hooks'; +export * from './components/types';