ResizableTextArea.tsx 715 B

12345678910111213141516171819202122
  1. import type { ChangeEventHandler, DetailedHTMLProps, TextareaHTMLAttributes } from 'react';
  2. import { useCallback } from 'react';
  3. type Props = DetailedHTMLProps<TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>;
  4. export const ResizableTextarea = (props: Props): JSX.Element => {
  5. const { onChange: _onChange, ...rest } = props;
  6. const onChange: ChangeEventHandler<HTMLTextAreaElement> = useCallback((e) => {
  7. _onChange?.(e);
  8. // auto resize
  9. // refs: https://zenn.dev/soma3134/articles/1e2fb0eab75b2d
  10. e.target.style.height = 'auto';
  11. e.target.style.height = `${e.target.scrollHeight + 4}px`;
  12. }, [_onChange]);
  13. return (
  14. <textarea onChange={onChange} {...rest} />
  15. );
  16. };