You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

310 lines
9.7 KiB

6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // PennyTestSubmitViewController.swift
  3. // GME Remit
  4. //
  5. // Created by Mac on 11/28/18.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import PMAlertController
  10. import FirebaseInstanceID
  11. import LGSideMenuController
  12. class PennyTestSubmitViewController: UIViewController {
  13. struct StringConstants {
  14. let navigationTitle = "penny_test_title_text".localized()
  15. let depositReferenceText = "deposit_reference_text".localized()
  16. let viewSampleText = "view_sample_text".localized()
  17. let resendRequestText = "resend_request_text".localized()
  18. let submitText = "submit_text".localized()
  19. }
  20. // MARK: Properties
  21. var presenter: PennyTestSubmitModuleInterface?
  22. weak var parentViewcontroller: UIViewController?
  23. private var isValid = false {
  24. didSet {
  25. submitButton.isEnabled = isValid
  26. submitButton.backgroundColor = isValid ? .themeRed : .lightGray
  27. }
  28. }
  29. // MARK: IBOutlets
  30. @IBOutlet weak var dipositReferencelabel: UILabel!
  31. @IBOutlet weak var titleLabel: UILabel!
  32. @IBOutlet weak var verificationCodeTextField: UITextField!
  33. @IBOutlet weak var viewSampleButton: UIButton!
  34. @IBOutlet weak var resendButton: UIButton!
  35. @IBOutlet weak var submitButton: UIButton!
  36. // MARK: VC's Life cycle
  37. override func viewDidLoad() {
  38. super.viewDidLoad()
  39. self.setup()
  40. }
  41. override func viewWillAppear(_ animated: Bool) {
  42. super.viewWillAppear(animated)
  43. self.setupNormalNavigation()
  44. self.navigationItem.title = StringConstants().navigationTitle
  45. self.navigationItem.hidesBackButton = true
  46. }
  47. // MARK: IBActions
  48. // MARK: Other Functions
  49. private func setup() {
  50. // all setup should be done here
  51. requestPennytestInfoDuringViewLoad()
  52. let message = GMEDB.shared.user.string(.pennyTestServerMessage)
  53. self.titleLabel.text = message
  54. configureText()
  55. submitButton.layer.cornerRadius = 5
  56. verificationCodeTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged)
  57. }
  58. @objc private func editingChanged(_ textField: UITextField) {
  59. guard let text = textField.text else {
  60. return
  61. }
  62. isValid = text.count == 4 ? true : false
  63. }
  64. private func configureText() {
  65. self.titleLabel.text = "penny_test_promt_description_text".localized()
  66. self.dipositReferencelabel.text = StringConstants().depositReferenceText
  67. self.viewSampleButton.setTitle(StringConstants().viewSampleText, for: UIControl.State.normal)
  68. self.resendButton.setTitle(StringConstants().resendRequestText, for: UIControl.State.normal)
  69. self.submitButton.setTitle(StringConstants().submitText, for: UIControl.State.normal)
  70. }
  71. @IBAction func viewSample(_ sender: Any) {
  72. self.showSampleImage()
  73. }
  74. @IBAction func resend(_ sender: Any) {
  75. self.proceed()
  76. }
  77. @IBAction func dismiss(_ sender: Any) {
  78. self.dismiss()
  79. }
  80. private func dismiss() {
  81. parentViewcontroller?.dismiss(animated: true, completion: nil)
  82. self.dismiss(animated: true, completion: nil)
  83. if let navigation = self.navigationController {
  84. navigation.popViewController(animated: true)
  85. }
  86. }
  87. func showSampleImage() {
  88. let image = #imageLiteral(resourceName: "penny3.jpg")
  89. let alertVC = PMAlertController(title: "", description: "", image: image, style: .alert)
  90. alertVC.alertView.layer.cornerRadius = 5
  91. let action = PMAlertAction(title: "ok_text".localized(), style: .cancel)
  92. alertVC.addAction(action)
  93. self.present(alertVC, animated: true, completion: nil)
  94. }
  95. // resend
  96. private func proceed() {
  97. let userId = Utility.getMyUserName()
  98. self.showLoading()
  99. self.initiate(
  100. userId: userId,
  101. isResendRequest: "Y",
  102. success: { result in
  103. self.hideLoading()
  104. self.alertWithOk(
  105. type: .normal,
  106. message: result.message,
  107. title: "success_text".localized(),
  108. okTitle: "ok_text".localized(),
  109. okAction: nil
  110. )
  111. self.updatePennyTestRequestStatus()
  112. },
  113. failure: { (error) in
  114. self.updatePennyTestRequestStatus()
  115. self.hideLoading()
  116. self.alert(type: .error, message: error.localizedDescription)
  117. }
  118. )
  119. }
  120. private func requestPennytestInfoDuringViewLoad() {
  121. let userId = Utility.getMyUserName()
  122. self.showLoading()
  123. self.initiate(
  124. userId: userId,
  125. isResendRequest: "N",
  126. success: { result in
  127. self.hideLoading()
  128. self.titleLabel.text = result.message
  129. GMEDB.shared.user.set(result.message, .pennyTestServerMessage)
  130. self.updatePennyTestRequestStatus()
  131. },
  132. failure: { (error) in
  133. self.updatePennyTestRequestStatus()
  134. self.hideLoading()
  135. self.alert(type: .error, message: error.localizedDescription)
  136. }
  137. )
  138. }
  139. private func updatePennyTestRequestStatus() {
  140. GMEDB.shared.user.set(PennyTestStatusCode.requested.rawValue, .pennyTestStatusCode)
  141. }
  142. private func showLoading() {
  143. self.showProgressHud()
  144. }
  145. private func hideLoading() {
  146. self.hideProgressHud()
  147. }
  148. @IBAction func touchVerify(_ sender: UIButton) {
  149. guard let certNumber = self.verificationCodeTextField.text?.removeSpacesTrailingPreceding()
  150. else {
  151. self.alert(type: .error, message: "valid_verification_code_error".localized())
  152. return
  153. }
  154. let customerId = GMEDB.shared.user.string(.senderId) ?? ""
  155. let accountNumber = GMEDB.shared.user.string(.primaryAccountNumber) ?? ""
  156. let params =
  157. [
  158. "AccountNo": accountNumber,
  159. "CertNumber": certNumber,
  160. "CustomerId": customerId
  161. ]
  162. self.submit(
  163. params: params,
  164. success: { (response) in
  165. // UPDATE BALANCE
  166. let balance = response.extra ?? ""
  167. let userInfo = [SideMenuNavigationNotifications.availableBalance : balance]
  168. GMEDB.shared.user.set(balance, .availableBalance)
  169. NotificationCenter.default.post(
  170. name: self.getAvailableBalanceNotificationName(),
  171. object: nil,
  172. userInfo: userInfo
  173. )
  174. // UPDATE YEARLY LIMIT
  175. let limit = response.yearlyLimit ?? ""
  176. let userInfo2 = [AppConstants.yearlyLimitNotification : limit]
  177. NotificationCenter.default.post(
  178. name: self.getAvailableBalanceNotificationName(),
  179. object: nil,
  180. userInfo: userInfo2
  181. )
  182. // show alert and dismiss
  183. self.alertWithOk(
  184. type: .normal,
  185. message: response.message ?? "",
  186. title: "Success",
  187. okTitle: "Ok",
  188. okAction: {
  189. if self.presentingViewController != nil {
  190. GMEDB.shared.user.set(PennyTestStatusCode.completed.rawValue, .pennyTestStatusCode)
  191. self.dismiss()
  192. } else {
  193. GMEDB.shared.user.set(PennyTestStatusCode.completed.rawValue, .pennyTestStatusCode)
  194. self.doLogin()
  195. }
  196. })
  197. },
  198. failure: { (error) in
  199. self.alert(type: .error, message: error.localizedDescription)
  200. }
  201. )
  202. }
  203. func getAvailableBalanceNotificationName() -> Notification.Name {
  204. return Notification.Name.init(rawValue: SideMenuNavigationNotifications.availableBalance)
  205. }
  206. private func doLogin() {
  207. let loginService = LoginService()
  208. guard let userID = KeyChain.shared.get(key: .temporaryID),
  209. let password = KeyChain.shared.get(key: .temporaryPW) else {
  210. return
  211. }
  212. self.showProgressHud(backgroundColor: .clear, loadingColor: .white, textColor: .white)
  213. loginService.accessCode(
  214. userId: userID,
  215. password: password,
  216. success: { (user) in
  217. KeyChain.shared.remove(key: .temporaryID)
  218. KeyChain.shared.remove(key: .temporaryPW)
  219. let accessCode = user?.accessCode ?? ""
  220. let accessCodeBase64 = accessCode
  221. Utility.save(user: user, accessCodeBase64: accessCodeBase64, password: password, login: true)
  222. let mainWireFrame = MainWireframe.shared
  223. let tabBarViewController = mainWireFrame?.getMainView()
  224. guard let sidemenuVc = UIStoryboard(name: "SideMenu", bundle: nil).instantiateViewController(
  225. withIdentifier: "SideMenuViewController"
  226. ) as? SideMenuViewController else {
  227. return
  228. }
  229. let sideMenuController = LGSideMenuController(
  230. rootViewController: tabBarViewController,
  231. leftViewController: sidemenuVc,
  232. rightViewController: nil
  233. )
  234. sideMenuController.rootViewLayerShadowColor = UIColor(white: 0.9, alpha: 0.6)
  235. sideMenuController.rootViewLayerShadowRadius = 8.0
  236. sideMenuController.leftViewPresentationStyle = .scaleFromBig
  237. sideMenuController.leftViewWidth = UIScreen.main.bounds.width - 70.0
  238. sideMenuController.leftViewBackgroundBlurEffect = UIBlurEffect(style: .regular)
  239. self.hideProgressHud()
  240. mainWireFrame?.window?.backgroundColor = sidemenuVc.view.backgroundColor
  241. mainWireFrame?.window?.rootViewController = sideMenuController
  242. },
  243. failure: { (error) in
  244. self.hideProgressHud()
  245. self.alert(type: .error, message: error.localizedDescription, title: "Warning") {
  246. // if failed login, remove all in keychain, change logout status and then go splash screen
  247. KeyChain.shared.removeAll()
  248. self.navigationController?.popToRootViewController(animated: false)
  249. }
  250. }
  251. )
  252. }
  253. }
  254. // MARK: PennyTestSubmitViewInterface
  255. extension PennyTestSubmitViewController: PennyTestSubmitViewInterface {}
  256. extension PennyTestSubmitViewController: SubmitPennyTestService {}
  257. extension PennyTestSubmitViewController: InitiatePennyTestService {}
  258. extension PennyTestSubmitViewController: UserInfoService {}