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.
 
 
 
 

252 lines
6.6 KiB

//
// SendMoneyCodeViewController.swift
// GME Remit
//
// Created by gme_2 on 27/02/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
import PMAlertController
import Hex
class SendMoneyCodeViewController: UIViewController {
// MARK: IBOutlets
@IBOutlet weak var otpCodeTitlelabel: UILabel!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var verificationCodeTextField: UITextField!
@IBOutlet weak var resendButton: UIButton!
@IBOutlet weak var submitButton: UIButton!
@IBOutlet weak var notNowButton: UIButton!
@IBOutlet weak var counterLabel: UILabel!
@IBOutlet weak var counterTitleLabel: UILabel!
@IBOutlet weak var counterStackView: UIStackView!
@IBOutlet weak var backGourndBorderView: UIView!
var timer: Timer?
let expiryTime = 5 // second
var count: Int = 5 {
didSet {
if ( count <= 0) {
count = expiryTime // two minutes passed
self.timer?.invalidate()
self.counterStackView.isHidden = true
self.resendButton.isUserInteractionEnabled = true
self.resendButton.isHidden = false
} else {
let result = count.quotientAndRemainder(dividingBy: 60)
self.counterLabel.text = "\(result.quotient): \(result.remainder)"
self.resendButton.isUserInteractionEnabled = false
self.resendButton.isHidden = true
}
}
}
// MARK: Properties
var mNumberTransKeyView : TransKeyView!
var numberCipherString : String!
var presenter: SendMoneyCodeModuleInterface?
var completion: ((String) -> Void)?
var type: CodeType = .sendMoney
var newValue: String?
private var requestModel: SendMoneyRequestModel?
var encryptedNumber: String? {
didSet {
touchSubmit(UIButton())
}
}
var isShowNumber : Bool!
var isTranskeyShowing : Bool!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setup()
switch type {
case .sendMoney:
self.requestOtpCode()
case .editProfile:
startTimer()
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
backGourndBorderView.bottomToOrigin(duration: 0.1)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
}
// MARK: IBActions
@IBAction func touchSubmit(_ sender: UIButton) {
if let number = encryptedNumber {
self.dismiss(animated: true) {
self.completion?(number)
}
} else {
alert(type: .error, message: "4-digit OTP code is required.")
}
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
self.titleLabel.text = "enter_otp_password_text".localized()
self.verificationCodeTextField.placeholder = "otp_password_hint_text".localized()
self.resendButton.setTitle("resend_request_text".localized(), for: UIControl.State.normal)
self.submitButton.setTitle("submit_text".localized(), for: .normal)
self.notNowButton.setTitle("not_now_text".localized(), for: .normal)
verificationCodeTextField.delegate = self
submitButton.layer.cornerRadius = 5
submitButton.backgroundColor = .themeRed
resendButton.setTitleColor(.themeRed, for: .normal)
counterLabel.textColor = .themeRed
}
private func configureText() {
self.titleLabel.text = "penny_test_promt_description_text".localized()
self.otpCodeTitlelabel.text = "otp__Code_text".localized()
self.resendButton.setTitle("resend_text".localized(), for: UIControl.State.normal)
self.submitButton.setTitle("submit_text".localized(), for: UIControl.State.normal)
self.notNowButton.setTitle("not_now_text".localized(), for: UIControl.State.normal)
self.counterTitleLabel.text = "resend_code_text".localized()
}
@IBAction func viewSample(_ sender: Any) {
self.showSampleImage()
}
@IBAction func resend(_ sender: Any) {
switch type {
case .sendMoney:
self.requestOtpCode()
case .editProfile:
presenter?.changeProfileResendOTP(newValue: newValue ?? "")
}
}
@IBAction func dismiss(_ sender: Any) {
backGourndBorderView.originToBottom(duration: 0.1) {
self.dismiss()
}
}
private func dismiss() {
self.dismiss(animated: true, completion: nil)
}
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 requestOtpCode() {
// request otp
self.presenter?.viewIsReady()
self.startTimer()
}
private func startTimer() {
self.timer = Timer.scheduledTimer(
timeInterval: 1,
target: self,
selector: #selector(self.updateCounter),
userInfo: nil,
repeats: true
)
self.timer?.fire()
self.resendButton.isUserInteractionEnabled = false
self.counterStackView.isHidden = false
}
@objc func updateCounter() {
self.count -= 1
}
private func requestOtpCodeRetryCount() {
}
}
// MARK: SendMoneyCodeViewInterface
extension SendMoneyCodeViewController: SendMoneyCodeViewInterface {
func successChangeProfileInformation() {
self.alertWithOk(
type: .success,
message: "Type 4-digit OTP number",
title: "new OTP number has re-sent",
okTitle: "OK"
)
startTimer()
}
func showLoading() {
self.showProgressHud()
}
func hideLoading() {
self.hideProgressHud()
}
func show(message: String) {
self.titleLabel.text = message
}
func show(error: String) {
self.alert(type: .error, message: error)
}
func expiredError(error: Error) {
alert(type: .error, message: error.localizedDescription, title: "Error") {
self.dismiss()
}
}
}
// MARK: - UITextFieldDelegate
extension SendMoneyCodeViewController: UITextFieldDelegate {
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
let secureKeypad = SecureKeypad(target: self, keypadType: .numberic)
secureKeypad.delegate = self
secureKeypad.present(animated: true)
return false
}
}
// MARK: - OtpCodeRequestApiService
extension SendMoneyCodeViewController: OtpCodeRequestApiService {}
// MARK: - SecureKeypadDelegate
extension SendMoneyCodeViewController: SecureKeypadDelegate {
func didComplete(_ encryptedString: String, garbagePassword: String, length: Int) {
if length != 0 {
self.encryptedNumber = encryptedString
}
}
}