|
//
// HomeViewModel.swift
// PaiAi
//
// Created by zhengjianfei on 2016/12/29.
// Copyright © 2016年 FFIB. All rights reserved.
//
import Foundation
import RxSwift
import RxCocoa
import RxDataSources
public protocol HomeViewModelDelegate: class {
func scanQR()
func createGroup()
func didSelect(_ item: PhotoItem)
}
public class HomeViewModel {
private var page: Int = 1
private let disposeBag = DisposeBag()
private var respository: PhotoRepository
private var _isLoading = PublishSubject<Bool>()
private var _hasMoreData = BehaviorRelay<Bool>(value: true)
private let items = BehaviorRelay<[PhotoItem]>(value: [])
public var scanBtnTapped = PublishSubject<Void>()
public var createBtnTapped = PublishSubject<Void>()
public var isLoading: Observable<Bool> {
return _isLoading.asObservable()
}
public var hasMoreData: Observable<Bool> {
return _hasMoreData.asObservable()
}
public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
return items.map({ model in
return [AnimatableSectionModel(model: 0, items: model)]
})
}
public weak var delegate: HomeViewModelDelegate?
public init() {
self.respository = HomePhotoRepository()
scanBtnTapped.subscribe({
[weak self] (_) in
guard let `self` = self else { return }
self.delegate?.scanQR()
}).disposed(by: disposeBag)
createBtnTapped.subscribe({
[weak self] (_) in
guard let `self` = self else { return }
self.delegate?.createGroup()
}).disposed(by: disposeBag)
}
public func reload() {
page = 1
respository.load(page: page)
.subscribe(onSuccess: {[weak self] (result) in
guard let `self` = self else { return }
self._isLoading.onNext(true)
self.items.accept(result.data)
self._hasMoreData.accept(result.hasMore)
}, onError: {[weak self] (_) in
guard let `self` = self else { return }
self._isLoading.onNext(true)
}).disposed(by: disposeBag)
}
public func preload() {
guard _hasMoreData.value else { return }
page += 1
respository.load(page: page)
.subscribe(onSuccess: {[weak self] (result) in
guard let `self` = self else { return }
self._isLoading.onNext(false)
self._hasMoreData.accept(result.hasMore)
self.items.accept(self.items.value + result.data)
}, onError: {[weak self] (_) in
guard let `self` = self else { return }
self._isLoading.onNext(false)
}).disposed(by: disposeBag)
}
public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize {
let item = items.value[indexPath.row]
let w = item.photo_thumbnail_w
let h = item.photo_thumbnail_h
// header 42, footer: 32
return CGSize(width: w, height: h + 74)
}
}
//coordinator delegate
extension HomeViewModel {
public func scanQR() {
delegate?.scanQR()
}
public func createGroup() {
delegate?.createGroup()
}
public func didSelect(_ item: PhotoItem) {
delegate?.didSelect(item)
}
}
|