"use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;exports.__esModule = true;exports.ToastDataTids = exports.Toast = void 0;exports.isEmptySecondArg = isEmptySecondArg;exports.isNewToastPushApi = isNewToastPushApi;exports.isOldToastPushApi = isOldToastPushApi;var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _react = _interopRequireDefault(require("react"));
var _reactTransitionGroup = require("react-transition-group");

var _globalObject = require("@skbkontur/global-object");

var _ThemeFactory = require("../../lib/theming/ThemeFactory");
var _ThemeContext = require("../../lib/theming/ThemeContext");

var _RenderContainer = require("../../internal/RenderContainer");


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

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

var _Toast2 = require("./Toast.styles");

var _ToastView = require("./ToastView");
var _ToastStatic = require("./ToastStatic");var _class, _Toast;







/**
 * Состояния тоста:
 *
 * - default стиль для отображения по-умолчанию
 * - error стиль для отображения ошибок
 **/






















/** @deprecated выпилить старый подход к api push Toast-а в react-ui 6.0 */







/** Объект с конфигурацией отображения Toast-а */















/** TODO: Новый Api для метода push в Toast. Станет api по-умолчанию с версии 6.0. В мажоре нужно будет убрать New из названия */




var ToastDataTids = exports.ToastDataTids = {
  toastStatic: 'StaticToast',
  toastView: 'ToastView__root',
  action: 'ToastView__action',
  close: 'ToastView__close'
};

