Nav apraksta

GroupDetailViewModel.swift 4.3KB

    // // 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) } }