VerifyEmail.swift 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. //
  2. // VerifyEmail.swift
  3. // NexilisLite
  4. //
  5. // Created by Akhmad Al Qindi Irsyam on 28/10/22.
  6. //
  7. import UIKit
  8. import NotificationBannerSwift
  9. class VerifyEmail: UIViewController, UITextFieldDelegate, OTPTextFieldDelegate {
  10. var initialBounds: CGRect?
  11. var email = ""
  12. let txtField1 = OTPTextField()
  13. let txtField2 = OTPTextField()
  14. let txtField3 = OTPTextField()
  15. let txtField4 = OTPTextField()
  16. let txtField5 = OTPTextField()
  17. let txtField6 = OTPTextField()
  18. var firstLoad = true
  19. var isDismiss: ((String) -> ())?
  20. var showWrongOTP = ""
  21. override func viewDidLoad() {
  22. super.viewDidLoad()
  23. view.backgroundColor = .white
  24. let topIndicator = UIView()
  25. topIndicator.backgroundColor = .lightGray.withAlphaComponent(0.5)
  26. topIndicator.layer.cornerRadius = 5
  27. topIndicator.layer.masksToBounds = true
  28. view.addSubview(topIndicator)
  29. topIndicator.anchor(top: view.safeAreaLayoutGuide.topAnchor, paddingTop: 20, centerX: view.centerXAnchor, width: 80, height: 10)
  30. let titleVerify = UILabel()
  31. titleVerify.font = .systemFont(ofSize: 14, weight: .medium)
  32. titleVerify.text = "Verification Code".localized()
  33. view.addSubview(titleVerify)
  34. titleVerify.anchor(top: topIndicator.bottomAnchor, paddingTop: 8, centerX: view.centerXAnchor)
  35. let descVerify = UILabel()
  36. descVerify.font = .systemFont(ofSize: 12)
  37. descVerify.numberOfLines = 0
  38. descVerify.textAlignment = .center
  39. descVerify.text = "Your verification code has been sent to".localized() + "\n" + email + "\n" + "Please check your email and enter the code sent".localized()
  40. view.addSubview(descVerify)
  41. descVerify.anchor(top: titleVerify.bottomAnchor, paddingTop: 8, centerX: view.centerXAnchor)
  42. let containerTxt = UIView()
  43. view.addSubview(containerTxt)
  44. containerTxt.anchor(top: descVerify.bottomAnchor, paddingTop: 20, centerX: view.centerXAnchor, width: 340, height: 60)
  45. txtField1.backgroundColor = .lightGray.withAlphaComponent(0.5)
  46. txtField1.textAlignment = .center
  47. txtField1.font = .systemFont(ofSize: 16)
  48. txtField1.keyboardType = .numberPad
  49. txtField1.layer.cornerRadius = 5
  50. txtField1.layer.masksToBounds = true
  51. txtField1.delegate = self
  52. txtField1.myDelegate = self
  53. containerTxt.addSubview(txtField1)
  54. txtField1.anchor(left: containerTxt.leftAnchor, centerY: containerTxt.centerYAnchor, width: 50, height: 60)
  55. txtField2.backgroundColor = .lightGray.withAlphaComponent(0.5)
  56. txtField2.textAlignment = .center
  57. txtField2.keyboardType = .numberPad
  58. txtField2.font = .systemFont(ofSize: 16)
  59. txtField2.layer.cornerRadius = 5
  60. txtField2.layer.masksToBounds = true
  61. txtField2.delegate = self
  62. txtField2.myDelegate = self
  63. containerTxt.addSubview(txtField2)
  64. txtField2.anchor(left: txtField1.rightAnchor, paddingLeft: 8, centerY: containerTxt.centerYAnchor, width: 50, height: 60)
  65. txtField3.backgroundColor = .lightGray.withAlphaComponent(0.5)
  66. txtField3.textAlignment = .center
  67. txtField3.keyboardType = .numberPad
  68. txtField3.font = .systemFont(ofSize: 16)
  69. txtField3.layer.cornerRadius = 5
  70. txtField3.layer.masksToBounds = true
  71. txtField3.delegate = self
  72. txtField3.myDelegate = self
  73. containerTxt.addSubview(txtField3)
  74. txtField3.anchor(left: txtField2.rightAnchor, paddingLeft: 8, centerY: containerTxt.centerYAnchor, width: 50, height: 60)
  75. txtField4.backgroundColor = .lightGray.withAlphaComponent(0.5)
  76. txtField4.textAlignment = .center
  77. txtField4.keyboardType = .numberPad
  78. txtField4.font = .systemFont(ofSize: 16)
  79. txtField4.layer.cornerRadius = 5
  80. txtField4.layer.masksToBounds = true
  81. txtField4.delegate = self
  82. txtField4.myDelegate = self
  83. containerTxt.addSubview(txtField4)
  84. txtField4.anchor(left: txtField3.rightAnchor, paddingLeft: 8, centerY: containerTxt.centerYAnchor, width: 50, height: 60)
  85. txtField5.backgroundColor = .lightGray.withAlphaComponent(0.5)
  86. txtField5.textAlignment = .center
  87. txtField5.keyboardType = .numberPad
  88. txtField5.font = .systemFont(ofSize: 16)
  89. txtField5.layer.cornerRadius = 5
  90. txtField5.layer.masksToBounds = true
  91. txtField5.delegate = self
  92. txtField5.myDelegate = self
  93. containerTxt.addSubview(txtField5)
  94. txtField5.anchor(left: txtField4.rightAnchor, paddingLeft: 8, centerY: containerTxt.centerYAnchor, width: 50, height: 60)
  95. txtField6.backgroundColor = .lightGray.withAlphaComponent(0.5)
  96. txtField6.textAlignment = .center
  97. txtField6.keyboardType = .numberPad
  98. txtField6.font = .systemFont(ofSize: 16)
  99. txtField6.layer.cornerRadius = 5
  100. txtField6.layer.masksToBounds = true
  101. txtField6.delegate = self
  102. txtField6.myDelegate = self
  103. containerTxt.addSubview(txtField6)
  104. txtField6.anchor(left: txtField5.rightAnchor, paddingLeft: 8, centerY: containerTxt.centerYAnchor, width: 50, height: 60)
  105. txtField1.becomeFirstResponder()
  106. if !showWrongOTP.isEmpty {
  107. if showWrongOTP == "3t" {
  108. let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
  109. imageView.tintColor = .white
  110. let banner = FloatingNotificationBanner(title: "Expired OTP".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
  111. banner.show()
  112. } else if showWrongOTP == "4t" {
  113. let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
  114. imageView.tintColor = .white
  115. let banner = FloatingNotificationBanner(title: "Invalid OTP".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
  116. banner.show()
  117. }
  118. }
  119. }
  120. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
  121. if (string.count == 1){
  122. if textField == txtField1 {
  123. txtField2.becomeFirstResponder()
  124. }
  125. if textField == txtField2 {
  126. txtField3.becomeFirstResponder()
  127. }
  128. if textField == txtField3 {
  129. txtField4.becomeFirstResponder()
  130. }
  131. if textField == txtField4 {
  132. txtField5.becomeFirstResponder()
  133. }
  134. if textField == txtField5 {
  135. txtField6.becomeFirstResponder()
  136. }
  137. if textField == txtField6 {
  138. textField.text? = string
  139. txtField6.resignFirstResponder()
  140. self.dismiss(animated: true, completion: {
  141. self.isDismiss?("\(self.txtField1.text!)\(self.txtField2.text!)\(self.txtField3.text!)\(self.txtField4.text!)\(self.txtField5.text!)\(self.txtField6.text!)")
  142. })
  143. return false
  144. }
  145. textField.text? = string
  146. return false
  147. } else {
  148. if textField == txtField1 {
  149. txtField1.becomeFirstResponder()
  150. }
  151. if textField == txtField2 {
  152. txtField1.becomeFirstResponder()
  153. }
  154. if textField == txtField3 {
  155. txtField2.becomeFirstResponder()
  156. }
  157. if textField == txtField4 {
  158. txtField3.becomeFirstResponder()
  159. }
  160. if textField == txtField5 {
  161. txtField4.becomeFirstResponder()
  162. }
  163. if textField == txtField6 {
  164. txtField5.becomeFirstResponder()
  165. }
  166. textField.text? = string
  167. return false
  168. }
  169. }
  170. func textFieldDidDelete() {
  171. if txtField2.isFirstResponder && txtField2.text!.isEmpty {
  172. txtField1.text = ""
  173. txtField1.becomeFirstResponder()
  174. } else if txtField3.isFirstResponder && txtField3.text!.isEmpty {
  175. txtField2.text = ""
  176. txtField2.becomeFirstResponder()
  177. } else if txtField4.isFirstResponder && txtField4.text!.isEmpty {
  178. txtField3.text = ""
  179. txtField3.becomeFirstResponder()
  180. } else if txtField5.isFirstResponder && txtField5.text!.isEmpty {
  181. txtField4.text = ""
  182. txtField4.becomeFirstResponder()
  183. } else if txtField6.isFirstResponder && txtField6.text!.isEmpty {
  184. txtField5.text = ""
  185. txtField5.becomeFirstResponder()
  186. }
  187. }
  188. override func viewDidLayoutSubviews() {
  189. if firstLoad {
  190. firstLoad = false
  191. view.layer.cornerRadius = 20
  192. view.layer.masksToBounds = true
  193. view.frame = CGRect(x: 0, y: view.bounds.height / 5 * 2 - 50, width: view.bounds.width, height: view.bounds.height / 5 * 3 + 50)
  194. }
  195. }
  196. }
  197. protocol OTPTextFieldDelegate: AnyObject {
  198. func textFieldDidDelete()
  199. }
  200. class OTPTextField: UITextField {
  201. weak var myDelegate: OTPTextFieldDelegate?
  202. override func deleteBackward() {
  203. super.deleteBackward()
  204. myDelegate?.textFieldDidDelete()
  205. }
  206. }