|
//
// GroupViewModel.swift
// PaiAi
//
// Created by zhengjianfei on 2017/1/4.
// Copyright © 2017年 FFIB. All rights reserved.
//
import UIKit
import RxSwift
import RxCocoa
import RxDataSources
public protocol GroupViewModelDelegate: class {
func didSelect(_ item: PhotoItem)
func navigateToGroupDetail()
}
public class GroupViewModel {
private let disposeBag = DisposeBag()
private var respository: GroupPhotoRepository
private var _isLoading = PublishSubject<Void>()
private let items = BehaviorRelay<[PhotoItem]>(value: [])
public var isLoading: Observable<Void> {
return _isLoading.asObservable()
}
public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
return items.map({ model in
return [AnimatableSectionModel(model: 0, items: model)]
})
}
public weak var delegate: GroupViewModelDelegate?
public init(groupItem: GroupItem) {
self.respository = GroupPhotoRepository(groupId: groupItem.group_id)
}
public func reload() {
respository.load()
.subscribe(onSuccess: {[weak self] (result) in
guard let `self` = self else { return }
self._isLoading.onNext(())
self.items.accept(result)
}, onError: {[weak self] (error) in
guard let `self` = self else { return }
self._isLoading.onNext(())
}).disposed(by: disposeBag)
}
public func submit(data: Data) {
respository.upload(data: data).subscribe(onSuccess: { [weak self] result in
guard let `self` = self else { return }
self.items.accept(result)
self._isLoading.onNext(())
}) {[weak self] (error) in
guard let `self` = self else { return }
self._isLoading.onNext(())
}.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)
}
}
/// GroupViewModelDelegate
public extension GroupViewModel {
func didSelect(_ item: PhotoItem) {
delegate?.didSelect(item)
}
@objc func navigateToGroupDetail() {
delegate?.navigateToGroupDetail()
}
}
|