'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _extends2 = require('babel-runtime/helpers/extends');

var _extends3 = _interopRequireDefault(_extends2);

var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');

var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);

var _src = require('../vc-drawer/src');

var _src2 = _interopRequireDefault(_src);

var _vueTypes = require('../_util/vue-types');

var _vueTypes2 = _interopRequireDefault(_vueTypes);

var _BaseMixin = require('../_util/BaseMixin');

var _BaseMixin2 = _interopRequireDefault(_BaseMixin);

var _propsUtil = require('../_util/props-util');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var Drawer = {
  name: 'ADrawer',
  props: {
    closable: _vueTypes2['default'].bool.def(true),
    destroyOnClose: _vueTypes2['default'].bool,
    getContainer: _vueTypes2['default'].any,
    maskClosable: _vueTypes2['default'].bool.def(true),
    mask: _vueTypes2['default'].bool,
    maskStyle: _vueTypes2['default'].object,
    title: _vueTypes2['default'].any,
    visible: _vueTypes2['default'].bool,
    width: _vueTypes2['default'].oneOfType([_vueTypes2['default'].string, _vueTypes2['default'].number]).def(256),
    zIndex: _vueTypes2['default'].number,
    prefixCls: _vueTypes2['default'].string.def('ant-drawer'),
    placement: _vueTypes2['default'].string.def('right'),
    level: _vueTypes2['default'].any.def(null),
    wrapClassName: _vueTypes2['default'].string
  },
  mixins: [_BaseMixin2['default']],
  data: function data() {
    this.destoryClose = false;
    this.preVisible = this.$props.visible;
    return {
      _push: false
    };
  },

  inject: {
    parentDrawer: {
      'default': null
    }
  },
  provide: function provide() {
    return {
      parentDrawer: this
    };
  },
  updated: function updated() {
    var _this = this;

    this.$nextTick(function () {
      if (_this.preVisible !== _this.visible && _this.parentDrawer) {
        if (_this.visible) {
          _this.parentDrawer.push();
        } else {
          _this.parentDrawer.pull();
        }
      }
      _this.preVisible = _this.visible;
    });
  },

  methods: {
    close: function close(e) {
      if (this.visible !== undefined) {
        this.$emit('close', e);
        return;
      }
    },
    onMaskClick: function onMaskClick(e) {
      if (!this.maskClosable) {
        return;
      }
      this.close(e);
    },
    push: function push() {
      this.setState({
        _push: true
      });
    },
    pull: function pull() {
      this.setState({
        _push: false
      });
    },
    onDestoryTransitionEnd: function onDestoryTransitionEnd() {
      var isDestroyOnClose = this.getDestoryOnClose();
      if (!isDestroyOnClose) {
        return;
      }
      if (!this.visible) {
        this.destoryClose = true;
        this.$forceUpdate();
      }
    },
    getDestoryOnClose: function getDestoryOnClose() {
      return this.destroyOnClose && !this.visible;
    },
    renderBody: function renderBody() {
      var h = this.$createElement;

      if (this.destoryClose && !this.visible) {
        return null;
      }
      this.destoryClose = false;
      var _$props = this.$props,
          placement = _$props.placement,
          bodyStyle = _$props.bodyStyle;


      var containerStyle = placement === 'left' || placement === 'right' ? {
        overflow: 'auto',
        height: '100%'
      } : {};

      var isDestroyOnClose = this.getDestoryOnClose();
      if (isDestroyOnClose) {
        // Increase the opacity transition, delete children after closing.
        containerStyle.opacity = 0;
        containerStyle.transition = 'opacity .3s';
      }
      var _$props2 = this.$props,
          prefixCls = _$props2.prefixCls,
          closable = _$props2.closable;

      var title = (0, _propsUtil.getComponentFromProp)(this, 'title');
      var header = void 0;
      if (title) {
        header = h(
          'div',
          { 'class': prefixCls + '-header' },
          [h(
            'div',
            { 'class': prefixCls + '-title' },
            [title]
          )]
        );
      }
      var closer = void 0;
      if (closable) {
        closer = h(
          'button',
          {
            on: {
              'click': this.close
            },
            attrs: {
              'aria-label': 'Close'
            },
            'class': prefixCls + '-close'
          },
          [h('span', { 'class': prefixCls + '-close-x' })]
        );
      }

      return h(
        'div',
        {
          'class': prefixCls + '-wrapper-body',
          style: containerStyle,
          on: {
            'transitionend': this.onDestoryTransitionEnd
          }
        },
        [header, closer, h(
          'div',
          { 'class': prefixCls + '-body', style: bodyStyle },
          [this.$slots['default']]
        )]
      );
    }
  },
  render: function render() {
    var h = arguments[0];

    var props = (0, _propsUtil.getOptionProps)(this);
    var zIndex = props.zIndex,
        visible = props.visible,
        placement = props.placement,
        mask = props.mask,
        wrapClassName = props.wrapClassName,
        rest = (0, _objectWithoutProperties3['default'])(props, ['zIndex', 'visible', 'placement', 'mask', 'wrapClassName']);

    var vcDrawerStyle = this.$data._push ? {
      zIndex: zIndex,
      transform: 'translateX(' + (placement === 'left' ? 180 : -180) + 'px)'
    } : { zIndex: zIndex };
    var vcDrawerProps = {
      props: (0, _extends3['default'])({
        handler: false,
        open: visible,
        showMask: mask,
        placement: placement,
        wrapClassName: wrapClassName
      }, rest),
      on: (0, _extends3['default'])({
        maskClick: this.onMaskClick
      }, this.$listeners),
      style: vcDrawerStyle

    };
    return h(
      _src2['default'],
      vcDrawerProps,
      [this.renderBody()]
    );
  }
};

/* istanbul ignore next */
Drawer.install = function (Vue) {
  Vue.component(Drawer.name, Drawer);
};

exports['default'] = Drawer;
module.exports = exports['default'];