Use Auto Resize TextArea
Automatically adjust the Height of Textarea
import { useEffect, useCallback, useRef } from "react";
interface UseAutoResizeTextareaProps {
minHeight?: number;
maxHeight?: number;
}
export function useAutoResizeTextarea({
minHeight = 40,
maxHeight,
}: UseAutoResizeTextareaProps = {}) {
const textAreaRef = useRef<HTMLTextAreaElement>(null);
const adjustHeight = useCallback(() => {
const textarea = textAreaRef.current;
if (!textarea) return;
textarea.style.height = `${minHeight}px`;
const newHeight = Math.max(
minHeight,
Math.min(textarea.scrollHeight, maxHeight ?? Number.POSITIVE_INFINITY)
);
textarea.style.height = `${newHeight}px`;
}, [minHeight, maxHeight]);
useEffect(() => {
const textarea = textAreaRef.current;
if (textarea) {
adjustHeight();
}
}, [adjustHeight]);
useEffect(() => {
const handleResize = () => adjustHeight();
window.addEventListener("resize", handleResize);
return () => {
window.removeEventListener("resize", handleResize);
};
}, [adjustHeight]);
return { textAreaRef, adjustHeight };
}