"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useLoadingState = void 0;
const react_1 = require("react");
const constants_1 = require("./constants");
/**
 * Управляет отображением состояния загрузки.
 *
 * — Если загрузка длится меньше 200мс, лоадер **не показывается**,
 *
 * — Если загрузка длится дольше, лоадер появляется **через 200мс**
 *   и гарантированно показывается **не менее 500мс**.
 *
 * Хук возвращает два состояния:
 *  - `isLoadingPhase` — фаза загрузки (контейнер должен быть зарезервирован под лоадер)
 *  - `showLoader` — когда действительно нужно показывать Loader
 */
const useLoadingState = (isLoading = false) => {
    const [isShowLoader, setIsShowLoader] = (0, react_1.useState)(false);
    const [isLoadingPhase, setIsLoadingPhase] = (0, react_1.useState)(isLoading);
    const delayTimerRef = (0, react_1.useRef)(null);
    const minDisplayTimerRef = (0, react_1.useRef)(null);
    const loadingStartTimeRef = (0, react_1.useRef)(null);
    const clearTimers = () => {
        if (delayTimerRef.current) {
            clearTimeout(delayTimerRef.current);
            delayTimerRef.current = null;
        }
        if (minDisplayTimerRef.current) {
            clearTimeout(minDisplayTimerRef.current);
            minDisplayTimerRef.current = null;
        }
    };
    /**
     *  Показать лоадер после задержки
     */
    const startLoading = () => {
        setIsLoadingPhase(true);
        delayTimerRef.current = setTimeout(() => {
            setIsShowLoader(true);
            loadingStartTimeRef.current = Date.now();
        }, constants_1.LOADING_DELAY);
    };
    /**
     *  Скрыть лоадер сразу (если не успел появиться)
     */
    const hideImmediately = () => {
        setIsShowLoader(false);
        setIsLoadingPhase(false);
        loadingStartTimeRef.current = null;
    };
    /**
     * Скрыть лоадер после минимального времени отображения
     */
    const hideWithDelay = () => {
        const startTime = loadingStartTimeRef.current;
        if (!startTime) {
            // Лоадер не успел появиться
            return hideImmediately();
        }
        const elapsed = Date.now() - startTime;
        const remaining = Math.max(0, constants_1.MIN_LOADING_DISPLAY_TIME - elapsed);
        minDisplayTimerRef.current = setTimeout(() => {
            setIsShowLoader(false);
            setIsLoadingPhase(false);
            loadingStartTimeRef.current = null;
        }, remaining);
    };
    (0, react_1.useEffect)(() => {
        clearTimers();
        if (isLoading) {
            startLoading();
        }
        else if (isShowLoader) {
            hideWithDelay();
        }
        else {
            hideImmediately();
        }
        return clearTimers;
    }, [isLoading]);
    return {
        isLoadingPhase: isLoading || isLoadingPhase,
        isShowLoader,
    };
};
exports.useLoadingState = useLoadingState;
