No Description

GroupViewModel.swift 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // GroupViewModel.swift
  3. // PaiAi
  4. //
  5. // Created by zhengjianfei on 2017/1/4.
  6. // Copyright © 2017年 FFIB. All rights reserved.
  7. //
  8. import UIKit
  9. import RxSwift
  10. import RxCocoa
  11. import RxDataSources
  12. public protocol GroupViewModelDelegate: class {
  13. func didSelect(_ items: [PhotoItem], currIndex: Int)
  14. func navigateToGroupDetail(_ item: GroupItem)
  15. }
  16. public class GroupViewModel {
  17. private let disposeBag = DisposeBag()
  18. private var repository: GroupPhotoRepository
  19. private var _isLoading = PublishSubject<Void>()
  20. private let items = BehaviorRelay<[PhotoItem]>(value: [])
  21. private let _hasData = BehaviorRelay<Bool>(value: false)
  22. public var groupItem: BehaviorRelay<GroupItem>
  23. public var groupName: Observable<String> {
  24. return groupItem.asObservable().flatMapLatest({ (item) -> Observable<String> in
  25. return Observable.just(item.group_name)
  26. })
  27. }
  28. public var groupAvatar: Observable<String> {
  29. return groupItem.asObservable().flatMapLatest({ (item) -> Observable<String> in
  30. return Observable.just("Group\(item.group_default_avatar)")
  31. })
  32. }
  33. public var isLoading: Observable<Void> {
  34. return _isLoading.asObservable()
  35. }
  36. public var hasData: Observable<Bool> {
  37. return _hasData.asObservable()
  38. }
  39. public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
  40. return items.map({ model in
  41. return [AnimatableSectionModel(model: 0, items: model)]
  42. })
  43. }
  44. public weak var delegate: GroupViewModelDelegate?
  45. public init(groupItem: GroupItem) {
  46. self.repository = GroupPhotoRepository(groupId: groupItem.group_id)
  47. self.groupItem = BehaviorRelay<GroupItem>(value: groupItem)
  48. ShareRecentGroupInfo.add(groupItem)
  49. }
  50. public func reload() {
  51. repository.load()
  52. .subscribe(onSuccess: {[weak self] (result) in
  53. guard let `self` = self else { return }
  54. self._isLoading.onNext(())
  55. self.items.accept(result)
  56. self._hasData.accept(result.count > 0)
  57. }, onError: {[weak self] (error) in
  58. guard let `self` = self else { return }
  59. self._isLoading.onNext(())
  60. }).disposed(by: disposeBag)
  61. }
  62. public func submit(data: Data) {
  63. repository.upload(data: data).subscribe(onSuccess: { [weak self] result in
  64. guard let `self` = self else { return }
  65. self.items.accept(result)
  66. Toast.show(message: "照片已上传")
  67. self._isLoading.onNext(())
  68. }) {[weak self] (error) in
  69. guard let `self` = self else { return }
  70. Toast.show(message: "照片失败")
  71. self._isLoading.onNext(())
  72. }.disposed(by: disposeBag)
  73. }
  74. public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize {
  75. let item = items.value[indexPath.row]
  76. let w = item.photo_thumbnail_w
  77. let h = item.photo_thumbnail_h
  78. // header 42, footer: 32
  79. return CGSize(width: w, height: h + 74)
  80. }
  81. }
  82. /// GroupViewModelDelegate
  83. public extension GroupViewModel {
  84. func didSelect(_ index: Int) {
  85. delegate?.didSelect(items.value, currIndex: index)
  86. }
  87. @objc func navigateToGroupDetail() {
  88. delegate?.navigateToGroupDetail(groupItem.value)
  89. }
  90. }