Files
suixinkan_uikit/suixinkan/Features/Home/ViewModels/PermissionApplyStatusViewModel.swift
汉秋 efb3925257 完善首页权限申请流程与队列播报体验。
对齐 Android 无权限强制弹窗、角色下拉与申请页交互,补充 UIButton configuration 适配,并增强景区排队 TTS 与相关单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 13:46:45 +08:00

72 lines
2.1 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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?()
}
}