"use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;exports.__esModule = true;exports.GlobalLoaderDataTids = exports.GlobalLoader = void 0;var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));var _react = _interopRequireDefault(require("react"));
var _lodash = _interopRequireDefault(require("lodash.debounce"));

var _currentEnvironment = require("../../lib/currentEnvironment");
var _CommonWrapper = require("../../internal/CommonWrapper");

var _rootNode = require("../../lib/rootNode");
var _createPropsGetter = require("../../lib/createPropsGetter");


var _GlobalLoaderView = require("./GlobalLoaderView");var _class, _GlobalLoader;











































var GlobalLoaderDataTids = exports.GlobalLoaderDataTids = {
  root: 'GlobalLoader'
};








var currentGlobalLoader;

/**
 * Глобальный лоадер `GlobalLoader` — это универсальный индикатор обмена данными с сервером.
 * Он появляется у верхней границы экрана и выглядит как тоненькая полоска, окрашенная в фирменный цвет продукта.
 *
 * `GlobalLoader` может быть только один в приложении. Поэтому, каждый новый экземпляр компонента "убивает" предыдущий экземпляр, и начинает перехватывать статические методы.
 *
 * Предполагается монтирование компонента в единственном месте. И управление им через статические методы, либо через пропсы.
 *
 * `GlobalLoader` работает в двух режимах:
 * * как прогресс-бар, примерно показывает ход получения данных от сервера.
 * * как спиннер, когда есть проблемы с соединением.
 */var

