Skip to content

Commit

Permalink
TextControl: Covert component to TypeScript (#40633)
Browse files Browse the repository at this point in the history
Co-authored-by: Marco Ciampini <[email protected]>
  • Loading branch information
Petter Walbø Johnsgård and ciampo authored Apr 29, 2022
1 parent 1a09264 commit 6db1890
Show file tree
Hide file tree
Showing 7 changed files with 185 additions and 119 deletions.
4 changes: 4 additions & 0 deletions packages/components/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
- `InputControl`: Add `__next36pxDefaultSize` flag for larger default size ([#40622](https://github.com/WordPress/gutenberg/pull/40622)).
- `UnitControl`: Add `__next36pxDefaultSize` flag for larger default size ([#40627](https://github.com/WordPress/gutenberg/pull/40627)).

### Internal

- `TextControl`: Convert to TypeScript ([#40633](https://github.com/WordPress/gutenberg/pull/40633)).

## 19.9.0 (2022-04-21)

### Bug Fix
Expand Down
72 changes: 0 additions & 72 deletions packages/components/src/text-control/index.js

This file was deleted.

84 changes: 84 additions & 0 deletions packages/components/src/text-control/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/**
* External dependencies
*/
import type { ChangeEvent, ForwardedRef } from 'react';

/**
* WordPress dependencies
*/
import { useInstanceId } from '@wordpress/compose';
import { forwardRef } from '@wordpress/element';

/**
* Internal dependencies
*/
import BaseControl from '../base-control';
import type { WordPressComponentProps } from '../ui/context';
import type { TextControlProps } from './types';

function UnforwardedTextControl(
props: WordPressComponentProps< TextControlProps, 'input', false >,
ref: ForwardedRef< HTMLInputElement >
) {
const {
label,
hideLabelFromVision,
value,
help,
className,
onChange,
type = 'text',
...additionalProps
} = props;
const instanceId = useInstanceId( TextControl );
const id = `inspector-text-control-${ instanceId }`;
const onChangeValue = ( event: ChangeEvent< HTMLInputElement > ) =>
onChange( event.target.value );

return (
<BaseControl
label={ label }
hideLabelFromVision={ hideLabelFromVision }
id={ id }
help={ help }
className={ className }
>
<input
className="components-text-control__input"
type={ type }
id={ id }
value={ value }
onChange={ onChangeValue }
aria-describedby={ !! help ? id + '__help' : undefined }
ref={ ref }
{ ...additionalProps }
/>
</BaseControl>
);
}

/**
* TextControl components let users enter and edit text.
*
*
* @example
* ```jsx
* import { TextControl } from '@wordpress/components';
* import { useState } from '@wordpress/element';
*
* const MyTextControl = () => {
* const [ className, setClassName ] = useState( '' );
*
* return (
* <TextControl
* label="Additional CSS Class"
* value={ className }
* onChange={ ( value ) => setClassName( value ) }
* />
* );
* };
* ```
*/
export const TextControl = forwardRef( UnforwardedTextControl );

export default TextControl;
46 changes: 0 additions & 46 deletions packages/components/src/text-control/stories/index.js

This file was deleted.

66 changes: 66 additions & 0 deletions packages/components/src/text-control/stories/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/**
* External dependencies
*/
import type { ComponentMeta, ComponentStory } from '@storybook/react';

/**
* WordPress dependencies
*/
import { useState } from '@wordpress/element';

/**
* Internal dependencies
*/
import TextControl from '..';

const meta: ComponentMeta< typeof TextControl > = {
component: TextControl,
title: 'Components/TextControl',
argTypes: {
onChange: {
action: 'onChange',
},
value: {
control: { type: null },
},
},
parameters: {
controls: {
expanded: true,
},
docs: { source: { state: 'open' } },
},
};
export default meta;

const DefaultTemplate: ComponentStory< typeof TextControl > = ( {
onChange,
...args
} ) => {
const [ value, setValue ] = useState( '' );

return (
<TextControl
{ ...args }
value={ value }
onChange={ ( v ) => {
setValue( v );
onChange( v );
} }
/>
);
};

export const Default: ComponentStory<
typeof TextControl
> = DefaultTemplate.bind( {} );
Default.args = {};

export const WithLabelAndHelpText: ComponentStory<
typeof TextControl
> = DefaultTemplate.bind( {} );
WithLabelAndHelpText.args = {
...Default.args,
label: 'Label Text',
help: 'Help text to explain the input.',
};
29 changes: 29 additions & 0 deletions packages/components/src/text-control/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/**
* External dependencies
*/
import type { HTMLInputTypeAttribute } from 'react';

/**
* Internal dependencies
*/
import type { BaseControlProps } from '../base-control/types';

export type TextControlProps = Pick<
BaseControlProps,
'className' | 'hideLabelFromVision' | 'help' | 'label'
> & {
/**
* A function that receives the value of the input.
*/
onChange: ( value: string ) => void;
/**
* The current value of the input.
*/
value: string | number;
/**
* Type of the input element to render. Defaults to "text".
*
* @default 'text'
*/
type?: HTMLInputTypeAttribute;
};
3 changes: 2 additions & 1 deletion packages/components/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"gutenberg-test-env",
"jest",
"@testing-library/jest-dom",
"snapshot-diff",
"snapshot-diff"
],
// Some errors in Reakit types with TypeScript 4.3
// Remove the following line when they've been addressed.
Expand Down Expand Up @@ -77,6 +77,7 @@
"src/spinner/**/*",
"src/surface/**/*",
"src/text/**/*",
"src/text-control/**/*",
"src/tip/**/*",
"src/toggle-group-control/**/*",
"src/tools-panel/**/*",
Expand Down

0 comments on commit 6db1890

Please sign in to comment.