import { createEffect, createSignal, on } from "solid-js";
import calculateNodeHeight from "./calculateNodeHeight";
import getSizingData from "./getSizingData";
import { useWindowResizeListener } from "./hooks";
function TextareaAutosize(props) {
    const [textarea, setTextarea] = createSignal();
    let heightRef = 0;
    let measurementsCacheRef = undefined;
    const resizeTextarea = () => {
        const node = textarea();
        if (!node)
            return;
        const nodeSizingData = props.cacheMeasurements && measurementsCacheRef ? measurementsCacheRef : getSizingData(node);
        if (!nodeSizingData) {
            return;
        }
        measurementsCacheRef = nodeSizingData;
        const [height, rowHeight] = calculateNodeHeight(nodeSizingData, node.value || node.placeholder || "x", props.minRows, props.maxRows);
        if (heightRef !== height) {
            heightRef = height;
            node.style.setProperty("height", `${height}px`, "important");
            props.onHeightChange?.(height, { rowHeight });
        }
    };
    const handleChange = (event) => {
        resizeTextarea();
        if (typeof props.oninput === "function")
            props.oninput(event);
        if (typeof props.onInput === "function")
            props.onInput(event);
    };
    createEffect(on(() => props.value, resizeTextarea));
    createEffect(() => {
        if (typeof document !== "undefined" && textarea()) {
            resizeTextarea();
            useWindowResizeListener(resizeTextarea);
        }
    });
    return (<textarea {...props} oninput={handleChange} onInput={handleChange} ref={(element) => setTextarea(element)}/>);
}
export default TextareaAutosize;