/**
 * `Toast` — это короткое немодальное уведомление, которое сообщает пользователю о результате выполнения его команды.
 * Результат может быть положительным, отрицательным или нейтральным.
 *
 * Доступен статический метод: `Toast.push(notification, action?, showTime?)`.
 * Однако, при его использовании не работает кастомизация и могут быть проблемы с перекрытием уведомления другими элементами страницы.
 *
 * В обозримом будущем планируем **полностью избавиться** от статического метода в компоненте `Toast`.
 *
 * В качестве альтернативы для `Toast.push` мы рекомендуем использовать компонент `SingleToast` или вызов метода push через `ref`.
 *
 * Метод `push` через ref поддерживает два api.
 *
 * 1. Устаревший с последовательной передачей аргументов: `toastRef.current.push('Hi', { label: 'Cancel', handler: () => {} }, 15000)`
 * 2. Новый с передачей объекта конфигурации: `toastRef.current.push('Hi', { action: { label: 'Cancel', handler: () => {} }, showTime: 15000 })`
 *
 * Устаревший подход с передачей аргументов последовательным образом **будет удалён** в следующей мажорной версии.
 */var

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


























  function Toast(props) {var _this;
    _this = _React$Component.call(this, props) || this;_this.rootRef = /*#__PURE__*/_react.default.createRef();


































































































    /**
     * @public
     */_this.
    close = function () {
      safelyCall(_this.props.onClose, _this.state.notification, _this.state.action);
      _this.setState({ notification: null, action: null });
    };_this.











































    setRootRef = function (element) {
      _this.setRootNode(element);
      // @ts-expect-error: See: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31065.
      _this.rootRef.current = element;
    };_this.

    _clearTimer = function () {
      if (_this._timeout) {
        _globalObject.globalObject.clearTimeout(_this._timeout);
        _this._timeout = null;
      }
    };_this.

    _setTimer = function () {var _this$state$showTime;
      _this._clearTimer();

      var showTime = _this.state.action ? 7000 : 3000;
      showTime = (_this$state$showTime = _this.state.showTime) != null ? _this$state$showTime : showTime;
      _this._timeout = _globalObject.globalObject.setTimeout(_this.close, showTime);
    };_this.

    _refToast = function (element) {
      _this._toast = element;
    };_this.state = { notification: null, action: null, id: 0, showTime: null, showCloseIcon: false, currentUse: 'default' };return _this;}(0, _inheritsLoose2.default)(Toast, _React$Component);var _proto = Toast.prototype;_proto.componentWillUnmount = function componentWillUnmount() {this._clearTimer();};_proto.render = function render() {var _this2 = this;return /*#__PURE__*/_react.default.createElement(_ThemeContext.ThemeContext.Consumer, null, function (theme) {_this2.theme = _this2.props.theme ? _ThemeFactory.ThemeFactory.create(_this2.props.theme, theme) : theme;return /*#__PURE__*/_react.default.createElement(_ThemeContext.ThemeContext.Provider, { value: _this2.theme }, /*#__PURE__*/_react.default.createElement(_RenderContainer.RenderContainer, null, /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.TransitionGroup, null, _this2._renderToast())));});} /**
   * Показывает тост с `notification` в качестве сообщения.
   * Тост автоматически скрывается через 3 или 7 секунд,
   * в зависимости от наличия у него кнопки `action` внутри config-а.
   * Время показа можно задать вручную, передав `showTime` внутри config-а.
   *
   * @public
   * @param {React.ReactNode} notification
   * @param {ToastPushConfig} config объект с конфигурацией отображения компонента Toast
   *
   * @description Сейчас есть поддержка старого api метода push с передачей аргументов последовательно, но с версии 6.0 этот функционал будет удалён.
   * @example
   * // Будет удален в 6.0
   * push('notification', { label: "cat meow", handler: () => {} }, 15_000, false, "error")
   *
   * @example
   * // Останется в > 6.0
   * push('notification', { action: { label: "cat meow", handler: () => {} }, showTime: 15_000, showCloseIcon: false, use: "error" })
   */;_proto.push = function push(notification, configOrAction, showTime, showCloseIcon, use) {if (this.state.notification) {this.close();}if (isNewToastPushApi(configOrAction)) {var _action = configOrAction.action,_showTime = configOrAction.showTime,_showCloseIcon = configOrAction.showCloseIcon,_use = configOrAction.use;safelyCall(this.props.onPush, notification, _action);this.setState(function (_ref) {var id = _ref.id;return { notification: notification, action: _action, id: id + 1, showTime: _showTime, showCloseIcon: _showCloseIcon, currentUse: _use != null ? _use : 'default' };}, this._setTimer);} /** @deprecated выпилить старый подход к api push Toast-а в react-ui 6.0 */if (isOldToastPushApi(configOrAction) || isEmptySecondArg(configOrAction)) {var _action2 = configOrAction;safelyCall(this.props.onPush, notification, _action2);this.setState(function (_ref2) {var id = _ref2.id;return { notification: notification, action: _action2, id: id + 1, showTime: showTime, showCloseIcon: showCloseIcon, currentUse: use != null ? use : 'default' };}, this._setTimer);}};_proto._renderToast = function _renderToast() {var _this$state = this.state,notification = _this$state.notification,action = _this$state.action,id = _this$state.id,showCloseIcon = _this$state.showCloseIcon,currentUse = _this$state.currentUse;if (!notification) {return null;}var toastProps = { onMouseEnter: this._clearTimer, onMouseLeave: this._setTimer, onClose: this.close, children: notification, 'aria-label': this.props['aria-label'], action: action, showCloseIcon: showCloseIcon, use: currentUse };return /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.CSSTransition, { key: id, classNames: { enter: _Toast2.styles.enter(), enterActive: _Toast2.styles.enterActive(), exit: _Toast2.styles.exit(), exitActive: _Toast2.styles.exitActive() }, timeout: { enter: 200, exit: 150 }, enter: !_currentEnvironment.isTestEnv, exit: !_currentEnvironment.isTestEnv, nodeRef: this.rootRef }, /*#__PURE__*/_react.default.createElement(_CommonWrapper.CommonWrapper, (0, _extends2.default)({ rootNodeRef: this.setRootRef }, this.props), /*#__PURE__*/_react.default.createElement(_ToastView.ToastView, (0, _extends2.default)({ ref: this._refToast }, toastProps))));};return Toast;}(_react.default.Component), _Toast.__KONTUR_REACT_UI__ = 'Toast', _Toast.displayName = 'Toast', _Toast.push = function (notification, action, showTime, showCloseIcon) {_ToastStatic.ToastStatic.push(notification, action, showTime, showCloseIcon);}, _Toast.close = function () {_ToastStatic.ToastStatic.close();}, _Toast)) || _class;function safelyCall(fn) {if (fn) {for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {args[_key - 1] = arguments[_key];}fn.apply(void 0, args);}}function isNewToastPushApi(value) {return Boolean(value && typeof value === 'object' && !('label' in value));}function isOldToastPushApi(value) {return Boolean(value && typeof value === 'object' && 'label' in value);} /** Хелпер для случая, когда передаём только текст */function isEmptySecondArg(value) {
  return !value;
}