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