Files
Woka_Native_iOS/WOKA/Authentication/ViewModel/OTPVM.swift
Bilal ecfa31b57f - Removed the pod for center collection view. Now instead of library i have created a custom flowlayout
- Added the Forgot password otp send api.
- Done the error handling and navigation for the same.
- Added api for password updated.
- Added necessary Checks for the password.
- Fixed the versioning issue of the centered flow layout. Also fixed the errors, for the complex calculations , splitted the calculations to avoid crash.
2024-05-10 20:43:57 +05:30

315 lines
13 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// OTPVM.swift
// WOKA
//
// Created by MacBook Pro on 29/04/24.
//
import UIKit
import Alamofire
class OTPVM{
weak var vc : OTPVC!
var validateString = String()
//if user name is not null then the user has forgot the pass.
var userName : String?
var timer: Timer?
var remainingTime: TimeInterval = 10 * 60 // 10 minutes in seconds
func initView(){
startTimer()
let color1 = #colorLiteral(red: 0.144693464, green: 0.1426281333, blue: 0.6686832905, alpha: 1)
let color2 = #colorLiteral(red: 0.6901960784, green: 0.2745098039, blue: 0.7568627451, alpha: 1)
vc.nextBtn.applyGradient(colors: [color1, color2], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0))
vc.nextBtn.roundCorner()
self.vc.wokaLogoTopConstriant.constant = CheckPhoneHomeBtnOrNotch.shareInstance.topConstriant()
tfMod(textField: [vc.tf1, vc.tf2, vc.tf3, vc.tf4])
if AuthFunc.shareInstance.userType == .adult{
vc.codeSentLabel.text = "Please Get the OTP Sent to Your Email".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
vc.enterCodeLabel.text = "PLEASE ENTER THE OTP".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
vc.requestThemLabel.text = "Dont forget to check your JUNK/SPAM folder".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
}else{
vc.codeSentLabel.text = "Please Get the Code Sent to Your Parents Email".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
vc.enterCodeLabel.text = "PLEASE ENTER THE CODE".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
vc.requestThemLabel.text = "Request them for the verfication code to activate your account".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
}
}
private func tfMod(textField : [UITextField]){
for i in textField{
i.roundCorner(radius: i.frame.height / 2)
i.delegate = vc.self
i.textContentType = .oneTimeCode
i.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
}
}
// MARK: - Timer Handling
func startTimer() {
vc.resendOTPBtn.isHidden = true
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
}
@objc func updateTimer() {
if remainingTime > 0 {
remainingTime -= 1
updateTimerLabel()
} else {
timer?.invalidate()
vc.resendOTPBtn.isHidden = false
vc.otpValidTillLabel.isHidden = true
// Timer ended, perform any action you want here
}
}
func updateTimerLabel() {
let minutes = Int(remainingTime) / 60
let seconds = Int(remainingTime) % 60
let timeString = String(format: "%02d:%02d", minutes, seconds)
vc.otpValidTillLabel.isHidden = false
vc.otpValidTillLabel.text = "OTP is valid for \(timeString) Min"
}
// MARK: - OTP Validation
func validateOTP(){
let otp = vc.tf1.text! + vc.tf2.text! + vc.tf3.text! + vc.tf4.text!
if otp.count != 4{
self.vc.toast(msg: "Please enter code!", time: 1.8)
return
}
if let userName{
validateForgotPassOTP(otp: otp, userName: userName)
}else{
validateNormalOTP(otp: otp)
}
}
func validateNormalOTP(otp : String){
let params: Parameters = [
"unique_string": validateString,
"otp": otp
]
Utilities.startProgressHUD()
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Auth.validate_otp, method: .post ,parameters: params) {(result : Result<BaseResponseModel<UserEmailVerifyDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
switch data.success{
case 0: // some error
Utilities.dismissProgressHUD()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
case 1: // Success
Utilities.dismissProgressHUD()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 1) {
self.navigate()
}
default:
Utilities.dismissProgressHUD()
self.vc.toast(msg: K.ConstantString.unRecognised , time: 1)
}
case .failure(let error):
Utilities.dismissProgressHUD()
self.vc.toast(msg: error.localizedDescription , time: 2)
}
}
}
func validateForgotPassOTP(otp : String, userName : String){
let params: Parameters = [
"username": userName,
"otp": otp
]
Utilities.startProgressHUD()
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Auth.forgot_password_verify_otp, method: .post ,parameters: params) {(result : Result<BaseResponseModel<ForgotPassDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
switch data.success{
case 0: // some error
Utilities.dismissProgressHUD()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
case 1: // Success
Utilities.dismissProgressHUD()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 1) {
let sb = UIStoryboard(name: K.StoryBoard.authenticationSB, bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Authentication.newPasswordVC) as! NewPasswordVC
vc.vm.userName = userName
self.vc.navigationController?.pushViewController(vc, animated: true)
}
default:
Utilities.dismissProgressHUD()
self.vc.toast(msg: K.ConstantString.unRecognised , time: 1)
}
case .failure(let error):
Utilities.dismissProgressHUD()
self.vc.toast(msg: error.localizedDescription , time: 2)
}
}
}
func resendOTP(){
let params: Parameters = [
"email": AuthFunc.shareInstance.regData.email!,
"user_type": AuthFunc.shareInstance.userType == .adult ? "2" :"1"
]
let headers : HTTPHeaders = ["Accept-Language" : AuthFunc.shareInstance.languageSelected == .english ? "English" : "Hindi"]
Utilities.startProgressHUD(msg: "Sending OTP...")
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Auth.user_email_verification, method: .post ,parameters: params,headers: headers) {(result : Result<BaseResponseModel<UserEmailVerifyDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
switch data.success{
case 0: // some error
Utilities.dismissProgressHUD()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
case 1: // Success
Utilities.dismissProgressHUD()
if let string = data.data?.unique_string{
self.validateString = string
}
self.emptyTF(tf: [self.vc.tf1,self.vc.tf2,self.vc.tf3,self.vc.tf4])
self.startTimer()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
default:
Utilities.dismissProgressHUD()
self.vc.toast(msg: K.ConstantString.unRecognised , time: 1)
}
case .failure(let error):
Utilities.dismissProgressHUD()
self.vc.toast(msg: error.localizedDescription , time: 2)
}
}
}
func getLinkedChild(){
let params: Parameters = [
"email": AuthFunc.shareInstance.regData.email!,
]
Utilities.startProgressHUD()
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Auth.get_linked_child, method: .post ,parameters: params) {(result : Result<BaseResponseModel<LinkedChildDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
switch data.success{
case 0: // some error
Utilities.dismissProgressHUD()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
let sb = UIStoryboard(name: K.StoryBoard.authenticationSB, bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Authentication.userDetailsRegisterVC) as! UserDetailsRegisterVC
self.vc.navigationController?.pushViewController(vc, animated: true)
case 1: // Success
Utilities.dismissProgressHUD()
guard let result = data.data?.result else{
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
return
}
let sb = UIStoryboard(name: K.StoryBoard.authenticationSB, bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Authentication.linkedChildVC) as! LinkedChildVC
vc.vm.linkedChilds = result
self.vc.navigationController?.pushViewController(vc, animated: true)
default:
Utilities.dismissProgressHUD()
self.vc.toast(msg: K.ConstantString.unRecognised , time: 1)
}
case .failure(let error):
Utilities.dismissProgressHUD()
self.vc.toast(msg: error.localizedDescription , time: 2)
}
}
}
func navigate(){
/*
if parent is doing registeration please check if he has any child linked
*/
if AuthFunc.shareInstance.userType == .adult{
self.getLinkedChild()
return
}
switch self.vc.navigateCheck{
case .newPass:
let sb = UIStoryboard(name: K.StoryBoard.authenticationSB, bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Authentication.newPasswordVC) as! NewPasswordVC
self.vc.navigationController?.pushViewController(vc, animated: true)
case .registeration:
let sb = UIStoryboard(name: K.StoryBoard.authenticationSB, bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Authentication.userDetailsRegisterVC) as! UserDetailsRegisterVC
self.vc.navigationController?.pushViewController(vc, animated: true)
}
}
// MARK: - TextField OTp handling
func textFieldDidChange(_ textField: UITextField, otpCode: String) {
if textField.textContentType == UITextContentType.oneTimeCode{
//here split the text to your four text fields
if otpCode.count == 4, Int(otpCode) != nil {
vc.tf1.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 0)])
vc.tf2.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 1)])
vc.tf3.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 2)])
vc.tf4.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 3)])
// let textFields = [vc.tf1,vc.tf2,vc.tf3,vc.tf4]
// for i in 0..<textFields.count{
// textFields[i].layer.borderColor = UIColor.GREEN_COLOR.cgColor
// }
} else {
textField.text = ""
}
textField.resignFirstResponder()
}
}
func emptyTF(tf : [UITextField]){
DispatchQueue.main.async {
for i in tf{
i.text = ""
}
}
}
@objc func textFieldDidChange(textField: UITextField){
let text = textField.text
if text?.count == 1 {
switch textField{
case vc.tf1:
vc.tf2.becomeFirstResponder()
case vc.tf2:
vc.tf3.becomeFirstResponder()
case vc.tf3:
vc.tf4.becomeFirstResponder()
case vc.tf4:
vc.tf4.resignFirstResponder()
default:
break
}
}
if text?.count == 0 {
switch textField{
case vc.tf1:
vc.tf1.becomeFirstResponder()
case vc.tf2:
vc.tf1.becomeFirstResponder()
case vc.tf3:
vc.tf2.becomeFirstResponder()
case vc.tf4:
vc.tf3.becomeFirstResponder()
default:
break
}
}
}
}