Nessuna descrizione

PhotoDetailViewModel.swift 5.6KB

    // // PhotoDetailListViewModel.swift // PaiaiDataKit // // Created by FFIB on 2019/3/19. // Copyright © 2019 FFIB. All rights reserved. // import Foundation import RxSwift import RxCocoa import RxDataSources public protocol PhotoDetailViewModelDelegate: class { func didSelected() func navigateToGroup(_ item: GroupItem, photoItems: [PhotoItem]) } public final class PhotoDetailViewModel { private var _items: BehaviorRelay<[PhotoItem]> private var itemViewModel: PhotoDetailItemViewModel private var purchaseViewModel: PhotoPurchaseViewModel private var _hasGetPrice = BehaviorRelay<Bool>(value: false) private var disposeBag = DisposeBag() public var currIndex: Int public var thumbupItems: Observable<[PhotoThumbupUserItem]> { return itemViewModel.thumbupItems.asObservable() } public var commentItems: Observable<[AnimatableSectionModel<Int, PhotoCommentItem>]> { return itemViewModel.commentItems.map ({ model in return [AnimatableSectionModel(model: 0, items: model)] }) } public var group_name: Observable<String> { return itemViewModel.item.map({ val in return val.group_name }) } public var group_avatar: Observable<Int> { return itemViewModel.item.map({ val in return val.group_default_avatar }) } public var userName: Observable<String> { return itemViewModel.item.map({ val in return val.nickname }) } public var userAvatar: Observable<String> { return itemViewModel.item.map({ val in return val.avatar }) } public var photoTime: Observable<String> { return itemViewModel.item.map({ val in return val.create_at_time_interval }) } public var thumbupCount: Observable<String> { return itemViewModel.thumbupItems.map({ val in return "(\(val.count))" }) } public var commentCount: Observable<String> { return itemViewModel.commentItems.map({ val in return "(\(val.count))" }) } public var canBuy: Observable<Bool> { return itemViewModel.item.map({ val in return val.display_payment_btn > 0 }) } public var watermarkImage: Observable<Bool> { return _hasGetPrice.asObservable() } public var watermarkText: Observable<String> { return _hasGetPrice.map ({ hasGetPrice in return hasGetPrice ? "¥\(CGFloat(self.itemViewModel.item.value.nomark) / 100)" : "去除水印" }) } public var watermarkTextWithBought: Observable<String> { return itemViewModel.item.map({ val in return val.murl.isEmpty ? "去除水印" : "查看无水印照片" }) } public var watermarkImageWithBought: Observable<Bool> { return itemViewModel.item.map({ val in return !val.murl.isEmpty }) } public var isHiddenEnterGroupBtn = BehaviorRelay<Bool>(value: false) public var viewWillAppear = BehaviorRelay<Void>(value: ()) public weak var delegate: PhotoDetailViewModelDelegate? public var content: Observable<[AnimatableSectionModel<Int, PhotoItem>]> { return _items.map({ model in return [AnimatableSectionModel(model: 0, items: model)] }) } public init(items: [PhotoItem], currIndex: Int) { self._items = BehaviorRelay<[PhotoItem]>(value: items) self.currIndex = currIndex self.itemViewModel = PhotoDetailItemViewModel(item: items[currIndex]) self.purchaseViewModel = PhotoPurchaseViewModel(item: items[currIndex]) setNotification() } public func willShow(index: Int) { currIndex = index _hasGetPrice.accept(false) itemViewModel.item.accept(_items.value[index]) purchaseViewModel.switchItem(item: _items.value[index]) purchaseViewModel.notifyPhotoChanged.subscribe(onNext: payDidFinish(item:)).disposed(by: disposeBag) } public func submitThumbup() { itemViewModel.submitThumbup() } public func submitComment(text: String) { itemViewModel.submitComment(text: text) } public func purchase() { if !itemViewModel.item.value.murl.isEmpty { delegate?.didSelected() return } if !_hasGetPrice.value { _hasGetPrice.accept(true) } else { Toast.showActivity(message: "正在支付") purchaseViewModel.purchase() } } public func payDidFinish(item: PhotoItem) { var originItems = _items.value originItems[currIndex] = item _items.accept(originItems) itemViewModel.item.accept(item) } private func setNotification() { NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: { (notification) in guard let itemOperator = notification.userInfo?[PhotoItemsOperator.key] as? PhotoItemsOperator, case let .update(id, val) = itemOperator, let index = self._items.value.firstIndex(where: { $0.photo_id == id }) else { return } var items = self._items.value items[index] = val self._items.accept(items) }).disposed(by: disposeBag) } } extension PhotoDetailViewModel { public func navigateToGroup() { let currItem = _items.value[currIndex] delegate?.navigateToGroup(GroupItem(json: currItem.toJSON() as [String : AnyObject]), photoItems: _items.value.filter { $0.photo_id == currItem.photo_id }) } public func didSelected() { delegate?.didSelected() } }