text: import baseComponent from '../helpers/baseComponent'
  import classNames from '../helpers/classNames'
  
  const defaults = {
      prefixCls: 'wux-dialog',
      title: '',
      content: '',
      buttons: [],
      verticalButtons: !1,
      resetOnClose: false,
      closable: false,
      mask: true,
      maskClosable: true,
      zIndex: 1000,
  }
  
  const defaultOptions = {
      onCancel() {},
      cancelText: '取消',
      cancelType: 'default',
      onConfirm() {},
      confirmText: '确定',
      confirmType: 'primary',
  }
  
  baseComponent({
      useFunc: true,
      data: defaults,
      computed: {
          classes() {
              const { prefixCls, buttons: btns, verticalButtons } = this.data
              const prompt = `${prefixCls}__prompt`
              const input = `${prefixCls}__input`
              const buttons = classNames(`${prefixCls}__buttons`, {
                  [`${prefixCls}__buttons--${verticalButtons ? 'vertical' : 'horizontal'}`]: true,
              })
              const button = btns.map((button) => {
                  const wrap = classNames(`${prefixCls}__button`, {
                      [`${prefixCls}__button--${button.type || 'default'}`]: button.type || 'default',
                      [`${prefixCls}__button--bold`]: button.bold,
                      [`${button.className}`]: button.className,
                  })
                  const hover = button.hoverClass && button.hoverClass !== 'default' ? button.hoverClass : `${prefixCls}__button--hover`
  
                  return {
                      wrap,
                      hover,
                  }
              })
  
              return {
                  prompt,
                  input,
                  buttons,
                  button,
              }
          },
      },
      methods: {
          /**
           * 组件关闭时重置其内部数据
           */
          onClosed() {
              if (this.data.resetOnClose) {
                  const params = {
                      ...this.$$mergeOptionsToData(defaults),
                      prompt: null,
                  }
  
                  this.$$setData(params)
              }
          },
          /**
           * 点击 x 或 mask 回调
           */
          onClose() {
              this.hide()
          },
          /**
           * 隐藏
           */
          hide(cb) {
              this.$$setData({ in: false })
              if (typeof cb === 'function') {
                  cb.call(this)
              }
          },
          /**
           * 显示
           */
          show(opts = {}) {
              const options = this.$$mergeOptionsAndBindMethods(Object.assign({}, defaults, opts))
              this.$$setData({ in: true, ...options })
              return this.hide.bind(this)
          },
          /**
           * 按钮点击事件
           */
          buttonTapped(e) {
              const { index } = e.currentTarget.dataset
              const button = this.data.buttons[index]
              this.hide(() => typeof button.onTap === 'function' && button.onTap(e))
          },
          /**
           * 当键盘输入时，触发 input 事件
           */
          bindinput(e) {
              this.$$setData({
                  'prompt.response': e.detail.value,
              })
          },
          /**
           * 显示dialog组件
           * @param {Object} opts 配置项
           * @param {String} opts.title 提示标题
           * @param {String} opts.content 提示文本
           * @param {Boolean} opts.verticalButtons 是否显示垂直按钮布局
           * @param {Array} opts.buttons 按钮
           * @param {String} opts.buttons.text 按钮的文字
           * @param {String} opts.buttons.type 按钮的类型
           * @param {Boolean} opts.buttons.bold 是否加粗按钮的文字
           * @param {Function} opts.buttons.onTap 按钮的点击事件
           */
          open(opts = {}) {
              return this.show(opts)
          },
          /**
           * 显示dialog组件
           * @param {Object} opts 配置项
           * @param {String} opts.title 提示标题
           * @param {String} opts.content 提示文本
           * @param {String} opts.confirmText 确定按钮的文字，默认为"确定"
           * @param {String} opts.confirmType 确定按钮的类型
           * @param {Function} opts.onConfirm 确定按钮的点击事件
           */
          alert(opts = {}) {
              return this.open(Object.assign({
                  buttons: [{
                      text: opts.confirmText || defaultOptions.confirmText,
                      type: opts.confirmType || defaultOptions.confirmType,
                      onTap: (e) => {
                          typeof opts.onConfirm === 'function' && opts.onConfirm(e)
                      },
                  }, ],
              }, opts))
          },
          /**
           * 显示dialog组件
           * @param {Object} opts 配置项
           * @param {String} opts.title 提示标题
           * @param {String} opts.content 提示文本
           * @param {String} opts.confirmText 确定按钮的文字，默认为"确定"
           * @param {String} opts.confirmType 确定按钮的类型
           * @param {Function} opts.onConfirm 确定按钮的点击事件
           * @param {String} opts.cancelText 取消按钮的文字，默认为"取消"
           * @param {String} opts.cancelType 取消按钮的类型
           * @param {Function} opts.onCancel 取消按钮的点击事件
           */
          confirm(opts = {}) {
              return this.open(Object.assign({
                  buttons: [{
                          text: opts.cancelText || defaultOptions.cancelText,
                          type: opts.cancelType || defaultOptions.cancelType,
                          onTap: (e) => {
                              typeof opts.onCancel === 'function' && opts.onCancel(e)
                          },
                      },
                      {
                          text: opts.confirmText || defaultOptions.confirmText,
                          type: opts.confirmType || defaultOptions.confirmType,
                          onTap: (e) => {
                              typeof opts.onConfirm === 'function' && opts.onConfirm(e)
                          },
                      },
                  ],
              }, opts))
          },
          /**
           * 显示dialog组件
           * @param {Object} opts 配置项
           * @param {String} opts.title 提示标题
           * @param {String} opts.content 提示文本
           * @param {String} opts.fieldtype input 的类型，有效值：text, number, idcard, digit
           * @param {Boolean} opts.password 是否是密码类型
           * @param {String} opts.defaultText 默认值
           * @param {String} opts.placeholder 输入框为空时占位符
           * @param {Number} opts.maxlength 最大输入长度，设置为 -1 的时候不限制最大长度
           * @param {String} opts.confirmText 确定按钮的文字，默认为"确定"
           * @param {String} opts.confirmType 确定按钮的类型
           * @param {Function} opts.onConfirm 确定按钮的点击事件
           * @param {String} opts.cancelText 取消按钮的文字，默认为"取消"
           * @param {String} opts.cancelType 取消按钮的类型
           * @param {Function} opts.onCancel 取消按钮的点击事件
           */
          prompt(opts = {}) {
              const prompt = {
                  fieldtype: opts.fieldtype ? opts.fieldtype : 'text',
                  password: !!opts.password,
                  response: opts.defaultText ? opts.defaultText : '',
                  placeholder: opts.placeholder ? opts.placeholder : '',
                  maxlength: opts.maxlength ? parseInt(opts.maxlength) : '',
              }
  
              return this.open(Object.assign({
                  prompt: prompt,
                  buttons: [{
                          text: opts.cancelText || defaultOptions.cancelText,
                          type: opts.cancelType || defaultOptions.cancelType,
                          onTap: (e) => {
                              typeof opts.onCancel === 'function' && opts.onCancel(e)
                          },
                      },
                      {
                          text: opts.confirmText || defaultOptions.confirmText,
                          type: opts.confirmType || defaultOptions.confirmType,
                          onTap: (e) => {
                              typeof opts.onConfirm === 'function' && opts.onConfirm(e, this.data.prompt.response)
                          },
                      },
                  ],
              }, opts))
          },
      },
  })
  