2024-05-02 13:20:40 +05:30
//
// O T P V M . s w i f t
// W O K A
//
// C r e a t e d b y M a c B o o k P r o o n 2 9 / 0 4 / 2 4 .
//
import UIKit
2024-05-07 19:33:29 +05:30
import Alamofire
2024-05-02 13:20:40 +05:30
class OTPVM {
weak var vc : OTPVC !
2024-05-07 19:33:29 +05:30
var validateString = String ( )
2024-05-02 13:20:40 +05:30
2024-05-07 19:33:29 +05:30
var timer : Timer ?
var remainingTime : TimeInterval = 10 * 60 // 1 0 m i n u t e s i n s e c o n d s
2024-05-02 13:20:40 +05:30
func initView ( ) {
2024-05-07 19:33:29 +05:30
startTimer ( )
2024-05-02 13:20:40 +05:30
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 {
2024-05-07 19:33:29 +05:30
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 = " Don’ t forget to check your JUNK/SPAM folder " . localized ( loc : AuthFunc . shareInstance . languageSelected . rawValue )
2024-05-02 13:20:40 +05:30
} else {
2024-05-07 19:33:29 +05:30
vc . codeSentLabel . text = " Please Get the Code Sent to Your Parent’ s 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 )
2024-05-02 13:20:40 +05:30
}
}
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 )
}
}
2024-05-07 19:33:29 +05:30
// MARK: - T i m e r H a n d l i n g
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
// T i m e r e n d e d , p e r f o r m a n y a c t i o n y o u w a n t h e r e
}
}
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: - O T P V a l i d a t i o n
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
}
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 : // s o m e e r r o r
Utilities . dismissProgressHUD ( )
self . vc . toast ( msg : data . message ? ? " Unrecognised error " , time : 2 )
case 1 : // S u c c e s s
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 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 : // s o m e e r r o r
Utilities . dismissProgressHUD ( )
self . vc . toast ( msg : data . message ? ? " Unrecognised error " , time : 2 )
case 1 : // S u c c e s s
Utilities . dismissProgressHUD ( )
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 navigate ( ) {
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 )
}
}
2024-05-02 13:20:40 +05:30
// MARK: - T e x t F i e l d O T p h a n d l i n g
func textFieldDidChange ( _ textField : UITextField , otpCode : String ) {
if textField . textContentType = = UITextContentType . oneTimeCode {
// h e r e s p l i t t h e t e x t t o y o u r f o u r t e x t f i e l d s
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 ) ] )
// l e t t e x t F i e l d s = [ v c . t f 1 , v c . t f 2 , v c . t f 3 , v c . t f 4 ]
// f o r i i n 0 . . < t e x t F i e l d s . c o u n t {
// t e x t F i e l d s [ i ] . l a y e r . b o r d e r C o l o r = U I C o l o r . G R E E N _ C O L O R . c g C o l o r
// }
} 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
}
}
}
}