package com.xw.yunwei.ui.user.login import android.app.Application import android.os.CountDownTimer import android.view.View import androidx.lifecycle.MutableLiveData import com.xw.common.Constants import com.xw.common.base.BaseViewModel import com.xw.common.utils.KeyPreferences import com.xw.common.utils.MMKVManager import com.xw.common.utils.ToastUtilCommon import com.xw.yunwei.BuildConfig import com.xw.yunwei.R import com.xw.yunwei.extension.encryptByPublicKey import com.xw.yunwei.model.PasswordLoginCodeValidateInfo import com.xw.yunwei.net.UserRepository import com.xw.yunwei.net.YiHuRepository import com.xw.yunwei.ui.MainActivity import org.koin.core.component.inject import kotlin.getValue class LoginVM(application: Application) : BaseViewModel(application) { val userRepository: UserRepository by inject() val yiHuRepository: YiHuRepository by inject() val tabIndex = MutableLiveData(0) val phone = MutableLiveData("") val code = MutableLiveData("") val codeTips = MutableLiveData("发送验证码") var canGetCode = MutableLiveData(false) val psw = MutableLiveData("") val pswConfirm = MutableLiveData("") val eyeStatus1 = MutableLiveData(false) val eyeStatus2 = MutableLiveData(false) val protocolStatus = MutableLiveData(false) //账号密码验证码验证信息 var passwordLoginCodeValidateInfo: PasswordLoginCodeValidateInfo? = null val onClick = View.OnClickListener { when (it.id) { R.id.protocolStatus -> protocolStatus.value = !protocolStatus.value!! R.id.forgetPsw -> startActivity(FindPswActivity::class.java) R.id.login -> login() R.id.getCode -> getCode(1) R.id.getCode1 -> getCode(3) R.id.submit -> modifyPsw() R.id.eye1 -> eyeStatus1.value = !eyeStatus1.value!! R.id.eye2 -> eyeStatus2.value = !eyeStatus2.value!! } } private fun login() { if (protocolStatus.value != true) { ToastUtilCommon.showWarn("请先阅读并同意用户协议和隐私政策") return } when (tabIndex.value) { 0 -> loginByCode() 1 -> loginByPassword() } } private fun loginByCode() { if (phone.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入手机号!") return } if (code.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入验证码!") return } launchRequestFlow( tips = "登录中...", flowBlock = { yiHuRepository.login(phone.value!!, code.value!!) }, onCollect = { yiHuData -> yiHuData?.let { launchRequest(tips = "登录中...") { val data = userRepository.loginByThirdToken(yiHuData.access_token!!) data?.let { Constants.token = it.token?.access_token ?: "" MMKVManager.getInstance() .saveModel(KeyPreferences.USER, it.info?.xpOperationsUser) startActivity(MainActivity::class.java) finish() } } } } ) } private fun loginByPassword() { if (phone.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入手机号!") return } if (code.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入验证码!") return } if (passwordLoginCodeValidateInfo == null) { ToastUtilCommon.showError("请重新获取验证码!") return } if (psw.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入密码!") return } launchRequestFlow( tips = "登录中...", flowBlock = { yiHuRepository.passwordLogin( phone.value!!, code.value!!, psw.value!!.encryptByPublicKey(BuildConfig.YIHU_PUBLIC_KEY), passwordLoginCodeValidateInfo!!.randomKey ) }, onCollect = { yiHuData -> yiHuData?.let { launchRequest(tips = "登录中...") { val data = userRepository.loginByThirdToken(yiHuData.access_token!!) data?.let { Constants.token = it.token?.access_token ?: "" MMKVManager.getInstance() .saveModel(KeyPreferences.USER, it.info?.xpOperationsUser) startActivity(MainActivity::class.java) finish() } } } } ) } /** * @param codeType 验证码类型 1登录 2忘记密码 3修改密码 */ private fun getCode(codeType: Int) { if (canGetCode.value!!) { if (phone.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入手机号!") return } closeKeyboard() timer.start() canGetCode.postValue(false) if (codeType != 1) { launchRequest(tips = "验证码获取中...", error = { code, msg -> canGetCode.postValue(true) timer.cancel() codeTips.postValue("重新发送") ToastUtilCommon.showError(msg) }) { val map = mapOf("phoneNumber" to phone.value!!, "codeType" to codeType) userRepository.getVerificationCode(map) ToastUtilCommon.showSuc("验证码已发送") } return } launchRequestFlow( tips = "验证码获取中...", flowBlock = { if (tabIndex.value == 0) { yiHuRepository.getPhoneLoginCode(phone.value!!) } else { yiHuRepository.getPasswordLoginCode(phone.value!!) } }, error = { code, msg -> canGetCode.postValue(true) timer.cancel() codeTips.postValue("重新发送") ToastUtilCommon.showError(msg) }, onCollect = { data -> ToastUtilCommon.showSuc("验证码已发送") if (tabIndex.value == 1) { passwordLoginCodeValidateInfo = data as PasswordLoginCodeValidateInfo? } } ) } } private fun modifyPsw() { if (phone.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入手机号!") return } if (code.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入验证码!") return } if (psw.value.isNullOrEmpty()) { ToastUtilCommon.showError("请输入密码!") return } if (psw.value!!.length < 6) { ToastUtilCommon.showError("密码长度至少6位!") return } if (pswConfirm.value.isNullOrEmpty()) { ToastUtilCommon.showError("请再次输入密码!") return } if (pswConfirm.value!!.length < 6) { ToastUtilCommon.showError("密码长度至少6位!") return } if (psw.value != pswConfirm.value) { ToastUtilCommon.showError("两次密码不一致!") return } launchRequest { val map = mapOf( "phoneNumber" to phone.value, "verificationCode" to code.value, "newPassword" to psw.value, "confirmPassword" to pswConfirm.value, ) userRepository.modifierPsw(map) ToastUtilCommon.showSuc("密码修改成功") finish() } } fun getProtocol(type: Int, block: (String) -> Unit) { launchRequest(showLoading = false) { val data = userRepository.getProtocol(type) runOnMainThread { block(data?.content ?: "") } } } //定时器 private var timer: CountDownTimer = object : CountDownTimer(60000, 1000) { override fun onTick(millisUntilFinished: Long) { if (canGetCode.value!!) { canGetCode.postValue(false) } codeTips.postValue("重新发送(${(millisUntilFinished / 1000)})") } override fun onFinish() { canGetCode.postValue(true) codeTips.postValue("重新发送") } } }