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.
 
 
 
 

440 lines
15 KiB

//
// WalletViewController.swift
// GMERemittance
//
// Created by Sujal on 2/3/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class WalletViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var stackView: UIStackView!
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var contentView: UIView!
@IBOutlet weak var labelID: UILabel!
@IBOutlet weak var textFieldID: UITextField!
@IBOutlet weak var textFieldAmount: UITextField!
@IBOutlet weak var textFieldMessage: UITextField!
@IBOutlet weak var buttonSubmit: UIButton!
@IBOutlet weak var buttonMoneyRequestCount: UIButton!
private var activeTextField: UITextField?
private var walletviewmodel = WalletViewModel()
private var profileviewmodel = ProfileViewModel()
private var tracktransactionviewmodel = TrackTransactionViewModel()
public var transaction: Transaction?
private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
private var moneyRequestAccepted: Bool = false
public static var notificationCode: String = ""
private var isScrolled: Bool = false
public static var walletConnectionTimeOutCheck = 0
@objc func appMovedToForeground() {
activeTextField?.resignFirstResponder()
if isScrolled {
isScrolled = !isScrolled
}
}
override func viewDidAppear(_ animated: Bool) {
setUpAnotherLoginListener(genericviewmodel: walletviewmodel)
setUpAnotherLoginListener(genericviewmodel: tracktransactionviewmodel)
setUpAnotherLoginListener(genericviewmodel: profileviewmodel)
profileviewmodel.profileConnectionTimeOut.value = nil
/**
connection timeout
*/
profileviewmodel.profileConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessage(value: 31)
}
}
tracktransactionviewmodel.transactionListConnectionTimeOut.value = nil
/**
connection timeout
*/
tracktransactionviewmodel.transactionListConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessage(value: 31)
}
}
walletviewmodel.walletConnectionTimeOut.value = nil
/**
connection timeout
*/
walletviewmodel.walletConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessage(value: 31)
}
}
setUpNetworkListener()
setUpNetworkListenerForProfile()
setUpProfileListener()
setUpTransactionListener()
setUpWalletDetailsListener()
/*so that the value is reset and no error message is seen when going back and froth in error case*/
self.walletviewmodel.walletActionPerformed.value = nil
self.buttonMoneyRequestCount.setTitle("", for: .normal)
self.buttonMoneyRequestCount.isUserInteractionEnabled = false
tracktransactionviewmodel.fetchTransactionListForTrackAndWallet(recipientId: "", recipientName: "", transactionType: "moneyRequest", startDate: nil, endDate: nil, txPage: nil, txSize: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
setUpNavBar(id: 201, title: "Wallet to Wallet Transfer")
NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
registerTapListener()
self.startLoading()
walletviewmodel.getTransactionInfo()
scrollView.delegate = self
scrollView.addSubview(contentView)
scrollView.contentSize = CGSize(width: 2000, height:2000)
if transaction != nil {
moneyRequestAccepted = true
segmentedControl.isUserInteractionEnabled = false
walletviewmodel.setMode(segmentIndex: 2)
walletviewmodel.setMoneyRequestTransactionID(id: transaction!.transactionId)
textFieldID.text = transaction!.receiverId
textFieldAmount.text = transaction!.payoutAmountOriginal
textFieldID.isUserInteractionEnabled = false
}
textFieldID.delegate = self
textFieldAmount.delegate = self
textFieldMessage.delegate = self
segmentedControl.selectedSegmentIndex = 0
segmentedControl.addTarget(self, action: #selector(modeChanged(_:)), for: .valueChanged)
walletviewmodel.setMode(segmentIndex: 0)
}
/**
Disable user interaction while fetching data from api
*/
func startLoading(){
self.showActivityIndicator(activityIndicator: self.activityIndicator)
self.disableUserInteractions()
}
/**
Enable user interaction while fetching data from api
*/
func stopLoading(){
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.enableUserInteractions()
}
/**
Check internet connection
*/
func setUpNetworkListener() {
walletviewmodel.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.walletviewmodel.internetConnection.value = nil
self.stopLoading()
self.popUpMessage(value: 15)
}
}
func setUpNetworkListenerForProfile() {
profileviewmodel.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.profileviewmodel.internetConnection.value = nil
self.stopLoading()
self.popUpMessage(value: 15)
}
}
/**
Set GMEUser name
*/
func setUpProfileListener() {
profileviewmodel.userDataAvailable.bind { [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
if !($0!) {
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessageError(value: 10, message: self.profileviewmodel.getErrorMessage())
}
} else {
if !self.profileviewmodel.hasFilledKYC() {
self.popUpMessageError(value: 11, message: "User has not filled KYC form")
} else {
self.walletviewmodel.setGMEUsername(fullName: self.profileviewmodel.getFullName())
self.performSegue(withIdentifier: "walletReview", sender: nil)
}
}
self.profileviewmodel.userDataAvailable.value = nil
}
}
/**
Update the view with the transaction count
*/
func setUpTransactionListener() {
tracktransactionviewmodel.transactionListObtained.bind{ [weak self] in
guard $0 != nil else {
return
}
guard $0! else {
return
}
let requestCount = self?.tracktransactionviewmodel.getCount()
self?.buttonMoneyRequestCount.setTitle(String(requestCount!), for: .normal)
if requestCount != nil {
if requestCount! > 0 {
self?.buttonMoneyRequestCount.isUserInteractionEnabled = true
}
}
}
}
/**
Set maximum amount
*/
func setUpWalletDetailsListener() {
walletviewmodel.walletLimitsFetched.bind{ [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
guard $0! else {
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessageError(value: 10, message: self.walletviewmodel.getErrorMessage())
}
self.walletviewmodel.walletLimitsFetched.value = nil
self.buttonSubmit.isUserInteractionEnabled = false
return
}
self.textFieldAmount.placeholder = "Maximum Amount" + " " + self.walletviewmodel.getMaximumTransferLimit() + " " + "KRW"
self.walletviewmodel.walletLimitsFetched.value = nil
}
}
@objc func modeChanged(_ segControl: UISegmentedControl) {
textFieldID.text = ""
textFieldMessage.text = ""
textFieldAmount.text = ""
switch segControl.selectedSegmentIndex {
case 0:
labelID.text = "GME User ID of Receiver"
buttonSubmit.setTitle("Transfer", for: .normal)
walletviewmodel.setMode(segmentIndex: 0)
case 1:
labelID.text = "GME User ID of Sender"
buttonSubmit.setTitle("Request", for: .normal)
walletviewmodel.setMode(segmentIndex: 1)
default:
break
}
}
@IBAction func reviewTransferDetails(_ sender: Any) {
activeTextField?.resignFirstResponder()
walletviewmodel.setParam(amount: textFieldAmount.text!,
gmeID: textFieldID.text!,
message: textFieldMessage.text!)
switch walletviewmodel.validateFields() {
case .Valid:
self.startLoading()
profileviewmodel.fetchUserInfo(userId: walletviewmodel.getGMEID())
case .InValid(let validationError):
self.popUpMessageError(value: 11, message: validationError)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case "walletReview"?:
let walletReviewViewController
= segue.destination as! WalletReviewViewController
walletReviewViewController.walletviewmodel = self.walletviewmodel
walletReviewViewController.moneyRequestAccepted = self.moneyRequestAccepted
case "walletTransfer"?:
activeTextField?.resignFirstResponder()
let walletTransactionListViewController
= segue.destination as! WalletTransactionListViewController
walletTransactionListViewController.walletStatus = "walletTransfer"
case "walletBorrow"?:
activeTextField?.resignFirstResponder()
let walletTransactionListViewController
= segue.destination as! WalletTransactionListViewController
walletTransactionListViewController.walletStatus = "walletBorrow"
case "moneyRequest"?:
activeTextField?.resignFirstResponder()
let moneyRequestViewController
= segue.destination as! MoneyRequestViewController
moneyRequestViewController.moneyRequests = tracktransactionviewmodel.getTransactions()
default:
return
}
}
}
extension WalletViewController: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
activeTextField = textField
checkScroll()
if textField == textFieldAmount {
if textField.text!.contains("KRW") {
textField.text = textField.text!.replacingOccurrences(of: " KRW", with: "", options: NSString.CompareOptions.literal, range: nil)
}
}
}
func textFieldDidEndEditing(_ textField: UITextField) {
checkScroll()
if textField == textFieldAmount {
if textField.text != "" && !textField.text!.contains("KRW") {
textField.text!.append(" KRW")
}
}
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
if textField == textFieldAmount {
//^[0-9]+$
if NSPredicate(format:"SELF MATCHES %@", "[0-9]*$").evaluate(with: inputText) {
return true
}
return false
}
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
switch textField {
case textFieldID:
textFieldAmount.becomeFirstResponder()
case textFieldMessage:
textFieldMessage.resignFirstResponder()
default:
return false
}
return true
}
}
extension WalletViewController: ScrollableProtocol {
var offset: CGFloat {
get {
return stackView.frame.origin.y - 20
}
}
var viewScrolled: Bool {
get {
return isScrolled
}
}
/**
Scroll logic
*/
func checkScroll() {
if !viewScrolled {
performScroll(direction: 0)
isScrolled = !isScrolled
} else {
performScroll(direction: 1)
isScrolled = !isScrolled
}
}
func registerTapListener() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard))
view.addGestureRecognizer(tap)
}
/**
Dismiss keypad
*/
@objc func clearKeyboard() {
activeTextField?.resignFirstResponder()
if viewScrolled {
performScroll(direction: 1)
isScrolled = !isScrolled
}
}
/**
Active keypad if direction is equal to 0
- parameter direction: display keypad if direction is equal to 0
*/
func performScroll(direction: Int) {
if direction == 0 {
UIView.animate(withDuration: 0.3, animations: {
self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1)
})
} else if direction == 1 {
UIView.animate(withDuration: 0.3, animations: {
self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset)
})
}
}
}