"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

var _typeof = require("@babel/runtime/helpers/typeof");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));

var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));

var React = _interopRequireWildcard(require("react"));

var _propTypes = _interopRequireDefault(require("prop-types"));

var _Button = _interopRequireDefault(require("@material-ui/core/Button"));

var _styles = require("@material-ui/core/styles");

var _Restore = _interopRequireDefault(require("@material-ui/icons/Restore"));

var _Undo = _interopRequireDefault(require("@material-ui/icons/Undo"));

var _excluded = ["classes"];

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var styles = function styles(theme) {
  return {
    wrapper: {
      display: 'flex',
      flexDirection: 'column'
    },
    resetUndoContainer: {
      display: 'flex',
      alignItems: 'center',
      justifyContent: 'center'
    },
    icon: {
      width: '24px',
      height: '24px',
      color: 'gray',
      marginRight: theme.spacing.unit
    },
    buttonContainer: {
      display: 'flex',
      alignItems: 'center',
      marginLeft: theme.spacing.unit * 3,
      marginRight: theme.spacing.unit * 3
    }
  };
};
/**
 * HOC that adds undo and reset functionality for session values
 */


var withUndoReset = function withUndoReset(WrappedComponent) {
  var WithUndoReset = /*#__PURE__*/function (_React$Component) {
    (0, _inherits2["default"])(WithUndoReset, _React$Component);

    var _super = _createSuper(WithUndoReset);

    function WithUndoReset(props) {
      var _this;

      (0, _classCallCheck2["default"])(this, WithUndoReset);
      _this = _super.call(this, props);
      (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onSessionChange", function (session) {
        _this.setState(function (state) {
          return {
            session: session,
            changes: [].concat((0, _toConsumableArray2["default"])(state.changes), [session])
          };
        }, function () {
          return _this.props.onSessionChange(session);
        });
      });
      (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onUndo", function () {
        _this.setState(function (state) {
          var newChanges = (0, _toConsumableArray2["default"])(state.changes);
          newChanges.pop();
          return {
            changes: newChanges,
            session: newChanges.length ? newChanges[newChanges.length - 1] : state.sessionInitialValues
          };
        }, function () {
          return _this.props.onSessionChange(_this.state.session);
        });
      });
      (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onReset", function () {
        _this.setState(function (state) {
          return {
            session: state.sessionInitialValues,
            changes: []
          };
        }, function () {
          return _this.props.onSessionChange(_this.state.sessionInitialValues);
        });
      });
      _this.state = {
        sessionInitialValues: JSON.parse(JSON.stringify(props.session)),
        session: props.session,
        changes: []
      };
      return _this;
    }

    (0, _createClass2["default"])(WithUndoReset, [{
      key: "render",
      value: function render() {
        var _this$props = this.props,
            classes = _this$props.classes,
            rest = (0, _objectWithoutProperties2["default"])(_this$props, _excluded);
        var _this$state = this.state,
            changes = _this$state.changes,
            session = _this$state.session;
        return /*#__PURE__*/React.createElement("div", {
          className: classes.wrapper
        }, /*#__PURE__*/React.createElement("div", {
          className: classes.resetUndoContainer
        }, /*#__PURE__*/React.createElement(_Button["default"], {
          className: classes.buttonContainer,
          color: "primary",
          disabled: changes.length === 0,
          onClick: this.onUndo
        }, /*#__PURE__*/React.createElement(_Undo["default"], {
          className: classes.icon
        }), " Undo"), /*#__PURE__*/React.createElement(_Button["default"], {
          className: classes.buttonContainer,
          color: "primary",
          disabled: changes.length === 0,
          onClick: this.onReset
        }, /*#__PURE__*/React.createElement(_Restore["default"], {
          className: classes.icon
        }), " Start Over")), /*#__PURE__*/React.createElement(WrappedComponent, (0, _extends2["default"])({}, rest, {
          session: session,
          onSessionChange: this.onSessionChange
        })));
      }
    }]);
    return WithUndoReset;
  }(React.Component);

  (0, _defineProperty2["default"])(WithUndoReset, "propTypes", {
    classes: _propTypes["default"].object,
    session: _propTypes["default"].object,
    onSessionChange: _propTypes["default"].func
  });
  return (0, _styles.withStyles)(styles)(WithUndoReset);
};

var _default = withUndoReset;
exports["default"] = _default;
//# sourceMappingURL=withUndoReset.js.map