|
//
// GroupDetailViewModel.swift
// PaiaiDataKit
//
// Created by FFIB on 2017/1/3.
// Copyright © 2017年 FFIB. All rights reserved.
//
import Foundation
import RxSwift
import RxCocoa
public protocol GroupDetailViewModelDelegate: class {
func navigateToGroupMember(_ item: GroupDetailItem)
func navigateToGroupNameModification(_ item: GroupDetailItem)
func navigateToRootViewController()
func navigationBackToGroupDetail()
}
public class GroupDetailViewModel {
private let repository: GroupDetailRepository
private var disposeBag = DisposeBag()
public weak var delegate: GroupDetailViewModelDelegate?
public let didQuit = PublishSubject<Void>()
public let item: BehaviorRelay<GroupDetailItem>
public var groupName: Observable<String> {
return item.asObservable().flatMapLatest({ (item) -> Observable<String> in
return Observable.just(item.group.group_name)
})
}
public var groupMembers: Observable<[GroupMemberItem]> {
return item.asObservable().flatMapLatest({ (item) -> Observable<[GroupMemberItem]> in
return Observable.just(item.users)
})
}
public var groupMemberCount: Observable<String> {
return item.asObservable().flatMapLatest({ (item) -> Observable<String> in
return Observable.just("\(item.users.count)")
})
}
public var isAdmin: Observable<Bool> {
return item.asObservable().flatMapLatest({ (item) -> Observable<Bool> in
return Observable.just(item.group.admin_id == ShareUserId)
})
}
public var groupLock: Observable<Bool> {
return item.asObservable().flatMapLatest({ (item) -> Observable<Bool> in
return Observable.just(item.group.group_lock)
})
}
public init(item: GroupItem) {
self.repository = PhotoGroupDetailRepository(groupId: item.group_id)
var groupDetailItem = GroupDetailItem(json: [:])
groupDetailItem.group = item
self.item = BehaviorRelay<GroupDetailItem>(value: groupDetailItem)
}
public func toggle(isLock: Bool) {
if isLock {
repository.lock().subscribe(onCompleted: {
var v = self.item.value
v.group.group_lock = true
self.item.accept(v)
Toast.show(message: "群已锁定")
}).disposed(by: disposeBag)
} else {
repository.unlock().subscribe(onCompleted: {
var v = self.item.value
v.group.group_lock = false
Toast.show(message: "群未锁定")
}).disposed(by: disposeBag)
}
}
public func reload() {
repository.load().subscribe(onSuccess: {[unowned self] (v) in
self.item.accept(v)
}, onError: nil).disposed(by: disposeBag)
}
public func quit() {
guard item.value.group.admin_id != ShareUserId else {
Toast.show(message: "群主不能退出群")
return
}
Toast.showActivity(message: "正在退出群")
repository.quit()
.subscribe(onCompleted: {[unowned self] in
Toast.show(message: "退出群成功")
self.didQuit.onNext(())
NotificationCenter.default.post(name: .GroupItemsChanged, object: nil, userInfo: [GroupItemsOperator.key: GroupItemsOperator.remove(self.item.value.group_id)])
self.delegate?.navigateToRootViewController()
}).disposed(by: disposeBag)
}
public func changeName(name: String) {
repository.update(name: name)
.subscribe(onCompleted: {[unowned self] in
Toast.show(message: "群名称已修改")
var v = self.item.value
v.group.group_name = name
self.item.accept(v)
NotificationCenter.default.post(name: .GroupItemsChanged, object: nil, userInfo: [GroupItemsOperator.key: GroupItemsOperator.update(v.group_id, v.group)])
self.delegate?.navigationBackToGroupDetail()
}).disposed(by: disposeBag)
}
}
public extension GroupDetailViewModel {
func navigateToGroupMember() {
delegate?.navigateToGroupMember(item.value)
}
func navigateToGroupNameModification() {
delegate?.navigateToGroupNameModification(item.value)
}
}
|