LoginViewModel.ets 11.7 KB
import { Logger } from 'wdKit/src/main/ets/utils/Logger'
import { LoginModel } from './LoginModel'
import { LoginBean } from './LoginBean'
import { AppUtils, EmitterEventId, EmitterUtils, SPHelper, StringUtils, UserDataLocal } from 'wdKit'
import { CheckVerifyBean } from './CheckVerifyBean'
import cryptoFramework from '@ohos.security.cryptoFramework'
import buffer from '@ohos.buffer'
import { encryptMessage } from '../../utils/cryptoUtil'

import { SpConstants } from 'wdConstant/Index'
import { UserDetail } from 'wdBean/Index';
import { HttpUrlUtils, HttpUtils, ResponseDTO, WDHttp } from 'wdNetwork/Index'
import { LoginModule } from '../../LoginModule'
import HuaweiAuth from '../../utils/HuaweiAuth'

const TAG = "LoginViewModel"

export class LoginViewModel {
  loginModel: LoginModel

  constructor() {
    this.loginModel = new LoginModel()
  }

  //发送验证码
  sendVerifyCode(number: string) {
    return new Promise<object>((success, fail) => {
      this.loginModel.sendVerifyCode(number).then((data) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })

  }

  sendVerifyCodeByToken() {
    return new Promise<object>((success, fail) => {
      this.loginModel.sendVerifyCodeByToken().then((data) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })

  }

  appLogin(phone: string, loginType: number, verificationCode: string) {

    return new Promise<LoginBean>((success, fail) => {
      this.loginModel.appLogin(phone, loginType, verificationCode).then((data: LoginBean) => {
        this.dealWithLoginSuccess(data)
        success(data)
      }).catch((error:string) => {
        fail(error)
      })
    })
  }

  huaweiOneKeyLogin(authCode: string) {
    return new Promise<LoginBean>((success, fail) => {
      this.loginModel.thirdPartLogin(9, {"idToken": authCode}).then(async (data: LoginBean) => {
        this.dealWithLoginSuccess(data)

        try {
          await this.queryUserDetail()

          // 1、暂时只能更新昵称
          // 2、昵称需要审核,需要接口支持不带审核的?
          // if (data.firstMark == 1) {
          //   let profileData = await HuaweiAuth.sharedInstance().requestProfile()
          //
          //   if (profileData.nickName && profileData.nickName.length > 0) {
          //
          //     let creatorId = SPHelper.default.getSync(SpConstants.USER_CREATOR_ID, "") as string
          //     if (data.userType == 1) {
          //       await this.uploadNormalUserNickNameFirstTime(profileData.nickName)
          //     } else if (creatorId.length > 0) {
          //       await this.uploadCreatorNickNameFirstTime(creatorId, profileData.nickName)
          //     }
          //   }
          //
          // }
        } catch (e) {
          
        } finally {
          success(data)
        }

      }).catch((error:string) => {
        fail(error)
      })
    })
  }

  //TODO: 这里要整体改掉
  dealWithLoginSuccess(data: LoginBean) {
    SPHelper.default.saveSync(SpConstants.USER_FIRST_MARK, data.firstMark ?? 0)
    SPHelper.default.saveSync(SpConstants.USER_ID, data.id)
    SPHelper.default.saveSync(SpConstants.USER_JWT_TOKEN, data.jwtToken)
    SPHelper.default.saveSync(SpConstants.USER_LONG_TIME_NO_LOGIN_MARK, data.longTimeNoLoginMark ?? 0)
    SPHelper.default.saveSync(SpConstants.USER_REFRESH_TOKEN, data.refreshToken)
    SPHelper.default.saveSync(SpConstants.USER_STATUS, data.status ?? 0)
    SPHelper.default.saveSync(SpConstants.USER_Type, data.userType)
    SPHelper.default.saveSync(SpConstants.USER_NAME, data.userName ?? "")
    EmitterUtils.sendEmptyEvent(EmitterEventId.LOGIN_SUCCESS)

    LoginModule.reportDeviceInfo(AppUtils.gotApplicationContextFunc!())
  }

  async appLoginByPassword(phone: string, loginType: number, password: string, oldPassword: string) {
    let newLoginType: number
    let isPhone = this.verifyIsPhoneNumber(phone)
    if (isPhone) {
      newLoginType = 0;
    } else {
      newLoginType = 8;
    }
    return new Promise<LoginBean>(async (success, fail) => {
      let passwordNew = await this.doMd(password)
      Logger.debug(TAG, "PASSWORD:" + passwordNew)
      this.loginModel.appLoginByPassword(phone, newLoginType, passwordNew, oldPassword).then((data: LoginBean) => {
       this.dealWithLoginSuccess(data)
        success(data)
      }).catch((value: string) => {
        fail(value)
      })
    })
  }

  //{"code":"0","data":{"tempToken":"eyJhbGciOiJIUzI1NiIsImtpZCI6ImQ4WkI2QkhxSEZrdjJ2U25BNlRwZEdKRjBHcjItVzBvS2FaYzdLOUUycmcifQ.eyJpc3MiOiJwZW9wbGVzLWRhaWx5LWZvdXJhIiwic3ViIjoicGVvcGxlcy1kYWlseS1mb3VyYSIsImV4cCI6MTcxMDQ2ODE5NCwidXNlcklkIjpudWxsLCJ1c2VyVmVyc2lvbiI6Im51bGxfbnVsbCIsInVzZXJOYW1lIjpudWxsLCJ1c2VyVHlwZSI6bnVsbCwiY3JlYXRvcklkIjpudWxsLCJ1c2VySWRaaCI6bnVsbH0.R5gv44Gyni3QTxtWvSxYn0eMuUD5_bI1hh9TaThq25g","jwtToken":"eyJhbGciOiJIUzI1NiIsImtpZCI6ImQ4WkI2QkhxSEZrdjJ2U25BNlRwZEdKRjBHcjItVzBvS2FaYzdLOUUycmcifQ.eyJpc3MiOiJwZW9wbGVzLWRhaWx5LWZvdXJhIiwic3ViIjoicGVvcGxlcy1kYWlseS1mb3VyYSIsImV4cCI6MTcxMDY0NzU5NCwidXNlcklkIjo1NjkzNTAwNzk4ODk2NjksInVzZXJWZXJzaW9uIjoiNTY5MzUwMDc5ODg5NjY5XzAiLCJ1c2VyTmFtZSI6IiVFNCVCQSVCQSVFNiVCMCU5MSVFNiU5NyVBNSVFNiU4QSVBNSVFNyVCRCU5MSVFNSU4RiU4QjJrRDJ4VyIsInVzZXJUeXBlIjoxLCJjcmVhdG9ySWQiOm51bGwsInVzZXJJZFpoIjpudWxsfQ.Ai19vg8-rhJNXt2nwFTfir7s01eLfTtOCKcptIpeyG0"},"message":"Success","success":true,"timestamp":1710467595186}
  checkVerifyCode(phone: string, verifyCode: string) {
    return new Promise<CheckVerifyBean>((success, reject) => {
      this.loginModel.checkVerifyCode(phone, verifyCode).then((data: CheckVerifyBean) => {
        //todo 保存数据
        SPHelper.default.saveSync(SpConstants.USER_TEMP_TOKEN, data.tempToken)
        SPHelper.default.saveSync(SpConstants.USER_JWT_TOKEN, data.jwtToken)
        success(data)

      }, (value: string) => {
        reject(value)
      })
    })
  }
  checkVerifyCodeByToken(verifyCode: string) {
    return new Promise<CheckVerifyBean>((success, reject) => {
      this.loginModel.checkVerifyCodeByToken(verifyCode).then((data: CheckVerifyBean) => {
        //todo 保存数据
        SPHelper.default.saveSync(SpConstants.USER_TEMP_TOKEN, data.tempToken)
        SPHelper.default.saveSync(SpConstants.USER_JWT_TOKEN, data.jwtToken)
        success(data)

      }, (value: string) => {
        reject(value)
      })
    })
  }

  //重置密码 需要老密码
  resetPassword(password: string, tempToken: string)  {
    return new Promise<string>(async (success, fail) => {

      let passwordNew = await encryptMessage(password);
      this.loginModel.resetPassword(passwordNew, tempToken).then((data) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })

  }

  //忘记密码
  forgotPassword(password: string, tempToken: string)  {
    return new Promise<object>(async (success, fail) => {
      let passwordNew = await encryptMessage(password)
      this.loginModel.forgotPassword(passwordNew, tempToken).then((data) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })
  }

  // 登出
  logOut(){
    return new Promise<string>(async (success, fail) => {
      this.loginModel.logOut().then((data) => {
        //清除登录状态以及token、userid等信息

        SPHelper.default.saveSync(SpConstants.USER_FIRST_MARK, '')
        SPHelper.default.saveSync(SpConstants.USER_ID, '')
        SPHelper.default.saveSync(SpConstants.USER_JWT_TOKEN, '')
        SPHelper.default.saveSync(SpConstants.USER_LONG_TIME_NO_LOGIN_MARK, '')
        SPHelper.default.saveSync(SpConstants.USER_REFRESH_TOKEN, '')
        SPHelper.default.saveSync(SpConstants.USER_STATUS, '')
        SPHelper.default.saveSync(SpConstants.USER_Type, '')
        SPHelper.default.saveSync(SpConstants.USER_NAME, '')
        SPHelper.default.saveSync(SpConstants.USER_PHONE, '')
        UserDataLocal.clearUserData()
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })
  }

  changeBindPhone(phone: string, verificationCode: string) {
    return new Promise<object>((success, fail) => {
      this.loginModel.changeBindPhone(phone, verificationCode).then((data: object) => {
        success(data)
      }).catch((message: string) => {
        fail(message)
      })
    })
  }

  querySecurity(){
    return new Promise<object>((success, fail) => {
      this.loginModel.querySecurity().then((data: object) => {
        success(data)
      }).catch(() => {
        fail()
      })
    })
  }

  async doMd(content: string): Promise<string> {
    let mdAlgName = 'SHA256'; // 摘要算法名
    let message = content; // 待摘要的数据
    let md = cryptoFramework.createMd(mdAlgName);
    // 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制
    await md.update({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) });
    let mdResult = await md.digest();
    console.info('Md result:' + mdResult.data);
    return this.byte2Hex(mdResult.data)
  }

  byte2Hex(data: Uint8Array): string {
    let bufferStr = ''
    for (let i = 0; i < data.length; i++) {
      let temp = data[i].toString(16)
      if (temp.length == 1) {
        temp = "0"+temp
      }
      bufferStr += temp

    }
    console.info('Md result2:' + bufferStr);
    return bufferStr;

  }

  queryUserDetail(){
    return new Promise<UserDetail>((success, fail) => {
      this.loginModel.queryUserDetail().then((data: UserDetail) => {
        //保存sp
        if(data){
          if(data.userName!=undefined){
            SPHelper.default.saveSync(SpConstants.USER_NAME, data.userName)
          }
          if(data.phone!=undefined){
            SPHelper.default.saveSync(SpConstants.USER_PHONE, data.phone)
          }
        }
        if(data.userExtend){
          if(data.userExtend.sex!=undefined){
            SPHelper.default.saveSync(SpConstants.USER_SEX, data.userExtend.sex)
          }
          if(data.userExtend.creatorId!=undefined){
            SPHelper.default.saveSync(SpConstants.USER_CREATOR_ID, data.userExtend.creatorId+"")
          }
          if(data.userExtend.headPhotoUrl!=undefined){
            SPHelper.default.saveSync(SpConstants.USER_HEAD_PHOTO_URL, data.userExtend.headPhotoUrl)
          }else {
            SPHelper.default.deleteSync(SpConstants.USER_HEAD_PHOTO_URL)
          }
          if(data.userExtend.birthday!=undefined){
            SPHelper.default.saveSync(SpConstants.USER_BIRTHDAY, data.userExtend.birthday)
          }
        }
        success(data)
      }).catch((error:Error) => {
        fail()
      })
    })
  }


  public verifyIsPhoneNumber(phone: string): boolean {
    const regex = /^1[3-9]\d{9}$/;
    let isMatch: boolean;
    if (StringUtils.isEmpty(phone)) {
      return false;
    } else if (phone.length != 11) {
      return false;
    } else {
      isMatch = regex.test(phone)
    }
    return isMatch;
  }

  public uploadNormalUserNickNameFirstTime(nickName: string) {
    return new Promise<boolean>((success, fail) => {

      let requestUrl = HttpUrlUtils.getHost() + HttpUrlUtils.APPOINTMENT_editUserDetail1_PATH
      let params = {"userName": nickName} as Record<string, string>

      WDHttp.post<ResponseDTO<string>>(requestUrl,params).then((res) => {
        success(true)
      }).catch(() => {
        fail()
      })

    })
  }

  public uploadCreatorNickNameFirstTime(creatorId: string, nickName: string) {
    return new Promise<boolean>((success, fail) => {

      let requestUrl = HttpUrlUtils.getHost() + HttpUrlUtils.APPOINTMENT_editCreatorNickName_PATH
      let params = {"name": nickName, "creatorId": creatorId} as Record<string, string>

      WDHttp.post<ResponseDTO<string>>(requestUrl,params).then((res) => {
        success(true)
      }).catch(() => {
        fail()
      })
    })
  }
}