From fb860884857da73ee5b5e897745301cdf1d770a2 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Thu, 5 Oct 2023 18:58:30 +0200 Subject: refactor(components): make form components compliant with Eslint rules --- .../labelled-field/labelled-field.stories.tsx | 8 ++-- .../forms/labelled-field/labelled-field.test.tsx | 6 +-- .../forms/labelled-field/labelled-field.tsx | 43 ++++++++++++++-------- 3 files changed, 35 insertions(+), 22 deletions(-) (limited to 'src/components/molecules/forms/labelled-field') diff --git a/src/components/molecules/forms/labelled-field/labelled-field.stories.tsx b/src/components/molecules/forms/labelled-field/labelled-field.stories.tsx index 1f29830..1d1af70 100644 --- a/src/components/molecules/forms/labelled-field/labelled-field.stories.tsx +++ b/src/components/molecules/forms/labelled-field/labelled-field.stories.tsx @@ -1,5 +1,5 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { ChangeEvent, useState } from 'react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { type ChangeEvent, useState, useCallback } from 'react'; import { Input, Label } from '../../../atoms'; import { LabelledField } from './labelled-field'; @@ -77,9 +77,9 @@ export default { const Template: ComponentStory = ({ ...args }) => { const id = 'sunt'; const [value, setValue] = useState(''); - const updateValue = (e: ChangeEvent) => { + const updateValue = useCallback((e: ChangeEvent) => { setValue(e.target.value); - }; + }, []); return ( { label={} /> ); - expect(screen.getByLabelText(label)).toBeInTheDocument(); - expect(screen.getByRole('textbox')).toHaveValue(value); + expect(rtlScreen.getByLabelText(label)).toBeInTheDocument(); + expect(rtlScreen.getByRole('textbox')).toHaveValue(value); }); }); diff --git a/src/components/molecules/forms/labelled-field/labelled-field.tsx b/src/components/molecules/forms/labelled-field/labelled-field.tsx index af492b3..ea0bd67 100644 --- a/src/components/molecules/forms/labelled-field/labelled-field.tsx +++ b/src/components/molecules/forms/labelled-field/labelled-field.tsx @@ -1,5 +1,10 @@ -import { FC, HTMLAttributes, ReactElement } from 'react'; import { + forwardRef, + type HTMLAttributes, + type ReactElement, + type ForwardRefRenderFunction, +} from 'react'; +import type { CheckboxProps, InputProps, LabelProps, @@ -37,27 +42,35 @@ export type LabelledFieldProps = Omit< label: ReactElement; }; -/** - * LabelledField component - * - * Render a field tied to a label. - */ -export const LabelledField: FC = ({ - className = '', - field, - isInline = false, - isReversedOrder = false, - label, - ...props -}) => { +const LabelledFieldWithRef: ForwardRefRenderFunction< + HTMLDivElement, + LabelledFieldProps +> = ( + { + className = '', + field, + isInline = false, + isReversedOrder = false, + label, + ...props + }, + ref +) => { const layoutClass = isInline ? 'wrapper--inline' : 'wrapper--stack'; const orderClass = isReversedOrder ? 'wrapper--reverse' : ''; const wrapperClass = `${styles.wrapper} ${styles[layoutClass]} ${styles[orderClass]} ${className}`; return ( -
+
{label} {field}
); }; + +/** + * LabelledField component + * + * Render a field tied to a label. + */ +export const LabelledField = forwardRef(LabelledFieldWithRef); -- cgit v1.2.3