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