// // PennyTestSubmitViewController.swift // GME Remit // // Created by Mac on 11/28/18. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import PMAlertController import FirebaseInstanceID import LGSideMenuController class PennyTestSubmitViewController: UIViewController { struct StringConstants { let navigationTitle = "penny_test_title_text".localized() let depositReferenceText = "deposit_reference_text".localized() let viewSampleText = "view_sample_text".localized() let resendRequestText = "resend_request_text".localized() let submitText = "submit_text".localized() } // MARK: Properties var presenter: PennyTestSubmitModuleInterface? weak var parentViewcontroller: UIViewController? private var isValid = false { didSet { submitButton.isEnabled = isValid submitButton.backgroundColor = isValid ? .themeRed : .lightGray } } // MARK: IBOutlets @IBOutlet weak var dipositReferencelabel: UILabel! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var verificationCodeTextField: UITextField! @IBOutlet weak var viewSampleButton: UIButton! @IBOutlet weak var resendButton: UIButton! @IBOutlet weak var submitButton: UIButton! // MARK: VC's Life cycle override func viewDidLoad() { super.viewDidLoad() self.setup() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.setupNormalNavigation() self.navigationItem.title = StringConstants().navigationTitle self.navigationItem.hidesBackButton = true } // MARK: IBActions // MARK: Other Functions private func setup() { // all setup should be done here requestPennytestInfoDuringViewLoad() let message = GMEDB.shared.user.string(.pennyTestServerMessage) self.titleLabel.text = message configureText() submitButton.layer.cornerRadius = 5 verificationCodeTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) } @objc private func editingChanged(_ textField: UITextField) { guard let text = textField.text else { return } isValid = text.count == 4 ? true : false } private func configureText() { self.titleLabel.text = "penny_test_promt_description_text".localized() self.dipositReferencelabel.text = StringConstants().depositReferenceText self.viewSampleButton.setTitle(StringConstants().viewSampleText, for: UIControl.State.normal) self.resendButton.setTitle(StringConstants().resendRequestText, for: UIControl.State.normal) self.submitButton.setTitle(StringConstants().submitText, for: UIControl.State.normal) } @IBAction func viewSample(_ sender: Any) { self.showSampleImage() } @IBAction func resend(_ sender: Any) { self.proceed() } @IBAction func dismiss(_ sender: Any) { self.dismiss() } private func dismiss() { parentViewcontroller?.dismiss(animated: true, completion: nil) self.dismiss(animated: true, completion: nil) if let navigation = self.navigationController { navigation.popViewController(animated: true) } } func showSampleImage() { let image = #imageLiteral(resourceName: "penny3.jpg") let alertVC = PMAlertController(title: "", description: "", image: image, style: .alert) alertVC.alertView.layer.cornerRadius = 5 let action = PMAlertAction(title: "ok_text".localized(), style: .cancel) alertVC.addAction(action) self.present(alertVC, animated: true, completion: nil) } // resend private func proceed() { let userId = Utility.getMyUserName() self.showLoading() self.initiate( userId: userId, isResendRequest: "Y", success: { result in self.hideLoading() self.alertWithOk( type: .normal, message: result.message, title: "success_text".localized(), okTitle: "ok_text".localized(), okAction: nil ) self.updatePennyTestRequestStatus() }, failure: { (error) in self.updatePennyTestRequestStatus() self.hideLoading() self.alert(type: .error, message: error.localizedDescription) } ) } private func requestPennytestInfoDuringViewLoad() { let userId = Utility.getMyUserName() self.showLoading() self.initiate( userId: userId, isResendRequest: "N", success: { result in self.hideLoading() self.titleLabel.text = result.message GMEDB.shared.user.set(result.message, .pennyTestServerMessage) self.updatePennyTestRequestStatus() }, failure: { (error) in self.updatePennyTestRequestStatus() self.hideLoading() self.alert(type: .error, message: error.localizedDescription) } ) } private func updatePennyTestRequestStatus() { GMEDB.shared.user.set(PennyTestStatusCode.requested.rawValue, .pennyTestStatusCode) } private func showLoading() { self.showProgressHud() } private func hideLoading() { self.hideProgressHud() } @IBAction func touchVerify(_ sender: UIButton) { guard let certNumber = self.verificationCodeTextField.text?.removeSpacesTrailingPreceding() else { self.alert(type: .error, message: "valid_verification_code_error".localized()) return } let customerId = GMEDB.shared.user.string(.senderId) ?? "" let accountNumber = GMEDB.shared.user.string(.primaryAccountNumber) ?? "" let params = [ "AccountNo": accountNumber, "CertNumber": certNumber, "CustomerId": customerId ] self.submit( params: params, success: { (response) in // UPDATE BALANCE let balance = response.extra ?? "" let userInfo = [SideMenuNavigationNotifications.availableBalance : balance] GMEDB.shared.user.set(balance, .availableBalance) NotificationCenter.default.post( name: self.getAvailableBalanceNotificationName(), object: nil, userInfo: userInfo ) // UPDATE YEARLY LIMIT let limit = response.yearlyLimit ?? "" let userInfo2 = [AppConstants.yearlyLimitNotification : limit] NotificationCenter.default.post( name: self.getAvailableBalanceNotificationName(), object: nil, userInfo: userInfo2 ) // show alert and dismiss self.alertWithOk( type: .normal, message: response.message ?? "", title: "Success", okTitle: "Ok", okAction: { if self.presentingViewController != nil { GMEDB.shared.user.set(PennyTestStatusCode.completed.rawValue, .pennyTestStatusCode) self.dismiss() } else { GMEDB.shared.user.set(PennyTestStatusCode.completed.rawValue, .pennyTestStatusCode) self.doLogin() } }) }, failure: { (error) in self.alert(type: .error, message: error.localizedDescription) } ) } func getAvailableBalanceNotificationName() -> Notification.Name { return Notification.Name.init(rawValue: SideMenuNavigationNotifications.availableBalance) } private func doLogin() { let loginService = LoginService() guard let userID = KeyChain.shared.get(key: .temporaryID), let password = KeyChain.shared.get(key: .temporaryPW) else { return } self.showProgressHud(backgroundColor: .clear, loadingColor: .white, textColor: .white) loginService.accessCode( userId: userID, password: password, success: { (user) in KeyChain.shared.remove(key: .temporaryID) KeyChain.shared.remove(key: .temporaryPW) let accessCode = user?.accessCode ?? "" let accessCodeBase64 = accessCode Utility.save(user: user, accessCodeBase64: accessCodeBase64, password: password, login: true) let mainWireFrame = MainWireframe.shared let tabBarViewController = mainWireFrame?.getMainView() guard let sidemenuVc = UIStoryboard(name: "SideMenu", bundle: nil).instantiateViewController( withIdentifier: "SideMenuViewController" ) as? SideMenuViewController else { return } let sideMenuController = LGSideMenuController( rootViewController: tabBarViewController, leftViewController: sidemenuVc, rightViewController: nil ) sideMenuController.rootViewLayerShadowColor = UIColor(white: 0.9, alpha: 0.6) sideMenuController.rootViewLayerShadowRadius = 8.0 sideMenuController.leftViewPresentationStyle = .scaleFromBig sideMenuController.leftViewWidth = UIScreen.main.bounds.width - 70.0 sideMenuController.leftViewBackgroundBlurEffect = UIBlurEffect(style: .regular) self.hideProgressHud() mainWireFrame?.window?.backgroundColor = sidemenuVc.view.backgroundColor mainWireFrame?.window?.rootViewController = sideMenuController }, failure: { (error) in self.hideProgressHud() self.alert(type: .error, message: error.localizedDescription, title: "Warning") { // if failed login, remove all in keychain, change logout status and then go splash screen KeyChain.shared.removeAll() self.navigationController?.popToRootViewController(animated: false) } } ) } } // MARK: PennyTestSubmitViewInterface extension PennyTestSubmitViewController: PennyTestSubmitViewInterface {} extension PennyTestSubmitViewController: SubmitPennyTestService {} extension PennyTestSubmitViewController: InitiatePennyTestService {} extension PennyTestSubmitViewController: UserInfoService {}