// // KMSignUpViewModel.swift // PDF Reader Pro // // Created by wanjun on 2024/10/24. // import Foundation import Combine @objc enum KMSignUpState : Int { case verificationCode = 0 // 验证码 case password // 密码 } typealias ForgotPasswordComplete = (_ success: Bool,_ msg: String) -> Void class KMSignUpViewModel: ObservableObject { /** 是否可视,默认不可视 */ @Published var isVisible: Bool = false /** 是否保持登录,默认不保持登录 */ @Published var stayState: Bool = false /** 是否同意隐私权限 */ @Published var privacyState: Bool = false /** 登录界面是验证码验证还是邮箱验证 */ @Published var signUpState: KMSignUpState = .verificationCode /** 用户邮箱,字符串格式,默认为空 */ @Published var email: String = "" /** 用户邮箱登录的验证码,字符串格式,默认为空 */ @Published var verificationCode: String = "" /** 用户邮箱登录的密码,字符串格式,默认为空 */ @Published var password: String = "" /** 邮件 错误提示文案 */ @Published var emailErrorMessage: String = "" /** 验证码 / 密码 错误提示文案 */ @Published var passwordErrorMessage: String = "" /** 序列码按钮 文案 */ @Published var sendContent: String = NSLocalizedString("Send", tableName: "MemberCenterLocalizable", comment: "") @Published private var timer: AnyCancellable? private var remainingSeconds: Int = 60 var sendBoxSelect: Bool = false // MARK: Public Method func signUpStateChange(state: KMSignUpState) -> Void { if state == signUpState { return } if signUpState == .verificationCode { signUpState = .password } else { signUpState = .verificationCode } } func countDown(type: KMVerificationCodeType, count: Int = 60) -> Void { getVerificationCode(type) if emailErrorMessage.count > 0 { return } sendBoxSelect = true remainingSeconds = count timer = Timer.publish(every: 1, on: .main, in: .common) .autoconnect() .sink { [weak self] _ in guard let self = self else { return } if self.remainingSeconds > 0 { self.remainingSeconds -= 1 self.sendContent = String(format: "%d", self.remainingSeconds) } else { // 倒计时结束,停止定时器 self.timer?.cancel() self.sendContent = NSLocalizedString("Resend", tableName: "MemberCenterLocalizable", comment: "") sendBoxSelect = false } } } // MARK: Public Method /** 邮件 错误提示文案 */ func emailError() -> Bool { if emailErrorMessage.count > 0 { return true } return false } /** 验证码 / 密码 格式错误 */ func passwordError() -> Bool { if passwordErrorMessage.count > 0 { return true } return false } // MARK: Private Method /** @abstract 验证邮箱是否合规 */ private func isValidEmail() -> Bool { let emailRegex = "^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegex) return emailTest.evaluate(with: email) } /** @abstract 验证验证码是否合规 */ private func isValidVerificationCode() -> Bool { let pattern = "^\\d{6}$" let regex = try! NSRegularExpression(pattern: pattern) return regex.firstMatch(in: verificationCode, options: [], range: NSRange(location: 0, length: verificationCode.utf16.count)) != nil } // MARK: Action Method /** @abstract KMSignUpView Sign Up 登录按钮响应事件 @param */ func signUpAction() -> Void { if email.count <= 0 { emailErrorMessage = NSLocalizedString("Please enter the correct email format", tableName: "MemberCenterLocalizable", comment: "") return } if !isValidEmail() { emailErrorMessage = NSLocalizedString("Please enter the correct email format", tableName: "MemberCenterLocalizable", comment: "") return } var code = password if signUpState == .verificationCode { if verificationCode.count <= 0 { passwordErrorMessage = NSLocalizedString("*Please enter right Verification code", tableName: "MemberCenterLocalizable", comment: "") return } if verificationCode.count <= 0 { emailErrorMessage = NSLocalizedString("*Please enter right Verification code", tableName: "MemberCenterLocalizable", comment: "") return } code = verificationCode } else if signUpState == .password { if password.count <= 0 { passwordErrorMessage = NSLocalizedString("*Please enter right Verification code", tableName: "MemberCenterLocalizable", comment: "") return } } KMMemberCenterManager.manager.emailLogin(email: email, code: code) { [weak self] error, wrapper in guard let self = self else { return } let resultDict = wrapper! as KMMemberCenterResult let msg = resultDict.msg if error { print("错误信息:%@", msg as Any) } else { if resultDict.code == 200 { let result: KMMemberLoginResult = resultDict.login_Result! let refresh_token = result.refreshToken let access_token = result.accessToken let token_type = result.tokenType let expires_in = result.expiresIn let scope = result.scope } else { print("错误信息:%@", msg as Any) } } } } /** @abstract KMForgotPasswordView 登录弹窗(忘记密码)Next 按钮响应事件 @param */ func forgotPasswordNextAction(_ complete: @escaping ForgotPasswordComplete) -> Void { if !isValidEmail() { emailErrorMessage = NSLocalizedString("Please enter the correct email format", tableName: "MemberCenterLocalizable", comment: "") return } if email.count <= 0 { emailErrorMessage = NSLocalizedString("Please enter the correct email format", tableName: "MemberCenterLocalizable", comment: "") return } if emailErrorMessage.count > 0 { return } KMMemberCenterManager.manager.emailVerification(email: email) { [weak self] error, wrapper in guard let self = self else { return } let resultDict = wrapper! as KMMemberCenterResult let msg = resultDict.msg! as String if error { print("错误信息:%@", msg as Any) } else { if resultDict.code == 200 { let result: Bool = resultDict.result! if result { complete(true, msg) } else { complete(false, msg) } } else { print("错误信息:%@", msg as Any) } } } } /** @abstract KMEnterVerificationCodeView 登录弹窗(输入验证码)Next 按钮响应事件 @param */ func enterVerificationCodeNextAction(_ complete: @escaping ForgotPasswordComplete) -> Void { if verificationCode.count <= 0 { emailErrorMessage = NSLocalizedString("*Please enter right Verification code", tableName: "MemberCenterLocalizable", comment: "") complete(false, "") return } if !isValidVerificationCode() { emailErrorMessage = NSLocalizedString("*Please enter right Verification code", tableName: "MemberCenterLocalizable", comment: "") complete(false, "") return } complete(true, "") } /** @abstract 获取邮箱验证码 @param */ func getVerificationCode(_ type: KMVerificationCodeType) -> Void { if !isValidEmail() { emailErrorMessage = NSLocalizedString("Please enter the correct email format", tableName: "MemberCenterLocalizable", comment: "") return } KMMemberCenterManager.manager.getVerificationCode(action: type, receiver: email) { [weak self] error, wrapper in guard let self = self else { return } let resultDict = wrapper! as KMMemberCenterResult let msg = resultDict.msg let result: Bool = resultDict.result ?? false if error { if !result { self.emailErrorMessage = NSLocalizedString("*Please enter right Address", tableName: "MemberCenterLocalizable", comment: "") print("错误信息:%@", msg as Any) } } else { if resultDict.code == 200 { if !result { self.emailErrorMessage = NSLocalizedString("*Please enter right Address", tableName: "MemberCenterLocalizable", comment: "") } else { print("验证邮箱成功") } } else { print("错误信息:%@", msg as Any) } } } } /** @abstract 获取邮箱验证码 @param */ func resetPassword(_ complete: @escaping ForgotPasswordComplete) -> Void { KMMemberCenterManager.manager.resetPassword(email: email, verifyCode: verificationCode, password: password) { [weak self] error, wrapper in guard let self = self else { return } let resultDict = wrapper! as KMMemberCenterResult let msg = resultDict.msg! as String let result: Bool = resultDict.result ?? false if error { if !result { print("错误信息:%@", msg as Any) complete(false, msg) } } else { if resultDict.code == 200 { if !result { print("错误信息:%@", msg as Any) complete(false, msg) } else { print("验证邮箱成功") complete(false, msg) } } else { print("错误信息:%@", msg as Any) complete(false, msg) } } } } }