From d9b6bb6179f9e92694f84f2fc9ac1b32c5c730b4 Mon Sep 17 00:00:00 2001 From: roman Date: Tue, 18 Aug 2026 16:53:06 +0200 Subject: [PATCH] refactor(form-elements-text-area): migrate TextArea from Flow to TypeScript --- .../__tests__/ContextMenu.test.tsx | 2 - .../datalist-item/DatalistItem.stories.tsx | 1 - src/components/flyout/Flyout.stories.tsx | 2 - .../{TextArea.js => TextArea.js.flow} | 13 +- ...xtArea.stories.js => TextArea.stories.tsx} | 3 +- .../form-elements/text-area/TextArea.tsx | 199 ++++++++++++++++++ .../{TextArea.test.js => TextArea.test.tsx} | 46 ++-- .../form-elements/text-area/index.js | 2 - .../form-elements/text-area/index.js.flow | 3 + .../form-elements/text-area/index.ts | 2 + src/components/hotkeys/HotkeyHelpModal.tsx | 2 - src/components/link/stories/Link.stories.tsx | 3 - .../link/stories/LinkButton.stories.tsx | 12 +- .../stories/LinkPrimaryButton.stories.tsx | 3 - src/components/media/MediaMenu.tsx | 1 - .../media/stories/Media.stories.tsx | 1 - 16 files changed, 241 insertions(+), 54 deletions(-) rename src/components/form-elements/text-area/{TextArea.js => TextArea.js.flow} (92%) rename src/components/form-elements/text-area/{TextArea.stories.js => TextArea.stories.tsx} (93%) create mode 100644 src/components/form-elements/text-area/TextArea.tsx rename src/components/form-elements/text-area/__tests__/{TextArea.test.js => TextArea.test.tsx} (81%) delete mode 100644 src/components/form-elements/text-area/index.js create mode 100644 src/components/form-elements/text-area/index.js.flow create mode 100644 src/components/form-elements/text-area/index.ts diff --git a/src/components/context-menu/__tests__/ContextMenu.test.tsx b/src/components/context-menu/__tests__/ContextMenu.test.tsx index cd1f3fcd67..a9763ea252 100644 --- a/src/components/context-menu/__tests__/ContextMenu.test.tsx +++ b/src/components/context-menu/__tests__/ContextMenu.test.tsx @@ -1,5 +1,3 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore import React, { act } from 'react'; import { mount, shallow, ReactWrapper } from 'enzyme'; import TetherComponent from 'react-tether'; diff --git a/src/components/datalist-item/DatalistItem.stories.tsx b/src/components/datalist-item/DatalistItem.stories.tsx index 5576eeb15a..18e0919496 100644 --- a/src/components/datalist-item/DatalistItem.stories.tsx +++ b/src/components/datalist-item/DatalistItem.stories.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; -// @ts-ignore JS Import import DatalistItem from './DatalistItem'; import notes from './DatalistItem.stories.md'; diff --git a/src/components/flyout/Flyout.stories.tsx b/src/components/flyout/Flyout.stories.tsx index cf28f94184..685669ac0b 100644 --- a/src/components/flyout/Flyout.stories.tsx +++ b/src/components/flyout/Flyout.stories.tsx @@ -2,11 +2,9 @@ import * as React from 'react'; import Button from '../button'; import IconHelp from '../../icons/general/IconHelp'; -// @ts-ignore JS import import TextInput from '../text-input'; import PlainButton from '../plain-button'; import PrimaryButton from '../primary-button'; -// @ts-ignore JS import import TextArea from '../text-area'; import { Flyout, Overlay } from '.'; diff --git a/src/components/form-elements/text-area/TextArea.js b/src/components/form-elements/text-area/TextArea.js.flow similarity index 92% rename from src/components/form-elements/text-area/TextArea.js rename to src/components/form-elements/text-area/TextArea.js.flow index e79b802bc8..c847e940cc 100644 --- a/src/components/form-elements/text-area/TextArea.js +++ b/src/components/form-elements/text-area/TextArea.js.flow @@ -6,6 +6,11 @@ import TextAreaCore from '../../text-area'; import * as messages from '../input-messages'; import FormInput from '../form/FormInput'; +export type TextAreaValidationError = { + code: string, + message?: React.Node, +}; + type Props = { autoFocus?: boolean, /** Add a class to the component */ @@ -22,8 +27,8 @@ type Props = { name: string, /** Placeholder for the text area */ placeholder?: string, - /** Validation function that returns an error string or a promise that resolves to an error string */ - validation?: Function, + /** Validation function that returns `TextAreaValidationError` or a falsy value when valid */ + validation?: (value: string) => TextAreaValidationError | null | void, /** Default value of the text area */ value: string, }; @@ -146,6 +151,7 @@ class TextArea extends React.Component { isRequired, isResizable, label, + maxLength, name, placeholder, } = this.props; @@ -162,6 +168,7 @@ class TextArea extends React.Component { label={label} isRequired={isRequired} isResizable={isResizable} + maxLength={maxLength} name={name} onBlur={this.checkValidity} onChange={this.onChange} @@ -178,4 +185,6 @@ class TextArea extends React.Component { } } +export type TextAreaProps = Props; + export default TextArea; diff --git a/src/components/form-elements/text-area/TextArea.stories.js b/src/components/form-elements/text-area/TextArea.stories.tsx similarity index 93% rename from src/components/form-elements/text-area/TextArea.stories.js rename to src/components/form-elements/text-area/TextArea.stories.tsx index 34dff5bc67..fc9cdc49e6 100644 --- a/src/components/form-elements/text-area/TextArea.stories.js +++ b/src/components/form-elements/text-area/TextArea.stories.tsx @@ -1,4 +1,3 @@ -// @flow import * as React from 'react'; import TextArea from './TextArea'; @@ -7,7 +6,7 @@ import notes from './TextArea.stories.md'; export const basic = () =>