<template>
  <div class="simple-login">
    <van-overlay :show="show" @click="show = false">
      <div class="wrapper flex justify-center items-center" @click.stop>
        <div class="block flex items-center flex-col py-6">
          <div class="close" @click="onClose"></div>
          <div class="title pb-6">登录</div>
          <div class="form">
            <div class="form-item mb-4">
              <input
                type="text"
                placeholder="手机号"
                v-model="formData.mobile"
                maxlength="11"
              />
            </div>
            <div class="form-item mb-4 code">
              <input
                type="text"
                placeholder="验证码"
                class="code"
                v-model="formData.verifyCode"
                maxlength="6"
              />
              <span class="send" @click="onSend">{{ sendCodeBtnText }}</span>
            </div>
            <div class="submit" @click="onSubmit">登录</div>
          </div>
        </div>
      </div>
    </van-overlay>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'
import { isMobile } from '@/utils/validator'
export default {
  name: 'simple-login',
  data() {
    return {
      show: false,
      sendStatus: 0,
      formData: {
        authUserId: '',
        mobile: '',
        verifyCode: '',
      },
      timer: null,
    }
  },
  computed: {
    ...mapGetters(['loginVisiable', 'authUserId', 'routePrefix']),
    sendCodeBtnText() {
      return this.sendStatus === 0
        ? '发送验证码'
        : `再次发送${this.sendStatus}s`
    },
  },
  watch: {
    loginVisiable() {
      this.show = this.loginVisiable
    },
  },
  methods: {
    async onSubmit() {
      try {
        this.formData.authUserId = this.authUserId
        const res = await this.$http.api.customLogin(this.formData)
        this.$store.dispatch('user/login', res.data)
        this.$setStorage(this.routePrefix, 'userInfo', res.data)
        // 关闭登录窗口
        this.onClose()
        // 重定向
        const login_redicret = this.$getStorage(
          this.routePrefix,
          'login_redicret'
        )
        if (login_redicret && login_redicret !== this.$route.path) {
          this.$router.push(login_redicret)
        }
      } catch (error) {
        console.log(error)
      }
    },
    // 关闭登录窗口
    onClose() {
      this.$store.commit('app/HIDE_LOGIN')
      this.formData.mobile = ''
      this.formData.verifyCode = ''
      this.formData.authUserId = ''
    },
    async onSend() {
      if (this.sendStatus > 0) return
      // 验证手机号是否合法
      if (!isMobile(this.formData.mobile)) {
        this.$toast('请输入正确的手机号')
        return
      }
      try {
        // 发送验证码
        const res = await this.$http.api.sendVerifyCode({
          mobile: this.formData.mobile,
          authUserId: this.authUserId,
          type: 1,
        })
        this.$toast('验证码已发送')
        // 开启倒计时
        this.countdown()
      } catch (error) {
        console.log(error)
      }
    },
    countdown() {
      this.sendStatus = 30
      this.timer = setInterval(() => {
        if (this.sendStatus === 0) {
          clearInterval(this.timer)
          return
        }
        this.sendStatus--
      }, 1000)
    },
  },
}
</script>

<style scoped lang="scss">
@media screen and (min-width: 768px) {
  .wrapper {
    height: 100vh;

    .block {
      position: relative;
      width: 400px;
      background: #fff;

      .close {
        position: absolute;
        right: 16px;
        top: 16px;
        width: 24px;
        height: 24px;
        background: url(https://static.caimei365.com/www/authentic/h5/icon-close.png)
          center no-repeat;
        background-size: 24px 24px;
        cursor: pointer;
      }

      .title {
        font-size: 24px;
        color: #101010;
      }

      .form-item {
        position: relative;
        width: 326px;

        input {
          width: 326px;
          display: block;
          padding: 14px 16px;
          font-size: 14px;
          border: 1px solid #d8d8d8;
          box-sizing: border-box;

          &.code {
            width: 225px;
          }
        }
        .send {
          position: absolute;
          right: 0;
          top: 50%;
          transform: translateY(-50%);
          font-size: 16px;
          color: #bc1724;
          cursor: pointer;
        }
      }
      .submit {
        width: 326px;
        height: 46px;
        background: #bc1724;
        font-size: 16px;
        color: #fff;
        text-align: center;
        line-height: 46px;
        transition: all 0.4s;
        cursor: pointer;

        &:hover {
          background-color: #960915;
        }
      }
    }
  }
}
@media screen and (max-width: 768px) {
  .wrapper {
    height: 100vh;

    .block {
      position: relative;
      width: 76vw;
      background: #fff;

      .close {
        position: absolute;
        right: 2.4vw;
        top: 2.4vw;
        width: 5.6vw;
        height: 5.6vw;
        background: url(https://static.caimei365.com/www/authentic/h5/icon-close.png)
          center no-repeat;
        background-size: 4.8vw 4.8vw;
        cursor: pointer;
      }

      .title {
        font-size: 4.8vw;
        color: #101010;
      }

      .form-item {
        position: relative;
        width: 62vw;

        input {
          width: 62vw;
          display: block;
          padding: 1.8vw 2.4vw;
          font-size: 14px;
          border: 0.1vw solid #d8d8d8;
          box-sizing: border-box;

          &.code {
            width: 42.8vw;
          }
        }
        .send {
          position: absolute;
          right: 0;
          top: 50%;
          transform: translateY(-50%);
          font-size: 3.2vw;
          color: #bc1724;
          cursor: pointer;
        }
      }
      .submit {
        width: 62vw;
        height: 8.8vw;
        background: #bc1724;
        font-size: 3.2vw;
        color: #fff;
        text-align: center;
        line-height: 8.8vw;
        transition: all 0.4s;

        &:hover {
          background-color: #b60c1a;
        }
      }
    }
  }
}
</style>
