"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useOverflowed = void 0;
const debounce_1 = require("@astral/utils/debounce");
const react_1 = require("react");
const useFirstMountState_1 = require("../../../useFirstMountState");
const useOverflowed = (forwardedRef, hasMultipleRows = false, hasVisibleLastSymbols = false) => {
    const localRef = (0, react_1.useRef)(null);
    const ref = forwardedRef && typeof forwardedRef !== 'function'
        ? forwardedRef
        : localRef;
    const [isOverflowed, setOverflow] = (0, react_1.useState)(false);
    const isFirstMount = (0, useFirstMountState_1.useFirstMountState)();
    const checkOverflow = ([{ target, contentRect },]) => {
        // высота контента больше высоты контейнера -> переполнение
        const isScrollHeightBigger = target.scrollHeight > Math.round(contentRect.height);
        // ширина контента больше ширины контейнера -> переполнение
        const isScrollWidthBigger = target.scrollWidth > Math.round(contentRect.width);
        const newIsOverflowed = hasMultipleRows
            ? isScrollWidthBigger || isScrollHeightBigger
            : isScrollWidthBigger;
        // Обновляем состояние только если значение действительно изменилось
        setOverflow((prev) => (prev !== newIsOverflowed ? newIsOverflowed : prev));
    };
    (0, react_1.useLayoutEffect)(() => {
        const node = ref.current;
        if (!node) {
            return;
        }
        const resizeEntry = {
            target: node,
            contentRect: node.getBoundingClientRect(),
        };
        let resizeObserver = null;
        // Проверка через ResizeObserver при первом маунте должна быть отключена для элементов,
        // которые имеют hasVisibleLastSymbols (например GuidTypography, FileName) во избежания визуального подергивания
        if (hasVisibleLastSymbols && isFirstMount) {
            checkOverflow([resizeEntry]);
        }
        else {
            resizeObserver = new ResizeObserver((0, debounce_1.debounce)(checkOverflow, 500));
            resizeObserver.observe(node);
        }
        //функция очистки должна обязательно возвращаться в теле хука, иначе она не вызывается
        return () => {
            resizeObserver?.unobserve(node);
        };
    }, [ref.current]);
    return { isOverflowed, ref };
};
exports.useOverflowed = useOverflowed;
