"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useInputPopover = void 0;
const useClickAwayEffect_1 = require("../useClickAwayEffect");
const useEscapeClickEffect_1 = require("../useEscapeClickEffect");
const useFocusAwayEffect_1 = require("../useFocusAwayEffect");
const useToggle_1 = require("../useToggle");
/**
 * хук объединяюший в себе сопутствующие хуки для использования поппера с каким нибудь инпутом
 */
const useInputPopover = ({ ref, onOpen, onClose, onBlur, }) => {
    // флаг активности поппера и методы управления
    const [isOpenPopover, openPopover, closePopover] = (0, useToggle_1.useToggle)({
        onActive: onOpen,
        onInactive: onClose,
    });
    // флаг активности пользовательского сценария и методы управления
    const [isInProgress, openProgress, closeProgress] = (0, useToggle_1.useToggle)();
    // метод активации, если пользователь сфокусировался или кликнул на инпут,
    // открываем поппер и включаем оба флага активности
    const handleActivate = !isOpenPopover
        ? () => {
            openPopover();
            openProgress();
        }
        : openProgress;
    // метод закрытия с эмитом onBlur, используем когда пользователь покидает отслеживаемый ref,
    // останавливает пользовательский сценарий
    const handleCloseByAway = (e, reason) => {
        onBlur?.();
        if (isOpenPopover) {
            closePopover(e, reason);
        }
        closeProgress();
    };
    // отслеживаем клик снаружи, останавливает пользовательский сценарий
    // активность по флагу поппера
    (0, useClickAwayEffect_1.useClickAwayEffect)({
        ref,
        onClickAway: handleCloseByAway,
        isActive: isOpenPopover,
    });
    // отслеживаем ивенты фокуса, срабатывания останавливают пользовательский сценарий
    // активность по флагу пользовательского сценария, т.к. пользователь может закрыть поппер,
    // но остаться на инпуте компонента
    (0, useFocusAwayEffect_1.useFocusAwayEffect)({
        ref,
        onFocusAway: handleCloseByAway,
        isActive: isInProgress,
    });
    // отслеживаем клик Esc, не останавливает пользовательский сценарий
    // активность по флагу поппера
    (0, useEscapeClickEffect_1.useEscapeClickEffect)({
        onEscape: closePopover,
        isActive: isOpenPopover,
        preventBubbling: true,
    });
    return {
        isOpenPopover,
        openPopover: handleActivate,
        closePopover,
    };
};
exports.useInputPopover = useInputPopover;
