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.

87 lines
2.5 KiB

  1. //
  2. // NotificationHistoryPresenter.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon James Kim on 2020/02/11.
  6. //Copyright © 2020 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import RxSwift
  9. import RxCocoa
  10. class NotificationHistoryPresenter: ViewModelType {
  11. var interactor: NotificationHistoryInteractorInput?
  12. var wireframe: NotificationHistoryWireframeInput?
  13. struct Input {
  14. let viewWillAppear: Driver<Void>
  15. let selectNoticeIndex: Driver<Int>
  16. }
  17. struct Output {
  18. let isError: Driver<Error>
  19. let isProgress: Driver<Bool>
  20. let models: Driver<[NoticeModel]>
  21. }
  22. private let disposeBag = DisposeBag()
  23. private let progressLinker = PublishSubject<Bool>()
  24. private let errorLinker = PublishSubject<Error>()
  25. private let model = PublishSubject<[NoticeModel]>()
  26. func transform(input: Input) -> Output {
  27. input.viewWillAppear.drive(onNext: {[weak self] in
  28. self?.progressLinker.onNext(true)
  29. self?.interactor?.fetchNotices()
  30. }).disposed(by: disposeBag)
  31. input.selectNoticeIndex
  32. .withLatestFrom(model.asDriverOnErrorJustComplete()) { (indexPath, notices) -> NoticeModel in
  33. return notices[indexPath]
  34. }
  35. .drive(onNext: {[weak self] in
  36. self?.wireframe?.detail(index: $0.key ?? "")
  37. }).disposed(by: disposeBag)
  38. return Output(
  39. isError: errorLinker.asDriverOnErrorJustComplete(),
  40. isProgress: progressLinker.asDriverOnErrorJustComplete(),
  41. models: model.asDriverOnErrorJustComplete()
  42. )
  43. }
  44. }
  45. // MARK: NotificationHistory interactor output interface
  46. extension NotificationHistoryPresenter: NotificationHistoryInteractorOutput {
  47. func setNotices(with model: [NoticeModel]) {
  48. progressLinker.onNext(false)
  49. let dateFormatter = DateFormatter()
  50. dateFormatter.dateFormat = "MM/dd/yyyy HH:mm"
  51. let dates = model.compactMap { dateFormatter.date(from: $0.date ?? "") }
  52. let sortedDates = dates.sorted { $0 > $1 }
  53. print("123123123 \(sortedDates)")
  54. let dateStrings = sortedDates.compactMap { dateFormatter.string(from: $0)}
  55. print("123123123 \(dateStrings)")
  56. let filteredDate = model.sorted(by: { (noticeModel1, noticeModel2) -> Bool in
  57. guard let date1 = noticeModel1.date else { return true }
  58. guard let date2 = noticeModel2.date else { return false }
  59. return date1 > date2
  60. })
  61. self.model.onNext(filteredDate)
  62. }
  63. func setError(with error: Error) {
  64. progressLinker.onNext(false)
  65. errorLinker.onNext(error)
  66. }
  67. }