// // MineGroupViewController.swift // PaiAi // // Created by zhengjianfei on 16/4/4. // Copyright © 2016年 FFIB. All rights reserved. // import UIKit import RxSwift import RxCocoa import RxDataSources import PaiaiDataKit import PaiaiUIKit import PullToRefresh final class MineGroupViewController: UIViewController { // MARK: Storyboard property @IBOutlet weak var tableView: UITableView! // MARK: data property fileprivate let disposeBag = DisposeBag() var viewModel: MineGroupViewModel! // MARK: view function override func viewDidLoad() { super.viewDidLoad() setup() binding() setNavigationBar() } private func setNavigationBar() { title = "我的照片群" } 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() } } } fileprivate extension MineGroupViewController { 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 MineGroupViewController { var dataSource: RxTableViewSectionedAnimatedDataSource> { return RxTableViewSectionedAnimatedDataSource>(configureCell: { (dataSource, tableView, indexPath, item) in let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath) as! GroupCell cell.setInfo(item) return cell }, canEditRowAtIndexPath: { _, _ in true }) } func binding() { observeMessage() bindViewModelToTableView() bindTableViewToViewModel() bindViewModelToRefreshing() } func bindViewModelToTableView() { 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(GroupItem.self) .asDriver() .drive(onNext: { [unowned self] in self.viewModel.didSelect($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) viewModel.hasMoreData .asDriver(onErrorJustReturn: true) .drive(onNext: {[weak self] flag in guard let `self` = self else { return } if flag { if self.tableView.bottomPullToRefresh == nil { self.setupLoadingControl() } } else { // self.tableViewt } }).disposed(by: disposeBag) } } extension MineGroupViewController: NavigationBackViewController {}