对齐 Android 无权限强制弹窗、角色下拉与申请页交互,补充 UIButton configuration 适配,并增强景区排队 TTS 与相关单元测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
72 lines
2.1 KiB
Swift
72 lines
2.1 KiB
Swift
//
|
|
// PermissionApplyStatusViewModel.swift
|
|
// suixinkan
|
|
//
|
|
|
|
import Foundation
|
|
|
|
/// 权限申请审核状态 ViewModel,对齐 Android `PermissionApplyStatusViewModel`。
|
|
final class PermissionApplyStatusViewModel {
|
|
|
|
private(set) var pendingData: RoleApplyPendingResponse?
|
|
private(set) var isLoading = false
|
|
private(set) var rolePermissionList: [RolePermissionResponse] = []
|
|
private(set) var showScenicListDialog = false
|
|
private(set) var dialogRoleName = ""
|
|
private(set) var dialogScenicList: [ScenicInfo] = []
|
|
|
|
var onStateChange: (() -> Void)?
|
|
var onNavigateToEdit: ((RoleApplyPendingResponse) -> Void)?
|
|
|
|
private let applyCode: String
|
|
private let appStore: AppStore
|
|
|
|
init(applyCode: String, appStore: AppStore = .shared) {
|
|
self.applyCode = applyCode
|
|
self.appStore = appStore
|
|
rolePermissionList = appStore.permissions.rolePermissionList()
|
|
}
|
|
|
|
func loadPendingData(api: HomeAPI) async {
|
|
isLoading = true
|
|
notifyStateChange()
|
|
do {
|
|
let pendingList = try await api.roleApplyPending()
|
|
pendingData = pendingList.first {
|
|
$0.code == applyCode
|
|
&& ($0.status == PermissionApplyPendingStatus.reviewing
|
|
|| $0.status == PermissionApplyPendingStatus.rejected)
|
|
}
|
|
} catch {
|
|
pendingData = nil
|
|
}
|
|
isLoading = false
|
|
notifyStateChange()
|
|
}
|
|
|
|
func navigateToEditIfRejected() {
|
|
guard let pendingData, pendingData.status == PermissionApplyPendingStatus.rejected else { return }
|
|
onNavigateToEdit?(pendingData)
|
|
}
|
|
|
|
/// 展示某个已有角色的全部景区。
|
|
func showScenicList(roleName: String, scenics: [ScenicInfo]) {
|
|
dialogRoleName = roleName
|
|
dialogScenicList = scenics
|
|
showScenicListDialog = true
|
|
notifyStateChange()
|
|
}
|
|
|
|
/// 关闭已有景区列表弹窗。
|
|
func hideScenicList() {
|
|
dialogRoleName = ""
|
|
dialogScenicList = []
|
|
showScenicListDialog = false
|
|
notifyStateChange()
|
|
}
|
|
|
|
private func notifyStateChange() {
|
|
onStateChange?()
|
|
}
|
|
}
|