Files
e-party-iOS/yana/Utils/APILoading/APILoadingEffectView.swift
edwinQQQ 128bf36c88 feat: 更新依赖和项目配置,优化代码结构
- 在Package.swift中注释掉旧的swift-composable-architecture依赖,并添加swift-case-paths依赖。
- 在Podfile中将iOS平台版本更新至16.0,并移除QCloudCOSXML/Transfer依赖,改为使用QCloudCOSXML。
- 更新Podfile.lock以反映依赖变更,确保项目依赖的准确性。
- 新增架构分析需求文档,明确项目架构评估和改进建议。
- 在多个文件中实现async/await语法,提升异步操作的可读性和性能。
- 更新日志输出方法,确保在调试模式下提供一致的调试信息。
- 优化多个视图组件,提升用户体验和代码可维护性。
2025-07-17 18:47:09 +08:00

228 lines
6.6 KiB
Swift
Raw 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.

import SwiftUI
// MARK: - API Loading Effect View
/// API
///
///
/// - Loading 88x8860% alpha
/// - 2
/// -
/// -
struct APILoadingEffectView: View {
@ObservedObject private var loadingManager = APILoadingManager.shared
var body: some View {
ZStack {
// 🚨 ForEach
if let firstItem = getFirstDisplayItem() {
SingleLoadingView(item: firstItem)
.onAppear {
debugInfoSync("🔍 Loading item appeared: \(firstItem.id)")
}
.onDisappear {
debugInfoSync("🔍 Loading item disappeared: \(firstItem.id)")
}
}
}
.allowsHitTesting(false) //
.ignoresSafeArea(.all) //
.onReceive(loadingManager.$loadingItems) { items in
debugInfoSync("🔍 Loading items updated: \(items.count) items")
}
}
///
private func getFirstDisplayItem() -> APILoadingItem? {
guard Thread.isMainThread else {
debugWarnSync("⚠️ getFirstDisplayItem called from background thread")
return nil
}
return loadingManager.loadingItems.first { $0.shouldDisplay }
}
}
// MARK: - Single Loading View
/// -
private struct SingleLoadingView: View {
let item: APILoadingItem
var body: some View {
Group {
switch item.state {
case .loading:
SimpleLoadingView()
case .error(let message):
if item.shouldShowError {
SimpleErrorView(message: message)
}
case .success:
EmptyView() //
}
}
// 🚨
}
}
// MARK: - Simple Loading View
/// Loading
private struct SimpleLoadingView: View {
var body: some View {
VStack {
Spacer()
HStack {
Spacer()
// +
ZStack {
RoundedRectangle(cornerRadius: 12)
.fill(Color.black.opacity(0.6))
.frame(width: 88, height: 88)
// 使 ProgressView
ProgressView()
.progressViewStyle(CircularProgressViewStyle(tint: .white))
.scaleEffect(1.2)
}
Spacer()
}
Spacer()
}
}
}
// MARK: - Simple Error View
///
private struct SimpleErrorView: View {
let message: String
var body: some View {
VStack {
Spacer()
HStack {
Spacer()
//
VStack(spacing: 8) {
Image(systemName: "exclamationmark.triangle.fill")
.foregroundColor(.white)
.font(.title2)
Text(message)
.foregroundColor(.white)
.font(.system(size: 14))
.multilineTextAlignment(.center)
.lineLimit(2)
}
.padding(16)
.background(
RoundedRectangle(cornerRadius: 12)
.fill(Color.black.opacity(0.6))
)
.frame(maxWidth: 250)
Spacer()
}
Spacer()
}
}
}
// MARK: - Preview
#if DEBUG
struct APILoadingEffectView_Previews: PreviewProvider {
static var previews: some View {
ZStack {
//
Rectangle()
.fill(Color.blue.opacity(0.3))
.ignoresSafeArea()
VStack(spacing: 20) {
Text("背景内容")
.font(.title)
Button("测试按钮") {
debugInfoSync("按钮被点击了!")
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
// Loading Effect View
APILoadingEffectView()
}
.previewDisplayName("API Loading Effect")
.onAppear {
//
Task {
let manager = APILoadingManager.shared
// loading
let id1 = manager.startLoading()
// 2
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
Task {
manager.setError(id1, errorMessage: "网络连接失败,请检查网络设置")
}
}
}
}
}
}
// MARK: - Preview Helpers
///
private struct PreviewStateModifier: ViewModifier {
let showLoading: Bool
let showError: Bool
let errorMessage: String
func body(content: Content) -> some View {
content
.onAppear {
Task {
let manager = APILoadingManager.shared
if showLoading {
let _ = manager.startLoading()
}
if showError {
let id = manager.startLoading()
try? await Task.sleep(nanoseconds: 1_000_000_000) // 1
manager.setError(id, errorMessage: errorMessage)
}
}
}
}
}
extension View {
///
func previewLoadingState(
showLoading: Bool = false,
showError: Bool = false,
errorMessage: String = "示例错误信息"
) -> some View {
self.modifier(PreviewStateModifier(
showLoading: showLoading,
showError: showError,
errorMessage: errorMessage
))
}
}
#endif