"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
Object.defineProperty(exports, "FocusManager", {
    enumerable: true,
    get: function() {
        return FocusManager;
    }
});
var _tabbable = require("./tabbable");
function _class_call_check(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
    }
}
function _define_property(obj, key, value) {
    if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}
var FocusManager = function FocusManager() {
    "use strict";
    var _this = this;
    _class_call_check(this, FocusManager);
    // массив с элементами, которые нужно зафокусить после анмаунта
    _define_property(this, "focusAfterElements", []);
    // массив с trap нодами
    _define_property(this, "focusNodes", []);
    _define_property(this, "handleFocus", function() {
        // Фокус всегда должен находиться внутри необходимой ноды
        var focusNode = _this.focusNodes[_this.focusNodes.length - 1];
        if (!focusNode || focusNode.contains(document.activeElement)) {
            return;
        }
        // Выделяем первый tabbable элемент
        var el = (0, _tabbable.findTabbableDescendants)(focusNode)[0] || focusNode;
        el.focus();
    });
    // добавление на фокус после анмаунта
    _define_property(this, "markForFocusAfter", function(focusAfterNode) {
        var node = focusAfterNode && focusAfterNode.current ? focusAfterNode.current : document.activeElement;
        _this.focusAfterElements.push(node);
    });
    // фокус на необходимый элемент
    _define_property(this, "returnFocus", function() {
        var _this_focusAfterElements_pop;
        var toFocus = (_this_focusAfterElements_pop = _this.focusAfterElements.pop()) !== null && _this_focusAfterElements_pop !== void 0 ? _this_focusAfterElements_pop : null;
        if (toFocus) {
            toFocus.focus();
        }
    });
    // при маунте ноды
    _define_property(this, "setupScopedFocus", function(element) {
        _this.focusNodes.push(element);
        document.addEventListener('focusin', _this.handleFocus, true);
    });
    // при анмаунте
    _define_property(this, "teardownScopedFocus", function() {
        _this.focusNodes.pop();
        document.removeEventListener('focusin', _this.handleFocus);
    });
};
