jsdw_ios/QuickLocation/Section/Home/HomeViewModel.swift

125 lines
3.7 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// HomeViewModel.swift
// QuickLocation
//
// Created by on 2026/5/30.
//
import RxSwift
import RxDataSources
import ObjectMapper
typealias GroupMemberListSectionModel = SectionModel<String, GroupMemberModel>
class HomeViewModel {
struct Output {
var sectionedItems: Observable<[GroupMemberListSectionModel]>
}
let output: Output
private var disposeBag = DisposeBag()
private let sectionedItems = PublishSubject<[GroupMemberListSectionModel]>()
lazy var cellAction: Action<GroupMemberModel, Void> = { this in
return Action { model in
return .empty()
}
}(self)
var targetUid: String = ""
var groupModel: GroupModel? {
didSet {
guard let model = groupModel else { return }
self.memberList = model.select_group_employee
}
}
//
var groupInfo: [String: Any] {
get {
guard let model = groupModel,
let groupInfoModel = model.groups.first(where: { $0.group_key == model.default_group_key }) else { return [:] }
return groupInfoModel.toJSON()
}
}
//
var groupName: String {
get {
guard let model = groupModel else { return "我的圈子" }
return model.groups.first(where: { $0.group_key == model.default_group_key })?.name ?? ""
}
}
//
var memberCount: Int {
get {
guard let model = groupModel else { return 0 }
return model.select_group_employee.count
}
}
// 线
var memberOnlineCount: Int {
get {
guard let model = groupModel else { return 0 }
return model.select_group_employee.filter { $0.is_online == true}.count
}
}
//
func isCurrentUser(id: String) -> Bool {
id == AppContextManager.shared.userId
}
//
func isGroupOwn(id: String) -> Bool {
guard let model = groupModel else { return false }
return model.default_group_key.contains(id)
}
func getUserNickName(id: String) -> String {
memberList.first { $0.user_id == id }?.nick_name ?? ""
}
var memberList: [GroupMemberModel] = [] {
didSet {
var tempList = memberList
tempList.moveToFirst { $0.user_id == AppContextManager.shared.userId }
tempList.moveToFirst { isGroupOwn(id: $0.user_id) }
memberList = tempList
sectionedItems.onNext(memberList.mapSection())
}
}
/// 线 last_active_time "X"
func setMemberOffline(userId: String) {
guard let idx = memberList.firstIndex(where: { $0.user_id == userId }) else { return }
var updated = memberList
updated[idx].is_online = false
memberList = updated
}
/// MQTT 线
func updateMemberLocation(userId: String, lat: Double, lon: Double, address: String, battery: String, isOnline: Bool, lastUpdateTime: Int64) {
guard let idx = memberList.firstIndex(where: { $0.user_id == userId }) else { return }
var updated = memberList
updated[idx].last_position = "\(lat):\(lon):\(address)"
updated[idx].battery = battery
updated[idx].is_online = isOnline
updated[idx].last_active_time = lastUpdateTime
memberList = updated // didSet + sectionedItems
}
// MARK: - Init
init() {
output = Output(
sectionedItems: sectionedItems.asObservable()
)
}
}