|
//
// 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) {
print(index)
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()
}
}
|