123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- import UIKit
- import RxSwift
- import RxCocoa
- import RxDataSources
- public protocol GroupViewModelDelegate: class {
- func didSelect(_ items: [PhotoItem], currIndex: Int)
- func navigateToGroupDetail(_ item: GroupItem)
- }
- public class GroupViewModel {
-
- private let disposeBag = DisposeBag()
-
- private var repository: GroupPhotoRepository
-
-
- private var _isLoading = PublishSubject<Void>()
- private let items = BehaviorRelay<[PhotoItem]>(value: [])
- private let _hasData = BehaviorRelay<Bool>(value: false)
-
- public var groupItem: BehaviorRelay<GroupItem>
-
- public var groupName: Observable<String> {
- return groupItem.asObservable().flatMapLatest({ (item) -> Observable<String> in
- return Observable.just(item.group_name)
- })
- }
-
- public var groupAvatar: Observable<String> {
- return groupItem.asObservable().flatMapLatest({ (item) -> Observable<String> in
- return Observable.just("Group\(item.group_default_avatar)")
- })
- }
-
- public var isLoading: Observable<Void> {
- return _isLoading.asObservable()
- }
-
- public var hasData: Observable<Bool> {
- return _hasData.asObservable()
- }
- public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
- return items.map({ model in
- return [AnimatableSectionModel(model: 0, items: model)]
- })
- }
-
- public weak var delegate: GroupViewModelDelegate?
-
- public init(groupItem: GroupItem) {
- self.repository = GroupPhotoRepository(groupId: groupItem.group_id)
- self.groupItem = BehaviorRelay<GroupItem>(value: groupItem)
- ShareRecentGroupInfo.add(groupItem)
- }
-
- public func reload() {
- repository.load()
- .subscribe(onSuccess: {[weak self] (result) in
- guard let `self` = self else { return }
- self._isLoading.onNext(())
- self.items.accept(result)
- self._hasData.accept(result.count > 0)
- }, onError: {[weak self] (error) in
- guard let `self` = self else { return }
- self._isLoading.onNext(())
- }).disposed(by: disposeBag)
- }
- public func submit(data: Data) {
- repository.upload(data: data).subscribe(onSuccess: { [weak self] result in
- guard let `self` = self else { return }
- self.items.accept(result)
- Toast.show(message: "照片已上传")
- self._isLoading.onNext(())
- }) {[weak self] (error) in
- guard let `self` = self else { return }
- Toast.show(message: "照片失败")
- self._isLoading.onNext(())
- }.disposed(by: disposeBag)
- }
-
- public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize {
- let item = items.value[indexPath.row]
- let w = item.photo_thumbnail_w
- let h = item.photo_thumbnail_h
-
- return CGSize(width: w, height: h + 74)
- }
- }
- public extension GroupViewModel {
- func didSelect(_ index: Int) {
- delegate?.didSelect(items.value, currIndex: index)
- }
-
- @objc func navigateToGroupDetail() {
- delegate?.navigateToGroupDetail(groupItem.value)
- }
- }
|