// // MineViewModel.swift // QuickLocation // import Foundation import RxSwift import RxDataSources typealias MineListSectionModel = SectionModel class MineViewModel { struct Output { var sectionedItems: Observable<[MineListSectionModel]> } let output: Output private var disposeBag = DisposeBag() private let sectionedItems = PublishSubject<[MineListSectionModel]>() let userAvatar = PublishSubject() let userName = PublishSubject() let userID = PublishSubject() /// 设置列表(设计稿) let menuItems: [MineMenuItem] = [ MineMenuItem(icon: "Mine/account_security", title: "账户与安全"), MineMenuItem(icon: "Mine/emergency_contact", title: "紧急联系人"), MineMenuItem(icon: "Mine/customer_service", title: "在线客服"), MineMenuItem(icon: "Mine/menu_about", title: "关于我们") ] /// 快捷入口 let quickItems: [MineMenuItem] = [ MineMenuItem(icon: "Mine/quick_permission", title: "权限检测"), MineMenuItem(icon: "Mine/quick_data_security", title: "数据安全"), MineMenuItem(icon: "Mine/quick_status", title: "状态设置"), MineMenuItem(icon: "Mine/quick_privacy", title: "隐私设置") ] lazy var cellAction: Action = { this in return Action { model in this.handleMenu(model) return .empty() } }(self) func handleMenu(_ model: MineMenuItem) { switch model.title { case "账户与安全": AppRouter.push(Route.account) case "紧急联系人": AppRouter.push(Route.emergencyContact) case "隐私与协议", "隐私设置": AppRouter.push(Route.privacyPolicy) case "在线客服": requestWechatService() case "权限检测": AppRouter.push(Route.checkPermission) case "数据安全", "状态设置", "关于我们": DLToast.show(text: "敬请期待") default: break } } func loadMenuData() { sectionedItems.onNext(menuItems.mapSection()) } /// 圈主 → 自己 → 在线(对齐首页) func sortedMembers(_ list: [GroupMemberModel], groupKey: String) -> [GroupMemberModel] { list.enumerated() .sorted { lhs, rhs in let lp = memberSortPriority(lhs.element, groupKey: groupKey) let rp = memberSortPriority(rhs.element, groupKey: groupKey) if lp != rp { return lp < rp } return lhs.offset < rhs.offset } .map(\.element) } private func memberSortPriority(_ member: GroupMemberModel, groupKey: String) -> Int { if !groupKey.isEmpty, groupKey.contains(member.user_id) { return 0 } if member.user_id == AppContextManager.shared.userId { return 1 } if member.is_online { return 2 } return 3 } func requestWechatService() { DLToast.showLoading() SystemService.wechatService().subscribe(onNext: { response in DLToast.dismiss() guard let responseData = response.data, let corpid = responseData["corpid"] as? String, let url = responseData["kf.address"] as? String else { return } let req = WXOpenCustomerServiceReq() req.corpid = corpid req.url = url WXApi.send(req) }, onError: { _ in }).disposed(by: disposeBag) } init() { output = Output( sectionedItems: sectionedItems.asObservable() ) } } struct MineMenuItem { let icon: String let title: String }