117 lines
3.7 KiB
Swift
117 lines
3.7 KiB
Swift
//
|
||
// MineViewModel.swift
|
||
// QuickLocation
|
||
//
|
||
|
||
import Foundation
|
||
import RxSwift
|
||
import RxDataSources
|
||
|
||
typealias MineListSectionModel = SectionModel<String, MineMenuItem>
|
||
|
||
class MineViewModel {
|
||
|
||
struct Output {
|
||
var sectionedItems: Observable<[MineListSectionModel]>
|
||
}
|
||
|
||
let output: Output
|
||
|
||
private var disposeBag = DisposeBag()
|
||
private let sectionedItems = PublishSubject<[MineListSectionModel]>()
|
||
|
||
let userAvatar = PublishSubject<String>()
|
||
let userName = PublishSubject<String>()
|
||
let userID = PublishSubject<String>()
|
||
|
||
/// 设置列表(设计稿)
|
||
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<MineMenuItem, Void> = { 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
|
||
}
|