|
//
// PhotoDetailListViewModel.swift
// PaiaiDataKit
//
// Created by ffib on 2019/3/19.
// Copyright © 2019 yb. All rights reserved.
//
import Foundation
import RxSwift
import RxCocoa
import RxDataSources
public protocol PhotoDetailViewModelDelegate: class {
func didSelected()
func navigateToGroup(_ item: GroupItem)
}
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 groupName: Observable<String> {
return itemViewModel.item.map({ v in
return v.group_name
})
}
public var groupAvatar: Observable<Int> {
return itemViewModel.item.map({ v in
return v.group_default_avatar
})
}
public var userName: Observable<String> {
return itemViewModel.item.map({ v in
return v.nickname
})
}
public var userAvatar: Observable<String> {
return itemViewModel.item.map({ v in
return v.avatar
})
}
public var photoTime: Observable<String> {
return itemViewModel.item.map({ v in
return v.create_at_time_interval
})
}
public var thumbupCount: Observable<String> {
return itemViewModel.thumbupItems.map({ v in
return "(\(v.count))"
})
}
public var commentCount: Observable<String> {
return itemViewModel.commentItems.map({ v in
return "(\(v.count))"
})
}
public var canBuy: Observable<Bool> {
return itemViewModel.item.map({ v in
return v.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({ v in
return v.murl.isEmpty ? "去除水印" : "查看无水印照片"
})
}
public var watermarkImageWithBought: Observable<Bool> {
return itemViewModel.item.map({ v in
return !v.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])
}
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)
}
public func navigateToGroup() {
delegate?.navigateToGroup(GroupItem(json: items.value[currIndex].toJSON() as [String : AnyObject]))
}
public func didSelected() {
delegate?.didSelected()
}
}
|