// // MoneyRequestViewController.swift // GMERemittance // // Created by Sujal on 3/2/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class MoneyRequestViewController: UIViewController { @IBOutlet weak var tableView: UITableView! var moneyRequests: [Transaction]? static var notificationCode: String = "" private var tracktransactionviewmodel: TrackTransactionViewModel? private var moneyrequestviewmodel = MoneyRequestViewModel() private var tappedIndex: Int! private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() public var fromNotification: Int? public static var moneyTransactionListConnectionTimeOut = 0 /** Check internet connection */ func setUpNetworkListenerTransaction() { self.tracktransactionviewmodel?.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.tracktransactionviewmodel?.internetConnection.value = nil self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 15) } } /** Check internet connection */ func setUpNetworkListenerMoneyRequest() { self.tracktransactionviewmodel?.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.tracktransactionviewmodel?.internetConnection.value = nil self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 15) } self.moneyrequestviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.moneyrequestviewmodel.internetConnection.value = nil self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 15) } } override func viewDidLoad() { super.viewDidLoad() if MoneyRequestViewController.notificationCode == "p201" { setUpNavBar(id: 208, title: "Wallet to Wallet Transfer") } else { setUpNavBar(id: 204, title: "Wallet to Wallet Transfer") } tracktransactionviewmodel?.transactionListConnectionTimeOut.value = nil /** connection timeout */ tracktransactionviewmodel?.transactionListConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() if self.fromNotification != 0{ if MoneyRequestViewController.moneyTransactionListConnectionTimeOut == 0{ MoneyRequestViewController.moneyTransactionListConnectionTimeOut = MoneyRequestViewController.moneyTransactionListConnectionTimeOut+1 self.popUpMessage(value: 35) } } } moneyrequestviewmodel.moneyRequestConnectionTimeOut.value = nil /** connection timeout */ moneyrequestviewmodel.moneyRequestConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() self.popUpMessage(value: 20) } if moneyRequests == nil { tracktransactionviewmodel = TrackTransactionViewModel() setUpAnotherLoginListener(genericviewmodel: tracktransactionviewmodel!) setUpTransactionListener() setUpNetworkListenerTransaction() self.startLoading() tracktransactionviewmodel!.fetchTransactionListForTrackAndWallet(recipientId: "", recipientName: "", transactionType: "moneyRequest", startDate: nil, endDate: nil, txPage: nil, txSize: nil) } else { moneyrequestviewmodel.setMoneyRequests(requests: moneyRequests!) } setUpAnotherLoginListener(genericviewmodel: moneyrequestviewmodel) setUpNetworkListenerMoneyRequest() setUpMoneyRequestRejectListener() self.tableView.tableFooterView = UIView() self.tableView.delegate = self self.tableView.dataSource = self self.tableView.estimatedRowHeight = 136 self.tableView.rowHeight = UITableViewAutomaticDimension } /** 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() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } /** Api request to fetch transaction list for track and wallet */ func setUpTransactionListener() { tracktransactionviewmodel!.transactionListObtained.bind{ [unowned self] in guard $0 != nil else { return } self.stopLoading() guard $0! else { //self.popUpMessageError(value: 10, message: (self.tracktransactionviewmodel!.getErrorMessage())) return } self.moneyrequestviewmodel.setMoneyRequests(requests: self.tracktransactionviewmodel!.getTransactions()) self.tableView.reloadData() } } /** Api request to remove money request */ func setUpMoneyRequestRejectListener() { moneyrequestviewmodel.requestRejected.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() if !$0! { self.popUpMessageError(value: 10, message: self.moneyrequestviewmodel.getErrorMessage()) } else { self.moneyrequestviewmodel.removeMoneyRequest(atIndex: self.tappedIndex) self.tableView.deleteRows(at: [IndexPath(item: self.tappedIndex, section: 0)], with: .automatic) } self.moneyrequestviewmodel.requestRejected.value = nil } } } extension MoneyRequestViewController: UITableViewDelegate, UITableViewDataSource, MoneyRequestDelegate { func readMessage(_ sender: MoneyRequestTableViewCell) { guard let tappedIndexPath = tableView.indexPath(for: sender) else { return } guard let navController = self.navigationController else { return } if let popUpViewController = UIStoryboard.init(name: "WalletTransfer", bundle: Bundle.main).instantiateViewController(withIdentifier: "walletPopUp") as? WalletPopUpViewController { let moneyRequest = moneyrequestviewmodel.getMoneyRequest(atIndex: tappedIndexPath.row) if let name = moneyRequest.senderName{ popUpViewController.name = name } if let date = moneyRequest.date{ popUpViewController.dateTime = "Message" + " " + "(" + unixTimeStampToDate(unixTimeStamp: date) + ")" } if let reason = moneyRequest.reason{ popUpViewController.message = reason } navController.addChildViewController(popUpViewController) popUpViewController.view.frame = navController.view.bounds navController.view.addSubview(popUpViewController.view) popUpViewController.didMove(toParentViewController: navController) } } func acceptRequest(_ sender: MoneyRequestTableViewCell) { guard let tappedIndexPath = tableView.indexPath(for: sender) else { return } let storyboard = UIStoryboard.init(name: "WalletTransfer", bundle: Bundle.main) if let walletViewController = storyboard.instantiateViewController(withIdentifier: "walletViewController") as? WalletViewController { walletViewController.transaction = moneyrequestviewmodel.getMoneyRequest(atIndex: tappedIndexPath.row) self.navigationController!.pushViewController(walletViewController, animated: true) } } func declineRequest(_ sender: MoneyRequestTableViewCell) { guard let tappedIndexPath = tableView.indexPath(for: sender) else { return } tappedIndex = tappedIndexPath.row displayPasswordDialog(transactionID: moneyrequestviewmodel.getMoneyRequest(atIndex: tappedIndex).transactionId) } func displayPasswordDialog(transactionID: String) { let alertController = UIAlertController(title: "Enter your login password", message: nil, preferredStyle: .alert) alertController.addTextField { (textField : UITextField!) -> Void in textField.placeholder = "Password" textField.isSecureTextEntry = true textField.tag = 51 //unique identifier set textField.delegate = self } let confirmAction = UIAlertAction(title: "Confirm", style: .default, handler: { alert -> Void in let valueTextField = alertController.textFields![0] as UITextField if valueTextField.text != "" { self.disableUserInteractions() self.showActivityIndicator(activityIndicator: self.activityIndicator) self.moneyrequestviewmodel.setPassword(password: valueTextField.text!) self.moneyrequestviewmodel.rejectRequest(transactionID: transactionID, transferType: "request") } else { self.popUpMessageInfo(value: 16, title: "Password is missing", message: "Could not complete your request") } }) let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action : UIAlertAction!) -> Void in }) cancelAction.setValue(UIColor.black, forKey: "titleTextColor") confirmAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor") alertController.addAction(cancelAction) alertController.addAction(confirmAction) self.present(alertController, animated: true, completion: nil) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return moneyrequestviewmodel.getMoneyRequests().count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let moneyRequestCell = tableView.dequeueReusableCell(withIdentifier: "moneyRequestCell", for: indexPath) as? MoneyRequestTableViewCell let moneyRequest = moneyrequestviewmodel.getMoneyRequest(atIndex: indexPath.row) if let receiverName = moneyRequest.receiverName{ moneyRequestCell?.labelName.text = receiverName } if let payoutAmountOriginal = moneyRequest.payoutAmountOriginal{ moneyRequestCell?.labelAmount.text = getCommaAddedAmountString(amountString: payoutAmountOriginal) } if let receiverId = moneyRequest.receiverId{ moneyRequestCell?.labelGMEID.text = receiverId } if let date = moneyRequest.date{ moneyRequestCell?.labelDateTime.text = unixTimeStampToDate(unixTimeStamp: date) } moneyRequestCell?.labelInitial.text = moneyRequestCell?.labelName.text?.prefix(1).uppercased() moneyRequestCell?.labelInitial.backgroundColor = UIColor(hex: 0x92daea) moneyRequestCell?.labelInitial.layer.cornerRadius = (moneyRequestCell?.labelInitial.frame.height)!/2 moneyRequestCell?.delegate = self return moneyRequestCell! } } extension MoneyRequestViewController: UITextFieldDelegate { func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { if textField.tag == 51 { textField.tag = 0 return false } return true } }