<template>
  <view v-if="value" class="tn-action-sheet-class tn-action-sheet">
    <tn-popup
      v-model="value"
      mode="bottom"
      length="auto"
      :popup="false"
      :borderRadius="borderRadius"
      :maskCloseable="maskCloseable"
      :safeAreaInsetBottom="safeAreaInsetBottom"
      :zIndex="elZIndex"
      @close="close"
    >
      <!-- 提示信息 -->
      <view
        v-if="tips.text"
        class="tn-action-sheet__tips tn-border-solid-bottom"
        :style="[tipsStyle]"
      >
        {{tips.text}}
      </view>
      <!-- 按钮列表 -->
      <block v-for="(item, index) in list" :key="index">
        <view
          class="tn-action-sheet__item tn-text-ellipsis"
          :class="[ index < list.length - 1 ? 'tn-border-solid-bottom' : '']"
          :style="[itemStyle(index)]"
          hover-class="tn-hover-class"
          :hover-stay-time="150"
          @tap="itemClick(index)"
          @touchmove.stop.prevent
        >
          <text>{{item.text}}</text>
          <text v-if="item.subText" class="tn-action-sheet__item__subtext tn-text-ellipsis">{{item.subText}}</text>
        </view>
      </block>
      
      <!-- 取消按钮 -->
      <block v-if="cancelBtn">
        <view class="tn-action-sheet__cancel--gab"></view>
        <view
          class="tn-action-sheet__cancel tn-action-sheet__item"
          hover-class="tn-hover-class"
          :hover-stay-time="150"
          @tap="close"
        >{{cancelText}}</view>
      </block>
      
    </tn-popup>
  </view>
</template>

<script>
  export default {
    name: 'tn-action-sheet',
    props: {
      // 通过v-model控制弹出和收起
      value: {
        type: Boolean,
        default: false
      },
      // 按钮文字数组，可以自定义颜色和字体大小
      // return [{
      // 	text: '确定',
      //  subText: '这是一个确定按钮',
      // 	color: '',
      // 	fontSize: '',
      //  disabled: true
      // }]
      list: {
        type: Array,
        default() {
          return []
        }
      },
      // 顶部提示文字
      tips: {
        type: Object,
        default() {
          return {
            text: '',
            color: '',
            fontSize: 26
          }
        }
      },
      // 弹出的顶部圆角值
      borderRadius: {
        type: Number,
        default: 0
      },
      // 点击遮罩可以关闭
      maskCloseable: {
        type: Boolean,
        default: true
      },
      // 底部取消按钮
      cancelBtn: {
        type: Boolean,
        default: true
      },
      // 底部取消按钮的文字
      cancelText: {
        type: String,
        default: '取消'
      },
      // 开启底部安全区域
      // 在iPhoneX机型底部添加一定的内边距
      safeAreaInsetBottom: {
        type: Boolean,
        default: false
      },
      // z-index值
      zIndex: {
        type: Number,
        default: 0
      }
    },
    computed: {
      // 顶部提示样式
      tipsStyle() {
        let style = {}
        if (this.tips.color) style.color = this.tips.color
        if (this.tips.fontSize) style.fontSize = this.tips.fontSize + 'rpx'
        
        return style
      },
      // 操作项目的样式
      itemStyle() {
        return (index) => {
          let style = {}
          if (this.list[index].color) style.color = this.list[index].color
          if (this.list[index].fontSize) style.fontSize = this.list[index].fontSize + 'rpx'
          
          // 选项被禁用的样式
          if (this.list[index].disabled) style.color = '#AAAAAA'
          
          return style
        }
      },
      elZIndex() {
        return this.zIndex ? this.zIndex : this.$tn.zIndex.popup
      }
    },
    methods: {
      // 点击取消按钮
      close() {
        // 发送input事件，并不会作用于父组件，而是要设置组件内部通过props传递的value参数
        this.popupClose();
        this.$emit('close');
      },
      // 关闭弹窗
      popupClose() {
        this.$emit('input', false)
      },
      // 点击对应的item
      itemClick(index) {
        // 如果是禁用项则不进行操作
        if (this.list[index].disabled) return
        this.$emit('click', index)
        this.popupClose()
      }
    }
  }
</script>

<style lang="scss" scoped>
  
  .tn-action-sheet {
    &__tips {
      font-size: 26rpx;
      text-align: center;
      padding: 34rpx 0;
      line-height: 1;
      color: #838383;
    }
    
    &__item {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      font-size: 32rpx;
      padding: 34rpx 0;
      
      &__subtext {
        font-size: 24rpx;
        color: #838383;
        margin-top: 20rpx;
      }
    }
    
    &__cancel {
      color: #080808;
      
      &--gab {
        height: 12rpx;
        background-color: #eaeaec;
      }
    }
  }
</style>
