"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useLogic = void 0;
const react_1 = require("react");
const react_toastify_next_1 = require("react-toastify-next");
const useViewportType_1 = require("../../../useViewportType");
const constants_1 = require("../../constants");
const sleep_1 = require("../../utils/sleep");
const hooks_1 = require("./hooks");
const useLogic = ({ containerId: externalContainerId, }) => {
    const { isMobile } = (0, useViewportType_1.useViewportType)();
    const [toasts, setToasts] = (0, react_1.useState)([]);
    const [container, setContainer] = (0, react_1.useState)();
    const [isStartedClosingNotify, setStartedClosingNotify] = (0, react_1.useState)(false);
    (0, react_1.useEffect)(() => {
        if (toasts.length) {
            const scrollContainer = document.querySelector(`#${externalContainerId} .Toastify__toast-container`);
            setContainer(scrollContainer);
        }
    }, [externalContainerId, toasts]);
    // Ориентируемся на data-атрибут для отключении анимации стека при добавлении нового уведомления
    const handleAddNoTransitionAttr = () => {
        const elements = document.querySelectorAll(`.${constants_1.notifyClassnames.root}`);
        elements.forEach((element) => element.setAttribute(constants_1.NOTIFY_NO_TRANSITION_ATTR, 'true'));
    };
    const handleRemoveNoTransitionAttr = () => {
        const elements = document.querySelectorAll(`.${constants_1.notifyClassnames.root}[${constants_1.NOTIFY_NO_TRANSITION_ATTR}='true']`);
        elements.forEach((element) => element.removeAttribute(constants_1.NOTIFY_NO_TRANSITION_ATTR));
    };
    (0, react_1.useEffect)(() => {
        handleRemoveNoTransitionAttr();
        // Синхронизирует скрытие кнопки при ручном закрытии всех уведомлений
        if (!toasts.length) {
            setStartedClosingNotify(false);
        }
    }, [toasts]);
    const hasOpenNotify = Boolean(toasts.length);
    const { isHovered } = (0, hooks_1.useHover)(container, {
        enabled: !isMobile,
    });
    const isTouchExpanded = (0, hooks_1.useTouchStackExpand)({
        stackContainerElement: container ?? null,
        enabled: isMobile,
        hasOpenNotify,
    });
    const isStackExpanded = isMobile ? isTouchExpanded : isHovered;
    const handleAddToast = ({ id, containerId }) => {
        if (Object.is(containerId, externalContainerId)) {
            setToasts((currentToasts) => [...currentToasts, id]);
        }
    };
    const handleRemoveToast = ({ id, containerId }) => {
        if (Object.is(containerId, externalContainerId)) {
            setToasts((currentToasts) => currentToasts.filter((toastId) => toastId !== id));
        }
    };
    const handleChange = ({ status, ...rest }) => {
        if (Object.is(status, 'added')) {
            handleAddToast({ status, ...rest });
            handleAddNoTransitionAttr();
            // Снимаем флаг запуска анимации на закрытие, если происходит добавление уведомлений.
            // Позволяет решить проблему отображения кнопки закрытия уведомлений,
            // при условии что пользователь нажал на нее, но новые уведомления продолжают появляться
            setStartedClosingNotify(false);
        }
        if (Object.is(status, 'removed')) {
            handleRemoveToast({ status, ...rest });
        }
    };
    (0, react_1.useEffect)(() => {
        const unsubscribe = react_toastify_next_1.toast.onChange(handleChange);
        return unsubscribe;
    }, []);
    (0, react_1.useEffect)(() => {
        if (!isStackExpanded || !container) {
            return;
        }
        (async () => {
            // Ожидаем пока отработает анимация и стек с уведомлениями раскроется
            await (0, sleep_1.sleep)(300);
            const hasVerticalScroll = container.scrollHeight > container.clientHeight;
            if (hasVerticalScroll) {
                container.scrollTo({
                    top: container.scrollHeight,
                    behavior: 'smooth',
                });
            }
        })();
    }, [container, isStackExpanded]);
    const closeAll = () => {
        setStartedClosingNotify(true);
        react_toastify_next_1.toast.dismiss({ containerId: externalContainerId });
    };
    return {
        isVisibleCloseButton: hasOpenNotify && (isMobile ? isStackExpanded : true),
        isStackExpanded,
        isStartedClosingNotify,
        closeAll,
    };
};
exports.useLogic = useLogic;
