diff --git a/packages/hs-react-ui/src/components/TextInput/TextInput.stories.tsx b/packages/hs-react-ui/src/components/TextInput/TextInput.stories.tsx index 83eafb6c8..c791ef252 100644 --- a/packages/hs-react-ui/src/components/TextInput/TextInput.stories.tsx +++ b/packages/hs-react-ui/src/components/TextInput/TextInput.stories.tsx @@ -75,7 +75,85 @@ storiesOf('TextInput', module) cols={number('cols', 0, undefined, multilineGroup)} isValid={boolean('isValid', true, errorMessageGroup)} errorMessage={text('errorMessage', '', errorMessageGroup)} - defaultValue={text('defaultValue', '', generalGroup)} + type={text('type', '', generalGroup)} + onInput={onInputCallback} + onKeyPress={onKeyPressCallback} + onKeyDown={onKeyDownCallback} + onKeyUp={onKeyUpCallback} + onFocus={onFocusCallback} + onBlur={onBlurCallback} + multiLineIsResizable={boolean('multiLineIsResizable', false, multilineGroup)} + showCharacterCount={boolean('showCharacterCount', true, characterCountGroup)} + maxLength={select( + 'maxLength', + { 5: 5, 20: 20, 100: 100, none: undefined }, + 20, + characterCountGroup, + )} + allowTextBeyondMaxLength={boolean('allowTextBeyondMaxLength', false, characterCountGroup)} + /> + ); + }, + { design }, + ).add( + 'Uncontrolled Text Input', + () => { + const options = { + none: '', + ...IconPaths, + }; + + // Setup callbacks to prevent unnecessary rendering + const onChangeCallback = useCallback(event => { + action('onChange')(event.target.value); + }, []); + const onDebounceCallback = useCallback(event => { + action('onDebounceCallback')(event.target.value); + }, []); + const onClearCallback = useCallback(() => { + setInputValue(''); + action('onClear')(); + }, []); + const onFocusCallback = useCallback(event => { + action('onFocusCallback')(event.target.value); + }, []); + const onBlurCallback = useCallback(event => { + action('onBlurCallback')(event.target.value); + }, []); + const onInputCallback = useCallback(event => { + action('onInputCallback')(event.target.value); + }, []); + const onKeyPressCallback = useCallback(event => { + action('onKeypressCallback')(event.key); + }, []); + const onKeyDownCallback = useCallback(event => { + action('onKeyDownCallback')(event.key); + }, []); + const onKeyUpCallback = useCallback(event => { + action('onKeyUpCallback')(event.key); + }, []); + + const generalGroup = 'General'; + const multilineGroup = 'Multiline'; + const errorMessageGroup = 'Error messages'; + const debounceGroup = 'Debounced'; + const characterCountGroup = 'Character count'; + + return ( + {}; // eslint-disable-line @typescript-eslint/no-e const TextInput = ({ // Destructure native HTML attributes to provide default values - defaultValue = '', type = 'text', disabled = false, cols = 10, @@ -152,6 +152,7 @@ const TextInput = ({ debouncedOnChange = defaultCallback, onClear, + onChange, iconPrefix, isValid = true, isMultiline, @@ -186,13 +187,12 @@ const TextInput = ({ } else if (isMultiline) { InputComponent = TextAreaInputContainer; } - const displayValue = nativeHTMLAttributes.value || defaultValue; + const [displayValue, setDisplayValue] = useState(nativeHTMLAttributes.value || ''); return ( {iconPrefix && createIcon(StyledIconContainer, iconPrefix)}