|
//
// GroupPhotoRepository.swift
// PaiAi
//
// Created by FFIB on 2017/10/10.
// Copyright © 2017年 yb. All rights reserved.
//
import Foundation
import RxSwift
import RxCocoa
public protocol GroupPhotoRepositorable: Repositorable where Content == [PhotoItem] {
init(groupId: String)
}
fileprivate struct PhotoSubmitResource: Resource, Parsable {
typealias Model = PhotoItem
var path: Interfaces { return .photoUpload }
var parameter: Parameter = [:]
func parse(_ json: JSON) -> PhotoItem? {
guard let data = json["data"] as? [String: AnyObject],
let photos = data["photos"] as? [[String: AnyObject]] else { return nil }
let dataArr = photos.compactMap { $0 }
return PhotoItem(json: dataArr[0])
}
}
final public class GroupPhotoRepository: Resource {
fileprivate var items: BehaviorRelay<[PhotoItem]>
fileprivate var loadingSchedule: PublishSubject<Bool>
fileprivate var submitResource: PhotoSubmitResource
var path: Interfaces { return Interfaces.groupPhotoList }
var parameter: Parameter = [:]
init() {
items = BehaviorRelay<[PhotoItem]>(value: [])
loadingSchedule = PublishSubject<Bool>()
submitResource = PhotoSubmitResource()
}
}
extension GroupPhotoRepository: Parsable {
func parse(_ json: JSON) -> [PhotoItem]? {
guard let data = json["data"] as? [String: AnyObject],
let photos = data["photos"] as? [[String: AnyObject]] else { return nil }
#warning("crash")
let dataArr = photos.compactMap { $0 }
return dataArr.map { PhotoItem(json: $0) }
}
}
extension GroupPhotoRepository: Gettable {
public func loadContent(isRefresh: Bool) {
NetworkApi.share.post(resource: self) { (result) in
guard case let .success(items) = result else { return }
self.items.accept(items)
self.loadingSchedule.onNext(true)
}
}
}
extension GroupPhotoRepository: GroupPhotoRepositorable {
public var content: Observable<[PhotoItem]> {
return items.asObservable()
.flatMap { currentItems in
Observable.just(currentItems)
.distinctUntilChanged()
}.share()
}
public var loadingObserver: Observable<Bool> {
return loadingSchedule.asObserver()
.flatMap { current in
Observable.just(current)
}.share()
}
public convenience init(groupId: String) {
self.init()
parameter["group_id"] = groupId
parameter["user_id"] = ""
submitResource.parameter = ["group_id": groupId,
"user_id": ""]
}
}
extension GroupPhotoRepository: Submitable {
public func submit(data: Data) {
let name = (submitResource.parameter["group_id"] as? String) ?? "" + "" + "\(Date.timeIntervalSinceReferenceDate)"
let file = FileModel(name: name, fileData: data)
submitResource.parameter["photo"] = file
NetworkApi.share.upload(resource: submitResource) { (result) in
guard case let .success(item) = result else { return }
self.items.accept([item] + self.items.value)
self.loadingSchedule.onNext(true)
}
}
}
extension GroupPhotoRepository: Layoutable {
public func layoutSizeForIndex(_ index: Int) -> CGSize {
let h = items.value[index].photo_thumbnail_h
let w = items.value[index].photo_thumbnail_w
return CGSize(width: w, height: h)
}
}
|