123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- import Foundation
- import RxSwift
- import RxCocoa
- import RxDataSources
- public protocol HomeViewModelDelegate: class {
- func scanQR()
- func createGroup()
- func didSelect(_ _items: [PhotoItem], currIndex: Int)
- }
- public class HomeViewModel {
-
- private var page: Int = 1
- private let disposeBag = DisposeBag()
-
- private var repository: HomeRepository
-
- 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.repository = HomeRepository()
-
- 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)
-
- setNotification()
- }
- public func reload() {
- page = 1
- repository.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
- repository.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
-
- return CGSize(width: w, height: h + 74)
- }
-
- private func setNotification() {
- NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: { (notification) in
- guard let itemOperator = notification.userInfo?[GroupItemsOperator.key] as? GroupItemsOperator else { return }
- var items = self._items.value
- switch itemOperator {
- case let .update(id, v):
- items = items.map({ (item) -> PhotoItem in
-
- if item.group_id == id {
- var tmp = item
- tmp.group_name = v.group_name
-
- return tmp
- }
- return item
- })
- self._items.accept(items)
- break
- case let .remove(id):
- items.removeAll(where: { $0.group_id == id })
- self._items.accept(items)
- }
- }).disposed(by: disposeBag)
-
- NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: { (notification) in
- guard let itemOperator = notification.userInfo?[PhotoItemsOperator.key] as? PhotoItemsOperator,
- case let .update(id, v) = itemOperator,
- let index = self._items.value.firstIndex(where: { $0.photo_id == id }) else { return }
- var items = self._items.value
- items[index] = v
- self._items.accept(items)
- }).disposed(by: disposeBag)
- }
- }
- extension HomeViewModel {
- public func scanQR() {
- delegate?.scanQR()
- }
-
- public func createGroup() {
- delegate?.createGroup()
- }
-
- public func didSelect(_ currIndex: Int) {
- delegate?.didSelect(_items.value, currIndex: currIndex)
- }
- }
|