53 lines
1.1 KiB
Swift
53 lines
1.1 KiB
Swift
//
|
|
// MapViewModel.swift
|
|
// QuickLocation
|
|
//
|
|
|
|
import Foundation
|
|
import RxSwift
|
|
import RxCocoa
|
|
import CoreLocation
|
|
|
|
final class MapViewModel {
|
|
|
|
struct Output {
|
|
var members: Observable<[CircleMember]>
|
|
var trackingMode: Observable<Bool>
|
|
}
|
|
|
|
let output: Output
|
|
|
|
private let membersRelay = BehaviorRelay<[CircleMember]>(value: [])
|
|
private let trackingRelay = BehaviorRelay<Bool>(value: true)
|
|
let selectedMember = PublishSubject<CircleMember>()
|
|
|
|
init() {
|
|
output = Output(
|
|
members: membersRelay.asObservable(),
|
|
trackingMode: trackingRelay.asObservable()
|
|
)
|
|
}
|
|
|
|
func loadMembers() {
|
|
membersRelay.accept(.mock)
|
|
}
|
|
|
|
func toggleTracking() {
|
|
trackingRelay.accept(!trackingRelay.value)
|
|
}
|
|
|
|
func selectMember(_ member: CircleMember) {
|
|
selectedMember.onNext(member)
|
|
}
|
|
|
|
func currentUser() -> CircleMember? {
|
|
membersRelay.value.first { $0.isCurrentUser }
|
|
}
|
|
|
|
#if !targetEnvironment(simulator)
|
|
func memberAnnotations() -> [MemberAnnotation] {
|
|
membersRelay.value.map { MemberAnnotation(member: $0) }
|
|
}
|
|
#endif
|
|
}
|