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.

342 lines
12 KiB

6 years ago
  1. //
  2. // MoneyRequestViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 3/2/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. class MoneyRequestViewController: UIViewController {
  10. @IBOutlet weak var tableView: UITableView!
  11. var moneyRequests: [Transaction]?
  12. static var notificationCode: String = ""
  13. private var tracktransactionviewmodel: TrackTransactionViewModel?
  14. private var moneyrequestviewmodel = MoneyRequestViewModel()
  15. private var tappedIndex: Int!
  16. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  17. public var fromNotification: Int?
  18. public static var moneyTransactionListConnectionTimeOut = 0
  19. /**
  20. Check internet connection
  21. */
  22. func setUpNetworkListenerTransaction() {
  23. self.tracktransactionviewmodel?.internetConnection.bind { [unowned self] in
  24. guard $0 != nil else {
  25. return
  26. }
  27. self.tracktransactionviewmodel?.internetConnection.value = nil
  28. self.enableUserInteractions()
  29. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  30. self.popUpMessage(value: 15)
  31. }
  32. }
  33. /**
  34. Check internet connection
  35. */
  36. func setUpNetworkListenerMoneyRequest() {
  37. self.tracktransactionviewmodel?.internetConnection.bind { [unowned self] in
  38. guard $0 != nil else {
  39. return
  40. }
  41. self.tracktransactionviewmodel?.internetConnection.value = nil
  42. self.enableUserInteractions()
  43. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  44. self.popUpMessage(value: 15)
  45. }
  46. self.moneyrequestviewmodel.internetConnection.bind { [unowned self] in
  47. guard $0 != nil else {
  48. return
  49. }
  50. self.moneyrequestviewmodel.internetConnection.value = nil
  51. self.enableUserInteractions()
  52. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  53. self.popUpMessage(value: 15)
  54. }
  55. }
  56. override func viewDidLoad() {
  57. super.viewDidLoad()
  58. if MoneyRequestViewController.notificationCode == "p201" {
  59. setUpNavBar(id: 208, title: "Wallet to Wallet Transfer")
  60. } else {
  61. setUpNavBar(id: 204, title: "Wallet to Wallet Transfer")
  62. }
  63. tracktransactionviewmodel?.transactionListConnectionTimeOut.value = nil
  64. /**
  65. connection timeout
  66. */
  67. tracktransactionviewmodel?.transactionListConnectionTimeOut.bind { [unowned self] in
  68. guard $0 != nil else {
  69. return
  70. }
  71. self.stopLoading()
  72. if self.fromNotification != 0{
  73. if MoneyRequestViewController.moneyTransactionListConnectionTimeOut == 0{
  74. MoneyRequestViewController.moneyTransactionListConnectionTimeOut = MoneyRequestViewController.moneyTransactionListConnectionTimeOut+1
  75. self.popUpMessage(value: 35)
  76. }
  77. }
  78. }
  79. moneyrequestviewmodel.moneyRequestConnectionTimeOut.value = nil
  80. /**
  81. connection timeout
  82. */
  83. moneyrequestviewmodel.moneyRequestConnectionTimeOut.bind { [unowned self] in
  84. guard $0 != nil else {
  85. return
  86. }
  87. self.stopLoading()
  88. self.popUpMessage(value: 20)
  89. }
  90. if moneyRequests == nil {
  91. tracktransactionviewmodel = TrackTransactionViewModel()
  92. setUpAnotherLoginListener(genericviewmodel: tracktransactionviewmodel!)
  93. setUpTransactionListener()
  94. setUpNetworkListenerTransaction()
  95. self.startLoading()
  96. tracktransactionviewmodel!.fetchTransactionListForTrackAndWallet(recipientId: "", recipientName: "", transactionType: "moneyRequest", startDate: nil, endDate: nil, txPage: nil, txSize: nil)
  97. } else {
  98. moneyrequestviewmodel.setMoneyRequests(requests: moneyRequests!)
  99. }
  100. setUpAnotherLoginListener(genericviewmodel: moneyrequestviewmodel)
  101. setUpNetworkListenerMoneyRequest()
  102. setUpMoneyRequestRejectListener()
  103. self.tableView.tableFooterView = UIView()
  104. self.tableView.delegate = self
  105. self.tableView.dataSource = self
  106. self.tableView.estimatedRowHeight = 136
  107. self.tableView.rowHeight = UITableViewAutomaticDimension
  108. }
  109. /**
  110. Disable user interaction while fetching data from api
  111. */
  112. func startLoading(){
  113. self.showActivityIndicator(activityIndicator: self.activityIndicator)
  114. self.disableUserInteractions()
  115. }
  116. /**
  117. Enable user interaction while fetching data from api
  118. */
  119. func stopLoading(){
  120. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  121. self.enableUserInteractions()
  122. }
  123. override func didReceiveMemoryWarning() {
  124. super.didReceiveMemoryWarning()
  125. // Dispose of any resources that can be recreated.
  126. }
  127. /**
  128. Api request to fetch transaction list for track and wallet
  129. */
  130. func setUpTransactionListener() {
  131. tracktransactionviewmodel!.transactionListObtained.bind{ [unowned self] in
  132. guard $0 != nil else {
  133. return
  134. }
  135. self.stopLoading()
  136. guard $0! else {
  137. //self.popUpMessageError(value: 10, message: (self.tracktransactionviewmodel!.getErrorMessage()))
  138. return
  139. }
  140. self.moneyrequestviewmodel.setMoneyRequests(requests: self.tracktransactionviewmodel!.getTransactions())
  141. self.tableView.reloadData()
  142. }
  143. }
  144. /**
  145. Api request to remove money request
  146. */
  147. func setUpMoneyRequestRejectListener() {
  148. moneyrequestviewmodel.requestRejected.bind { [unowned self] in
  149. guard $0 != nil else {
  150. return
  151. }
  152. self.stopLoading()
  153. if !$0! {
  154. self.popUpMessageError(value: 10, message: self.moneyrequestviewmodel.getErrorMessage())
  155. } else {
  156. self.moneyrequestviewmodel.removeMoneyRequest(atIndex: self.tappedIndex)
  157. self.tableView.deleteRows(at: [IndexPath(item: self.tappedIndex, section: 0)], with: .automatic)
  158. }
  159. self.moneyrequestviewmodel.requestRejected.value = nil
  160. }
  161. }
  162. }
  163. extension MoneyRequestViewController: UITableViewDelegate, UITableViewDataSource, MoneyRequestDelegate {
  164. func readMessage(_ sender: MoneyRequestTableViewCell) {
  165. guard let tappedIndexPath = tableView.indexPath(for: sender) else {
  166. return
  167. }
  168. guard let navController = self.navigationController else {
  169. return
  170. }
  171. if let popUpViewController = UIStoryboard.init(name: "WalletTransfer", bundle: Bundle.main).instantiateViewController(withIdentifier: "walletPopUp") as? WalletPopUpViewController {
  172. let moneyRequest = moneyrequestviewmodel.getMoneyRequest(atIndex: tappedIndexPath.row)
  173. if let name = moneyRequest.senderName{
  174. popUpViewController.name = name
  175. }
  176. if let date = moneyRequest.date{
  177. popUpViewController.dateTime = "Message" + " " + "(" + unixTimeStampToDate(unixTimeStamp: date) + ")"
  178. }
  179. if let reason = moneyRequest.reason{
  180. popUpViewController.message = reason
  181. }
  182. navController.addChildViewController(popUpViewController)
  183. popUpViewController.view.frame = navController.view.bounds
  184. navController.view.addSubview(popUpViewController.view)
  185. popUpViewController.didMove(toParentViewController: navController)
  186. }
  187. }
  188. func acceptRequest(_ sender: MoneyRequestTableViewCell) {
  189. guard let tappedIndexPath = tableView.indexPath(for: sender) else {
  190. return
  191. }
  192. let storyboard = UIStoryboard.init(name: "WalletTransfer", bundle: Bundle.main)
  193. if let walletViewController = storyboard.instantiateViewController(withIdentifier: "walletViewController") as? WalletViewController {
  194. walletViewController.transaction = moneyrequestviewmodel.getMoneyRequest(atIndex: tappedIndexPath.row)
  195. self.navigationController!.pushViewController(walletViewController, animated: true)
  196. }
  197. }
  198. func declineRequest(_ sender: MoneyRequestTableViewCell) {
  199. guard let tappedIndexPath = tableView.indexPath(for: sender) else {
  200. return
  201. }
  202. tappedIndex = tappedIndexPath.row
  203. displayPasswordDialog(transactionID: moneyrequestviewmodel.getMoneyRequest(atIndex: tappedIndex).transactionId)
  204. }
  205. func displayPasswordDialog(transactionID: String) {
  206. let alertController = UIAlertController(title: "Enter your login password", message: nil, preferredStyle: .alert)
  207. alertController.addTextField { (textField : UITextField!) -> Void in
  208. textField.placeholder = "Password"
  209. textField.isSecureTextEntry = true
  210. textField.tag = 51 //unique identifier set
  211. textField.delegate = self
  212. }
  213. let confirmAction = UIAlertAction(title: "Confirm", style: .default, handler: {
  214. alert -> Void in
  215. let valueTextField = alertController.textFields![0] as UITextField
  216. if valueTextField.text != "" {
  217. self.disableUserInteractions()
  218. self.showActivityIndicator(activityIndicator: self.activityIndicator)
  219. self.moneyrequestviewmodel.setPassword(password: valueTextField.text!)
  220. self.moneyrequestviewmodel.rejectRequest(transactionID: transactionID, transferType: "request")
  221. } else {
  222. self.popUpMessageInfo(value: 16, title: "Password is missing", message: "Could not complete your request")
  223. }
  224. })
  225. let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: {
  226. (action : UIAlertAction!) -> Void in
  227. })
  228. cancelAction.setValue(UIColor.black, forKey: "titleTextColor")
  229. confirmAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor")
  230. alertController.addAction(cancelAction)
  231. alertController.addAction(confirmAction)
  232. self.present(alertController, animated: true, completion: nil)
  233. }
  234. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  235. return moneyrequestviewmodel.getMoneyRequests().count
  236. }
  237. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  238. let moneyRequestCell = tableView.dequeueReusableCell(withIdentifier: "moneyRequestCell", for: indexPath) as? MoneyRequestTableViewCell
  239. let moneyRequest = moneyrequestviewmodel.getMoneyRequest(atIndex: indexPath.row)
  240. if let receiverName = moneyRequest.receiverName{
  241. moneyRequestCell?.labelName.text = receiverName
  242. }
  243. if let payoutAmountOriginal = moneyRequest.payoutAmountOriginal{
  244. moneyRequestCell?.labelAmount.text = getCommaAddedAmountString(amountString: payoutAmountOriginal)
  245. }
  246. if let receiverId = moneyRequest.receiverId{
  247. moneyRequestCell?.labelGMEID.text = receiverId
  248. }
  249. if let date = moneyRequest.date{
  250. moneyRequestCell?.labelDateTime.text = unixTimeStampToDate(unixTimeStamp: date)
  251. }
  252. moneyRequestCell?.labelInitial.text = moneyRequestCell?.labelName.text?.prefix(1).uppercased()
  253. moneyRequestCell?.labelInitial.backgroundColor = UIColor(hex: 0x92daea)
  254. moneyRequestCell?.labelInitial.layer.cornerRadius = (moneyRequestCell?.labelInitial.frame.height)!/2
  255. moneyRequestCell?.delegate = self
  256. return moneyRequestCell!
  257. }
  258. }
  259. extension MoneyRequestViewController: UITextFieldDelegate {
  260. func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
  261. if textField.tag == 51 {
  262. textField.tag = 0
  263. return false
  264. }
  265. return true
  266. }
  267. }