Files
e-party-iOS/yana/Features/ConfigFeature.swift
edwinQQQ 3d00e459e3 feat: 更新文档和视图以支持iOS 17及优化用户体验
- 更新Yana项目文档,调整适用版本至iOS 17,确保与最新开发环境兼容。
- 在多个视图中重构代码,优化状态管理和视图逻辑,提升用户体验。
- 添加默认初始化器以简化状态管理,确保各个Feature的状态一致性。
- 更新视图组件,移除不必要的硬编码,增强代码可读性和维护性。
- 修复多个视图中的逻辑错误,确保功能正常运行。
2025-07-29 17:57:42 +08:00

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
}
}
}
}