
- 更新Yana项目文档,调整适用版本至iOS 17,确保与最新开发环境兼容。 - 在多个视图中重构代码,优化状态管理和视图逻辑,提升用户体验。 - 添加默认初始化器以简化状态管理,确保各个Feature的状态一致性。 - 更新视图组件,移除不必要的硬编码,增强代码可读性和维护性。 - 修复多个视图中的逻辑错误,确保功能正常运行。
100 lines
2.8 KiB
Swift
100 lines
2.8 KiB
Swift
import Foundation
|
|
import ComposableArchitecture
|
|
|
|
// MARK: - Config Response Model
|
|
struct ConfigResponse: Codable, Equatable {
|
|
let status: String?
|
|
let message: String?
|
|
let data: ConfigData?
|
|
}
|
|
|
|
struct ConfigData: Codable, Equatable {
|
|
let version: String?
|
|
let features: [String]?
|
|
let settings: ConfigSettings?
|
|
}
|
|
|
|
struct ConfigSettings: Codable, Equatable {
|
|
let enableDebug: Bool?
|
|
let apiTimeout: Int?
|
|
let maxRetries: Int?
|
|
}
|
|
|
|
// MARK: - Config API Request
|
|
struct ConfigRequest: APIRequestProtocol {
|
|
typealias Response = ConfigResponse
|
|
|
|
var endpoint: String { APIEndpoint.config.path }
|
|
var method: HTTPMethod { .GET }
|
|
var queryParameters: [String: String]? { nil }
|
|
var bodyParameters: [String: Any]? { nil }
|
|
var timeout: TimeInterval { 15.0 } // Config 请求使用较短超时
|
|
}
|
|
|
|
// MARK: - Config Feature
|
|
@Reducer
|
|
struct ConfigFeature {
|
|
@ObservableState
|
|
struct State: Equatable {
|
|
var isLoading = false
|
|
var configData: ConfigData?
|
|
var errorMessage: String?
|
|
var lastUpdated: Date?
|
|
|
|
init() {
|
|
// 默认初始化
|
|
}
|
|
}
|
|
|
|
enum Action: Equatable {
|
|
case loadConfig
|
|
case configResponse(TaskResult<ConfigResponse>)
|
|
case clearError
|
|
}
|
|
|
|
@Dependency(\.apiService) var apiService
|
|
|
|
var body: some ReducerOf<Self> {
|
|
Reduce { state, action in
|
|
switch action {
|
|
case .loadConfig:
|
|
state.isLoading = true
|
|
state.errorMessage = nil
|
|
|
|
return .run { send in
|
|
let request = ConfigRequest()
|
|
await send(.configResponse(
|
|
TaskResult {
|
|
try await apiService.request(request)
|
|
}
|
|
))
|
|
}
|
|
|
|
case let .configResponse(.success(response)):
|
|
state.isLoading = false
|
|
state.lastUpdated = Date()
|
|
|
|
if response.status == "success" {
|
|
state.configData = response.data
|
|
} else {
|
|
state.errorMessage = response.message ?? "配置加载失败"
|
|
}
|
|
return .none
|
|
|
|
case let .configResponse(.failure(error)):
|
|
state.isLoading = false
|
|
if let apiError = error as? APIError {
|
|
state.errorMessage = apiError.localizedDescription
|
|
} else {
|
|
state.errorMessage = error.localizedDescription
|
|
}
|
|
return .none
|
|
|
|
case .clearError:
|
|
state.errorMessage = nil
|
|
return .none
|
|
}
|
|
}
|
|
}
|
|
}
|