// // HomeViewModel.swift // QuickLocation // // Created by 八条 on 2026/5/30. // import RxSwift import RxDataSources import ObjectMapper typealias GroupMemberListSectionModel = SectionModel class HomeViewModel { struct Output { var sectionedItems: Observable<[GroupMemberListSectionModel]> } let output: Output private var disposeBag = DisposeBag() private let sectionedItems = PublishSubject<[GroupMemberListSectionModel]>() lazy var cellAction: Action = { this in return Action { model in return .empty() } }(self) 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) } var memberList: [GroupMemberModel] = [] { didSet { var tempList = memberList // 当前用户的电量 // if var model = memberList.first(where: { $0.user_id == AppContextManager.shared.userId }), // let idx = memberList.firstIndex(where: { $0.user_id == AppContextManager.shared.userId }) { // let battery = UIDevice.current.batteryLevel > 0 // ? Int(UIDevice.current.batteryLevel * 100) // : 0 // model.battery = battery.string // model.is_online = true // tempList[idx] = model // } tempList.moveToFirst { $0.user_id == AppContextManager.shared.userId } tempList.moveToFirst { isGroupOwn(id: $0.user_id) } memberList = tempList sectionedItems.onNext(memberList.mapSection()) } } /// MQTT 位置更新后刷新成员的地址、电量、在线状态 func updateMemberLocation(userId: String, lat: Double, lon: Double, address: String, battery: String, isOnline: Bool, lastUpdateText: String) { 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].lastUpdateText = lastUpdateText memberList = updated // 触发 didSet → 排序 + 重发 sectionedItems } // MARK: - Init init() { output = Output( sectionedItems: sectionedItems.asObservable() ) } }