基于 Lottie 在关键流程中新增全局 Loading 遮罩

引入带引用计数的 GlobalLoadingCenter,通过 RootView 及主要登录/订单/个人中心页面接入,并添加 Loading 动画资源与单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-23 11:25:56 +08:00
parent 5541a0b106
commit 47848b88f2
17 changed files with 514 additions and 139 deletions

View File

@ -15,6 +15,7 @@ struct RealNameAuthView: View {
@Environment(ProfileAPI.self) private var profileAPI
@Environment(OSSUploadService.self) private var ossUploadService
@Environment(ToastCenter.self) private var toastCenter
@Environment(\.globalLoading) private var globalLoading
@State private var viewModel = RealNameAuthViewModel()
@State private var pickedFrontItem: PhotosPickerItem?
@State private var pickedBackItem: PhotosPickerItem?
@ -37,14 +38,6 @@ struct RealNameAuthView: View {
.task {
await loadInfo()
}
.overlay {
if viewModel.loading && viewModel.info == nil {
ProgressView()
.controlSize(.large)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.white.opacity(0.35))
}
}
.onChange(of: pickedFrontItem) { _, item in
Task { await prepareIdentityImage(from: item, side: .front) }
}
@ -380,7 +373,9 @@ struct RealNameAuthView: View {
///
private func loadInfo() async {
do {
try await viewModel.load(api: profileAPI)
try await globalLoading.withOptionalLoading(viewModel.info == nil, message: "加载中...") {
try await viewModel.load(api: profileAPI)
}
} catch is CancellationError {
return
} catch {
@ -400,11 +395,13 @@ struct RealNameAuthView: View {
///
private func submit() async {
do {
try await viewModel.submit(
api: profileAPI,
uploader: ossUploadService,
scenicId: accountContext.currentScenic?.id ?? 0
)
try await globalLoading.withLoading(message: "提交中...") {
try await viewModel.submit(
api: profileAPI,
uploader: ossUploadService,
scenicId: accountContext.currentScenic?.id ?? 0
)
}
} catch {
viewModel.statusMessage = error.localizedDescription
toastCenter.show(error.localizedDescription)