|
//
// MessageListViewController.swift
// Paiai_iOS
//
// Created by FFIB on 16/5/13.
// Copyright © 2016年 FFIB. All rights reserved.
//
import UIKit
import RxSwift
import RxCocoa
import RxDataSources
import PaiaiDataKit
import PaiaiUIKit
import PullToRefresh
protocol MessageViewControllerDelegate: class {
func didSelect(item: MessageItem)
}
final class MessageListViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var emptyView: UILabel = {
let empty = UILabel(frame: CGRect(x: kScreenWidth / 2 - 50, y: 5, width: 50, height: 50))
empty.isHidden = true
empty.text = "当前没有任何消息"
empty.textColor = UIColor.gray
empty.font = UIFont.systemFont(ofSize: 14)
empty.sizeToFit()
return empty
}()
var viewModel: MessageListViewModel!
var type: MessageType!
fileprivate let disposeBag = DisposeBag()
// MARK: view function
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(emptyView)
setup()
binding()
setupNavigationBar()
self.viewModel.reload()
}
private func setupNavigationBar() {
navigationItem.title = type.model.title
let rightItem = UIBarButtonItem(image: UIImage.Navigation.right, target: self, action: #selector(clearMessage))
navigationItem.setRightItem(rightItem)
}
private func setup() {
setupReloadControl()
setupLoadingControl()
}
private func setupReloadControl() {
tableView.addPullToRefresh(PullToRefresh()) {
[weak self] in
guard let `self` = self else { return }
self.viewModel.reload()
}
tableView.startRefreshing(at: .top)
}
private func setupLoadingControl() {
tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
[weak self] in
guard let `self` = self else { return }
self.viewModel.preload()
}
}
// MARK: button function
@objc func clearMessage() {
let alert = ActionSheetController()
alert.addAlertAction(AlertAction(title: "取消", style: .cancel))
alert.addAlertAction(AlertAction(title: "清空消息", handler: { _ in
self.viewModel.removeAll()
}))
presentController(alert)
}
deinit {
tableView.removeAllPullToRefresh()
}
}
fileprivate extension MessageListViewController {
func observeMessage() {
viewModel.showMessage
.asDriver { _ in fatalError("Unexpected error from error messages observable.") }
.drive(onNext: { message in
Toast.show(message: message)
})
.disposed(by: disposeBag)
}
}
fileprivate extension MessageListViewController {
var dataSource: RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>> {
return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>>(
configureCell: { (_, tableView, indexPath, item) in
switch self.type! {
case .system:
let cell = tableView.dequeueReusableCell(withIdentifier: "messageSystemCell",
for: indexPath) as! MessageSystemCell
cell.setInfo(item)
return cell
case .comment, .thumbup:
let cell = tableView.dequeueReusableCell(withIdentifier: "messageCommentAndThumbupCell",
for: indexPath) as! MessageCommentAndThumbupCell
cell.setInfo(item)
return cell
}
}, canEditRowAtIndexPath: { _, _ in true })
}
func binding() {
observeMessage()
bindViewModelToTableView()
bindTableViewToViewModel()
bindViewModelToRefreshing()
}
func bindViewModelToTableView() {
viewModel.isEmpty
.bind(to: emptyView.rx.isHidden)
.disposed(by: disposeBag)
viewModel.contents
.bind(to: tableView.rx.items(dataSource: dataSource))
.disposed(by: disposeBag)
}
func bindTableViewToViewModel() {
tableView.rx.itemDeleted
.asDriver()
.drive(onNext: { [unowned self] in self.viewModel.remove(of: $0.row) })
.disposed(by: disposeBag)
tableView.rx.modelSelected(MessageListItem.self)
.asDriver()
.drive(onNext: { [unowned self] in self.viewModel.didSelect(item: $0) })
.disposed(by: disposeBag)
tableView.rx.willDisplayCell
.asDriver()
.drive(onNext: { [unowned self] in self.preload(indexPath: $0.indexPath) })
.disposed(by: disposeBag)
}
func preload(indexPath: IndexPath) {
guard indexPath.row == tableView.numberOfRows(inSection: 0) - 5 else { return }
tableView.startRefreshing(at: .bottom)
}
func bindViewModelToRefreshing() {
viewModel.isLoading
.asDriver(onErrorJustReturn: true)
.drive(onNext: {[weak self] flag in
guard let `self` = self else { return }
if flag {
self.tableView.endRefreshing(at: .top)
} else {
self.tableView.endRefreshing(at: .bottom)
}
}).disposed(by: disposeBag)
}
}
extension MessageListViewController: NavigationBackViewController {}
extension MessageListViewController: Storyboarded {
static func instantiate() -> MessageListViewController {
return UIStoryboard.message.instantiateViewController(type: MessageListViewController.self)
}
}
|