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.

421 lines
14 KiB

6 years ago
  1. //
  2. // RecipientListViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by Fm-user on 12/21/17.
  6. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. class RecipientListViewController: UIViewController {
  10. @IBOutlet weak var loadMoreOutlet: UIButton!
  11. @IBOutlet weak var tableView: UITableView!
  12. @IBOutlet weak var viewAddRecipient: UIView!
  13. @IBOutlet weak var labelSwipeInfo: UILabel!
  14. private var isNewRecipient: Bool = false
  15. private var recipientIndex: Int?
  16. // private var tracktransactionviewmodel = TrackTransactionViewModel()
  17. private var recipientviewmodel = RecipientViewModel()
  18. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  19. var nameArray: [String] = [String]()
  20. var recipientArray : [Recipient] = []
  21. static var recipientPageNumber: Int?
  22. private var page: Int = 0
  23. private var size: Int = 20
  24. private var checkConnectionTimeOutDialog: Int = 0
  25. var selectedRow: Int?
  26. static var recipientStatus = true
  27. var vietnamStatus = false
  28. override func viewWillAppear(_ animated: Bool) {
  29. }
  30. override func viewDidAppear(_ animated: Bool) {
  31. setUpAnotherLoginListener(genericviewmodel: recipientviewmodel)
  32. }
  33. override func viewDidLoad() {
  34. super.viewDidLoad()
  35. self.reloadRecipientData()
  36. viewAddRecipient.layer.cornerRadius = 10
  37. setUpNavBar(id: 2, title: "Send Money")
  38. viewAddRecipient.isHidden = true
  39. loadMoreOutlet.isHidden = true
  40. self.startLoading()
  41. // recipientviewmodel.internetConnection.value = nil
  42. internetCheck()
  43. recipientviewmodel.recipientConnectionTimeOut.value = nil
  44. /**
  45. connection timeout
  46. */
  47. recipientviewmodel.recipientConnectionTimeOut.bind { [unowned self] in
  48. guard $0 != nil else {
  49. return
  50. }
  51. self.stopLoading()
  52. if self.checkConnectionTimeOutDialog == 0{
  53. self.checkConnectionTimeOutDialog = self.checkConnectionTimeOutDialog+1
  54. self.popUpMessage(value: 20)
  55. }
  56. }
  57. recipientviewmodel.recipientDeletedTimeOut.value = nil
  58. /**
  59. connection timeout
  60. */
  61. recipientviewmodel.recipientDeletedTimeOut.bind { [unowned self] in
  62. guard $0 != nil else {
  63. return
  64. }
  65. self.stopLoading()
  66. if self.checkConnectionTimeOutDialog == 0{
  67. self.checkConnectionTimeOutDialog = self.checkConnectionTimeOutDialog+1
  68. self.popUpMessage(value: 20)
  69. }
  70. }
  71. recipientList()
  72. recipientDelete()
  73. }
  74. override func viewDidDisappear(_ animated: Bool){
  75. self.checkConnectionTimeOutDialog = 0
  76. }
  77. /**
  78. Disable user interaction while fetching data from api
  79. */
  80. func startLoading(){
  81. self.showActivityIndicator(activityIndicator: self.activityIndicator)
  82. self.disableUserInteractions()
  83. }
  84. /**
  85. Enable user interaction while fetching data from api
  86. */
  87. func stopLoading(){
  88. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  89. self.enableUserInteractions()
  90. }
  91. /**
  92. Check internet connection
  93. */
  94. func internetCheck(){
  95. recipientviewmodel.internetConnection.bind { [unowned self] in
  96. guard $0 != nil else {
  97. return
  98. }
  99. self.stopLoading()
  100. self.popUpMessage(value: 15)
  101. }
  102. }
  103. /**
  104. Request api for recipient list
  105. */
  106. func recipientList(){
  107. self.recipientviewmodel.recipientListObtained.bind { [unowned self] in
  108. guard $0 != nil else {
  109. return
  110. }
  111. self.stopLoading()
  112. guard $0! else {
  113. //self.popUpMessageError(value: 10, message: self.recipientviewmodel.getErrorMessage())
  114. return
  115. }
  116. self.addRecipientValueInPagination()
  117. guard self.recipientArray.count == 0 else {
  118. self.viewAddRecipient.isHidden = false
  119. self.tableView.isHidden = false
  120. self.labelSwipeInfo.isHidden = false
  121. self.loadTableView()
  122. return
  123. }
  124. self.loadTableView()
  125. self.isNewRecipient = true
  126. if RecipientListViewController.recipientStatus == true {
  127. self.performSegue(withIdentifier: "addRecipient", sender: nil)
  128. }
  129. }
  130. }
  131. /**
  132. Recall the recipient list after deleting the recipient
  133. */
  134. func recipientDelete(){
  135. recipientviewmodel.recipientDeleted.bind { [unowned self] in
  136. guard $0 != nil else {
  137. return
  138. }
  139. self.stopLoading()
  140. guard $0! else {
  141. // self.popUpMessageError(value: 10, message: self.recipientviewmodel.getErrorMessage())
  142. return
  143. }
  144. self.stopLoading()
  145. self.nameArray.removeAll()
  146. if let row = self.selectedRow{
  147. self.recipientArray.remove(at: row)
  148. self.loadTableView()
  149. }
  150. }
  151. }
  152. /**
  153. Reloading the tableview
  154. */
  155. func loadTableView() {
  156. for recipient in self.recipientArray {
  157. let middleName = recipient.middleName
  158. if middleName == nil {
  159. self.nameArray.append(recipient.firstName + " " + recipient.lastName)
  160. } else {
  161. self.nameArray.append(recipient.firstName + " " + recipient.middleName! + " " + recipient.lastName)
  162. }
  163. }
  164. self.tableView.delegate = self
  165. self.tableView.dataSource = self
  166. self.tableView.reloadData()
  167. loadMoreVisibility(size: self.recipientviewmodel.getRecipientArray().count)
  168. if self.nameArray.count == 0 {
  169. labelSwipeInfo.isHidden = true
  170. } else {
  171. labelSwipeInfo.isHidden = false
  172. }
  173. }
  174. /**
  175. Add load more value in existing collection object
  176. */
  177. func addRecipientValueInPagination(){
  178. self.nameArray.removeAll()
  179. self.page = self.page+1
  180. if self.recipientviewmodel.getRecipientArray().count >= self.size{
  181. self.recipientArray.append(contentsOf:self.recipientviewmodel.getRecipientArray())
  182. }else if self.recipientviewmodel.getRecipientArray().count < self.size{
  183. self.recipientArray.append(contentsOf:self.recipientviewmodel.getRecipientArray())
  184. self.loadMoreOutlet.isHidden = true
  185. }else{
  186. self.loadMoreOutlet.isHidden = false
  187. }
  188. }
  189. /**
  190. Call when load more button is click
  191. */
  192. func reloadRecipientData(){
  193. self.startLoading()
  194. self.tableView.isHidden = true
  195. self.labelSwipeInfo.isHidden = true
  196. nameArray.removeAll()
  197. recipientArray.removeAll()
  198. loadMoreOutlet.isHidden = true
  199. recipientviewmodel.getAllRecipientsThroughPagination(size: self.size, page: self.page)
  200. }
  201. /**
  202. Show load more button only if more data is available
  203. */
  204. func loadMoreVisibility(size: Int){
  205. if self.recipientviewmodel.getRecipientArray().count < self.size || self.recipientviewmodel.getRecipientArray().count == 0{
  206. self.loadMoreOutlet.isHidden = true
  207. }else{
  208. self.loadMoreOutlet.isHidden = false
  209. }
  210. }
  211. /**
  212. Api request to get recipeints data through pagination
  213. - parameter page: data fetch as per page number
  214. - parameter size: total size to be fetched
  215. */
  216. func fetchDataAndRestoreTableList(page:Int,size:Int){
  217. self.recipientviewmodel.getAllRecipientsThroughPagination(size: size, page: page)
  218. }
  219. @IBAction func loadMoreAction(_ sender: Any) {
  220. showActivityIndicator(activityIndicator: activityIndicator)
  221. disableUserInteractions()
  222. fetchDataAndRestoreTableList(page: self.page, size: self.size)
  223. }
  224. override func viewWillDisappear(_ animated: Bool) {
  225. RecipientListViewController.recipientStatus = true
  226. self.viewAddRecipient.isHidden = false
  227. }
  228. @IBAction func addNewRecipientTap(_ sender: UITapGestureRecognizer) {
  229. isNewRecipient = true
  230. performSegue(withIdentifier: "addRecipient", sender: nil)
  231. }
  232. override func didReceiveMemoryWarning() {
  233. super.didReceiveMemoryWarning()
  234. }
  235. func getRandomColor() -> UIColor{
  236. //Generate between 0 to 1
  237. let red: CGFloat = CGFloat(drand48())
  238. let green: CGFloat = CGFloat(drand48())
  239. let blue: CGFloat = CGFloat(drand48())
  240. return UIColor(red:red, green: green, blue: blue, alpha: 1.0)
  241. }
  242. }
  243. extension RecipientListViewController: UITableViewDelegate,UITableViewDataSource {
  244. func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  245. return 120.0
  246. }
  247. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  248. return nameArray.count
  249. }
  250. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  251. let cell = tableView.dequeueReusableCell(withIdentifier: "recipientList", for: indexPath) as! RecipientListTableViewCell
  252. if nameArray.indices.contains(indexPath.row){
  253. cell.labelRecipientName.text = nameArray[indexPath.row]
  254. cell.labelInitial.text = nameArray[indexPath.row].prefix(1).uppercased()
  255. cell.labelInitial.layer.cornerRadius = cell.labelInitial.frame.size.width/2
  256. cell.labelInitial.backgroundColor = getRandomColor()
  257. cell.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor
  258. cell.layer.borderWidth = 1
  259. cell.layer.cornerRadius = 10
  260. cell.clipsToBounds = true
  261. }
  262. return cell
  263. }
  264. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  265. self.recipientIndex = indexPath.row
  266. performSegue(withIdentifier: "paymentMethod", sender: nil)
  267. }
  268. func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
  269. let delete = UITableViewRowAction(style: .destructive, title: "Delete") { (action, indexPath) in
  270. let alert = UIAlertController(title: "Are you sure?",
  271. message: "",
  272. preferredStyle: .alert)
  273. let cancelAction = UIAlertAction(title: "No", style: .destructive) { (action) -> Void in
  274. alert.dismiss(animated: true, completion: nil)
  275. }
  276. cancelAction.setValue(UIColor.black, forKey: "titleTextColor")
  277. let deleteAction = UIAlertAction(title: "Yes", style: .destructive) { (action) -> Void in
  278. alert.dismiss(animated: true, completion: nil)
  279. self.startLoading()
  280. self.selectedRow = indexPath.row
  281. self.recipientviewmodel.removeRecipient(recipientId: self.recipientArray[indexPath.row].recipientId)
  282. }
  283. alert.addAction(cancelAction)
  284. alert.addAction(deleteAction)
  285. self.present(alert, animated: true, completion: nil)
  286. }
  287. let edit = UITableViewRowAction(style: .normal, title: "Edit") { (action, indexPath) in
  288. self.selectedRow = indexPath.row
  289. self.isNewRecipient = false
  290. self.recipientIndex = indexPath.row
  291. self.performSegue(withIdentifier: "addRecipient", sender: nil)
  292. }
  293. edit.backgroundColor = UIColor(hex:0xEC1C24)
  294. delete.backgroundColor = UIColor.black
  295. return [delete, edit]
  296. }
  297. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  298. switch segue.identifier {
  299. case "addRecipient"?:
  300. if (!isNewRecipient) {
  301. let recipientViewController
  302. = segue.destination as! RecipientFormViewController
  303. recipientViewController.setPageNumber(pageNumber: self.page);
  304. recipientViewController.paginationDelegate = self
  305. if let index = self.recipientIndex{
  306. recipientViewController.recipient = self.recipientArray[index]
  307. }
  308. }else {
  309. let recipientViewController
  310. = segue.destination as! RecipientFormViewController
  311. recipientViewController.setPageNumber(pageNumber: self.page);
  312. recipientViewController.paginationDelegate = self
  313. }
  314. case "paymentMethod"?:
  315. let paymentViewController
  316. = segue.destination as! PaymentMethodViewController
  317. paymentViewController.recipient = self.recipientArray[self.recipientIndex!]
  318. default:
  319. return
  320. }
  321. }
  322. }
  323. extension RecipientListViewController: PaginationDelegate {
  324. func updateCurrentIndex(status: String, recipient: Recipient, pageNumber: Int) {
  325. self.page = pageNumber
  326. if status == "update"{
  327. self.startLoading()
  328. nameArray.removeAll()
  329. recipientArray[self.selectedRow!] = recipient
  330. self.loadTableView()
  331. self.stopLoading()
  332. }else if status == "add"{
  333. self.page = 0
  334. reloadRecipientData()
  335. }
  336. }
  337. }