|
//
// MessageListViewModel.swift
// PaiaiDataKit
//
// Created by FFIB on 2016/10/19.
// Copyright © 2016年 FFIB. All rights reserved.
//
import Foundation
import RxSwift
import RxCocoa
import RxDataSources
public protocol MessageListViewModelDelegate: class {
func didSelect(item: MessageListItem)
}
public class MessageListViewModel {
private let repository: MessageRepository
private let type: MessageType
private var disposeBag = DisposeBag()
private var page = 1
private var _isLoading = PublishSubject<Bool>()
private var _isEmpty = BehaviorRelay<Bool>(value: false)
private var _hasMoreData = PublishSubject<Bool>()
private var _showMessage = PublishSubject<String>()
private var _items = BehaviorRelay<[MessageListItem]>(value: [])
public var messageReaded = BehaviorRelay<Bool>(value: false)
public weak var delegate: MessageListViewModelDelegate?
public var isEmpty: Observable<Bool> {
return _isEmpty.asObservable()
}
public var hasMoreData: Observable<Bool> {
return _hasMoreData.asObservable()
}
public var isLoading: Observable<Bool> {
return _isLoading.asObserver()
}
public var showMessage: Observable<String> {
return _showMessage.asObservable()
}
public var contents: Observable<[AnimatableSectionModel<Int, MessageListItem>]> {
return _items.map({ model in
return [AnimatableSectionModel(model: 0, items: model)]
})
}
public init(type: MessageType) {
self.repository = MessageRepository()
self.type = type
readed()
}
public func reload() {
page = 1
repository.loadMessageList(type, page: page)
.asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
.drive(onNext: {[weak self] (model) in
guard let `self` = self else { return }
self._hasMoreData.onNext(model.hasMore)
self._isEmpty.accept(!model.data.isEmpty)
self._items.accept(model.data)
}, onDisposed: {[weak self] in
guard let `self` = self else { return }
self._isLoading.onNext(true)
}).disposed(by: disposeBag)
}
public func preload() {
page += 1
repository.loadMessageList(type, page: page)
.asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
.drive(onNext: {[weak self] (model) in
guard let `self` = self else { return }
self._hasMoreData.onNext(model.hasMore)
self._items.accept(self._items.value + model.data)
}, onDisposed: {[weak self] in
guard let `self` = self else { return }
self._isLoading.onNext(false)
}).disposed(by: disposeBag)
}
public func remove(of index: Int) {
Toast.showActivity(message: "正在删除这条消息")
repository.remove(type, pk: _items.value[index].pk)
.subscribe(onCompleted: {[weak self] in
guard let `self` = self else { return }
var items = self._items.value
items.remove(at: index)
self._items.accept(items)
self._showMessage.onNext("消息删除")
}).disposed(by: disposeBag)
}
public func removeAll() {
Toast.showActivity(message: "正在删除全部消息")
repository.removeAll(type)
.subscribe(onCompleted: {[weak self] in
guard let `self` = self else { return }
self._items.accept([])
self._isEmpty.accept(false)
self._showMessage.onNext("消息已清空")
}).disposed(by: disposeBag)
}
public func readed() {
repository.readed(type).subscribe(onCompleted: {
self.messageReaded.accept(false)
}).disposed(by: disposeBag)
}
public func didSelect(item: MessageListItem) {
delegate?.didSelect(item: item)
}
}
|