jsdw_ios/QuickLocation/Section/Group/GroupMemberList/GroupMemberListVM.swift

131 lines
4.2 KiB
Swift

//
// GroupMemberListVM.swift
// QuickLocation
//
// Created by on 2026/6/29.
//
import RxSwift
import RxRelay
import RxDataSources
import ObjectMapper
// MARK: - DrivingStats
struct DrivingStatsData {
let distance_km: Double?
let frequent_lane_change: Int?
let hard_acceleration: Int?
let hard_braking: Int?
let long_driving: Int?
let low_speeding: Int?
let max_speed: Double?
let period: String?
let sharp_turn: Int?
let signal_loss: Int?
let speeding: Int?
let total: Int?
}
struct DrivingEventItem: IdentifiableType, Equatable {
typealias Identity = String
let identity: String
let title: String
let iconName: String
let count: Int
init(title: String, iconName: String, count: Int = 0) {
self.identity = title
self.title = title
self.iconName = iconName
self.count = count
}
}
typealias DrivingEventSection = SectionModel<String, DrivingEventItem>
class GroupMemberListVM {
let groupKey: String
var groupModel: GroupInfoModel?
struct Output {
var sectionedItems: Observable<[GroupMemberListSectionModel]>
var drivingSectionedItems: Observable<[DrivingEventSection]>
}
let output: Output
private var disposeBag = DisposeBag()
private let sectionedItems = PublishSubject<[GroupMemberListSectionModel]>()
private let drivingItemsRelay = BehaviorRelay<[DrivingEventItem]>(value: GroupMemberListVM.defaultDrivingEvents)
private var memberList: [GroupMemberModel] = []
private static let defaultDrivingEvents: [DrivingEventItem] = [
DrivingEventItem(title: "急加速", iconName: "GroupMemberList/1"),
DrivingEventItem(title: "急转向", iconName: "GroupMemberList/3"),
DrivingEventItem(title: "急刹", iconName: "GroupMemberList/5"),
DrivingEventItem(title: "手机干扰", iconName: "GroupMemberList/7"),
DrivingEventItem(title: "超速", iconName: "GroupMemberList/2"),
DrivingEventItem(title: "低速", iconName: "GroupMemberList/4"),
DrivingEventItem(title: "频繁变道", iconName: "GroupMemberList/6"),
DrivingEventItem(title: "长时间驾驶", iconName: "GroupMemberList/8")
]
//
func isCurrentUser(id: String) -> Bool {
id == AppContextManager.shared.userId
}
//
func isGroupOwn(id: String) -> Bool {
guard let model = groupModel else { return false }
return model.group_key.contains(id)
}
func loadData(_ list: [GroupMemberModel]) {
var tempmemberList = list
tempmemberList.moveToFirst { $0.is_online == true }
tempmemberList.moveToFirst { $0.user_id == AppContextManager.shared.userId }
tempmemberList.moveToFirst { isGroupOwn(id: $0.user_id) }
memberList = tempmemberList
sectionedItems.onNext(memberList.mapSection())
}
/// userId
var firstMemberId: String? { memberList.first?.user_id }
///
func rowOf(userId: String) -> Int? {
memberList.firstIndex(where: { $0.user_id == userId })
}
///
func updateDrivingStats(_ stats: DrivingStatsData) {
let items = Self.defaultDrivingEvents.enumerated().map { i, item in
let count: Int
switch i {
case 0: count = stats.hard_acceleration ?? 0
case 1: count = stats.speeding ?? 0
case 2: count = stats.sharp_turn ?? 0
case 3: count = stats.low_speeding ?? 0
case 4: count = stats.hard_braking ?? 0
case 5: count = stats.frequent_lane_change ?? 0
case 6: count = stats.signal_loss ?? 0
case 7: count = stats.long_driving ?? 0
default: count = 0
}
return DrivingEventItem(title: item.title, iconName: item.iconName, count: count)
}
drivingItemsRelay.accept(items)
}
init(groupKey: String) {
self.groupKey = groupKey
output = Output(
sectionedItems: sectionedItems.asObservable(),
drivingSectionedItems: drivingItemsRelay.map { $0.mapSection() }.asObservable()
)
}
}