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

//
// 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 {}