GlobalLoader = exports.GlobalLoader = (0, _rootNode.rootNode)(_class = (_GlobalLoader = /*#__PURE__*/function (_React$Component) {






























  function GlobalLoader(props) {var _this;
    _this = _React$Component.call(this, props) || this;_this.getProps = (0, _createPropsGetter.createPropsGetter)(GlobalLoader.defaultProps);_this.startTask = (0, _lodash.default)(function () {_this.setState({ visible: true });_this.props.onStart == null || _this.props.onStart();}, _this.getProps().delayBeforeShow);_this.stopTask = (0, _lodash.default)(function () {_this.setState({ visible: false, successAnimationInProgress: false, started: false });_this.props.onDone == null || _this.props.onDone();}, _this.getProps().delayBeforeHide);_this.resumeTaskAfterSuccessAnimation = (0, _lodash.default)(function () {_this.setActive();}, _this.getProps().delayBeforeHide);_this.



















































































































    setActive = function () {
      _this.startTask.cancel();
      if (_this.state.successAnimationInProgress) {
        _this.resumeTaskAfterSuccessAnimation();
      } else {
        _this.setState({ visible: false, done: false, rejected: false, accept: false, started: true });
        if (_this.getProps().rejected) {
          _this.setReject(true);
        } else {
          _this.stopTask.cancel();
          _this.startTask();
        }
      }
    };_this.

    setDone = function () {
      if (!_this.state.started) {
        return;
      }
      _this.setState({ done: true, successAnimationInProgress: true });
      _this.startTask.cancel();
      _this.resumeTaskAfterSuccessAnimation.cancel();
      _this.stopTask();
    };_this.

    setReject = function (reject) {
      if (!_this.state.visible && (_this.state.started || _this.getProps().active)) {
        _this.setState({ visible: true });
      }
      _this.startTask.cancel();
      _this.stopTask.cancel();
      if (reject) {
        _this.props.onReject == null || _this.props.onReject();
      } else if (_this.state.rejected) {
        _this.setState({ accept: true });
        _this.props.onAccept == null || _this.props.onAccept();
      }
      _this.setState({ rejected: reject });
    };_this.





    kill = function () {
      _this.stopTask.cancel();
      _this.startTask.cancel();
      _this.resumeTaskAfterSuccessAnimation.cancel();
      _this.setState({
        dead: true
      });
    };_this.state = { started: false, visible: false, done: false, rejected: false, accept: false, dead: false, successAnimationInProgress: false, expectedResponseTime: _this.getProps().expectedResponseTime };return _this;}(0, _inheritsLoose2.default)(GlobalLoader, _React$Component);var _proto = GlobalLoader.prototype;_proto.componentDidMount = function componentDidMount() {var _currentGlobalLoader;(_currentGlobalLoader = currentGlobalLoader) == null || _currentGlobalLoader.kill(); // eslint-disable-next-line @typescript-eslint/no-this-alias
    currentGlobalLoader = this;var _this$getProps = this.getProps(),active = _this$getProps.active,rejected = _this$getProps.rejected;if (active) {this.setActive();}if (rejected) {this.setReject(true);}};_proto.componentWillUnmount = function componentWillUnmount() {currentGlobalLoader = null;};_proto.componentDidUpdate = function componentDidUpdate(prevProps) {var _this$getProps2 = this.getProps(),expectedResponseTime = _this$getProps2.expectedResponseTime,rejected = _this$getProps2.rejected,active = _this$getProps2.active;if (expectedResponseTime !== prevProps.expectedResponseTime) {this.setState({ expectedResponseTime: expectedResponseTime });}if (rejected !== prevProps.rejected) {this.setReject(rejected);}if (active !== prevProps.active) {if (active) {this.setActive();} else {this.setDone();}}};_proto.render = function render() {var status = 'standard';if (this.state.done) {status = 'success';} else if (this.state.rejected) {status = 'error';} else if (this.state.accept) {status = 'accept';}var _this$getProps3 = this.getProps(),delayBeforeHide = _this$getProps3.delayBeforeHide,disableAnimations = _this$getProps3.disableAnimations;return !this.state.dead && this.state.visible && /*#__PURE__*/_react.default.createElement(_CommonWrapper.CommonWrapper, (0, _extends2.default)({ rootNodeRef: this.setRootNode }, this.props), /*#__PURE__*/_react.default.createElement(_GlobalLoaderView.GlobalLoaderView, { expectedResponseTime: this.state.expectedResponseTime, delayBeforeHide: delayBeforeHide, status: status, "data-tid": GlobalLoaderDataTids.root, disableAnimations: disableAnimations }));} /**
   * Запускает анимацию лоадера <br />
   * Равносильно установке пропа `active = true`
   *
   * @public
   */;_proto.updateExpectedResponseTime = function updateExpectedResponseTime(expectedResponseTime) {this.setState({ expectedResponseTime: expectedResponseTime });};return GlobalLoader;}(_react.default.Component), _GlobalLoader.__KONTUR_REACT_UI__ = 'GlobalLoader', _GlobalLoader.displayName = 'GlobalLoader', _GlobalLoader.defaultProps = { expectedResponseTime: 1000, delayBeforeShow: 1000, delayBeforeHide: 1000, rejected: false, active: false, disableAnimations: _currentEnvironment.isTestEnv }, _GlobalLoader.start = function (expectedResponseTime) {var _currentGlobalLoader2;(_currentGlobalLoader2 = currentGlobalLoader) == null || _currentGlobalLoader2.setActive();if (typeof expectedResponseTime === 'number') {var _currentGlobalLoader3;(_currentGlobalLoader3 = currentGlobalLoader) == null || _currentGlobalLoader3.updateExpectedResponseTime(expectedResponseTime);}}, _GlobalLoader.done = function () {var _currentGlobalLoader4;(_currentGlobalLoader4 = currentGlobalLoader) == null || _currentGlobalLoader4.setDone();}, _GlobalLoader.reject = function () {var _currentGlobalLoader5;(_currentGlobalLoader5 = currentGlobalLoader) == null || _currentGlobalLoader5.setReject(true);}, _GlobalLoader.accept = function () {var _currentGlobalLoader6;(_currentGlobalLoader6 = currentGlobalLoader) == null || _currentGlobalLoader6.setReject(false);}, _GlobalLoader)) || _class;