import { objectSpread2 as _objectSpread2 } from '../../../_virtual/_rollupPluginBabelHelpers.js';
import { useRef, useCallback, useEffect } from 'react';
import { getIdLastDrawer, hasDrawers } from '../DrawerContext.js';
import { usePopupContext } from '../../Popup/PopupContext.js';
import { canUseDOM } from '../../../utils/canUseDOM.js';

var ESCAPE_KEYCODE = 27;
var useDrawer = function useDrawer(_ref) {
  var id = _ref.id,
    isOpen = _ref.isOpen,
    popupInfo = _ref.popupInfo,
    onEscKeyDown = _ref.onEscKeyDown,
    onClose = _ref.onClose,
    _ref$closeOnEsc = _ref.closeOnEsc,
    closeOnEsc = _ref$closeOnEsc === void 0 ? true : _ref$closeOnEsc,
    _ref$disableScroll = _ref.disableScroll,
    disableScroll = _ref$disableScroll === void 0 ? true : _ref$disableScroll;
  var popupController = usePopupContext();
  var overflow = useRef(canUseDOM ? document.body.style.overflow : 'initial');

  // При ESC закрывает текущее окно, если это возможно
  var onKeyDown = useCallback(function (event) {
    if (!closeOnEsc) {
      return;
    }
    if (event.keyCode === ESCAPE_KEYCODE && getIdLastDrawer(Array.from(popupController.items.values())) === id) {
      if (onEscKeyDown) {
        onEscKeyDown(event);
        return;
      }
      if (onClose) {
        onClose();
      }
    }
  }, [onClose, onEscKeyDown, popupController.items, closeOnEsc]);
  useEffect(function () {
    window.addEventListener('keydown', onKeyDown);
    return function () {
      window.removeEventListener('keydown', onKeyDown);
    };
  }, [onKeyDown]);

  // linaria не поддерживает динамический global
  useEffect(function () {
    if (!canUseDOM) {
      return;
    }
    if (isOpen && disableScroll) {
      overflow.current = document.body.style.overflow;
      document.body.style.overflow = 'hidden';
    }
  }, [isOpen, disableScroll]);
  useEffect(function () {
    if (!canUseDOM) {
      return;
    }
    if (!isOpen && !hasDrawers(Array.from(popupController.items.values()))) {
      document.body.style.overflow = overflow.current;
    }
  }, [isOpen, popupController.items]);

  // При анмаунте компонента нужно обновлять overflow у body.
  useEffect(function () {
    return function () {
      if (!canUseDOM) {
        return;
      }
      if (!hasDrawers(Array.from(popupController.items.values()))) {
        document.body.style.overflow = overflow.current;
      }
    };
  }, []);
  var drawerInfo = _objectSpread2({
    id: id,
    info: {
      isDrawer: true
    }
  }, popupInfo);
  return {
    drawerInfo: drawerInfo
  };
};

export { useDrawer };
