Files
e-party-iOS/yana/Views/LanguageSettingsView.swift
edwinQQQ b966e24532 feat: 更新COSManager和相关视图以增强图片上传功能
- 修改COSManagerAdapter以支持新的TCCos组件,确保与腾讯云COS的兼容性。
- 在CreateFeedFeature中新增图片上传相关状态和Action,优化图片选择与上传逻辑。
- 更新CreateFeedView以整合图片上传功能,提升用户体验。
- 在多个视图中添加键盘状态管理,改善用户交互体验。
- 新增COS相关的测试文件,确保功能的正确性和稳定性。
2025-07-31 11:41:56 +08:00

238 lines
10 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
import ComposableArchitecture
struct LanguageSettingsView: View {
@ObservedObject private var localizationManager = LocalizationManager.shared
// @StateObject private var cosManager = COSManager.shared
@Binding var isPresented: Bool
// 使 TCA API
@Dependency(\.apiService) private var apiService
//
@State private var cosTokenData: TcTokenData?
//
private func formatDate(_ date: Date) -> String {
let formatter = DateFormatter()
formatter.dateStyle = .medium
return formatter.string(from: date)
}
init(isPresented: Binding<Bool> = .constant(true)) {
self._isPresented = isPresented
}
var body: some View {
NavigationStack {
List {
Section {
ForEach(LocalizationManager.SupportedLanguage.allCases, id: \.rawValue) { language in
LanguageRow(
language: language,
isSelected: localizationManager.currentLanguage == language
) {
localizationManager.switchLanguage(to: language)
}
}
} header: {
Text("选择语言 / Select Language")
.font(.caption)
.foregroundColor(.secondary)
}
Section {
HStack {
Text(LocalizedString("language_settings.current_language", comment: ""))
.font(.body)
Spacer()
Text(localizationManager.currentLanguage.localizedDisplayName)
.font(.body)
.foregroundColor(.blue)
}
} header: {
Text(LocalizedString("language_settings.language_info", comment: ""))
.font(.caption)
.foregroundColor(.secondary)
}
//
Section {
VStack(alignment: .leading, spacing: 8) {
Text(LocalizedString("language_settings.test_area", comment: ""))
.font(.headline)
VStack(alignment: .leading, spacing: 4) {
Text(LocalizedString("language_settings.test_region", comment: ""))
.font(.subheadline)
.foregroundColor(.secondary)
Text("应用标题: \(LocalizedString("login.app_title", comment: ""))")
.font(.caption)
Text("登录按钮: \(LocalizedString("login.id_login", comment: ""))")
.font(.caption)
Text("当前语言代码: \(localizationManager.currentLanguage.rawValue)")
.font(.caption)
.foregroundColor(.blue)
}
.padding(.leading, 8)
}
} header: {
Text(LocalizedString("language_settings.test_region", comment: ""))
.font(.caption)
.foregroundColor(.secondary)
}
// COS Token
// Section {
// VStack(alignment: .leading, spacing: 8) {
// Button(LocalizedString("language_settings.test_cos_token", comment: "")) {
// Task {
//// await testCOToken()
// }
// }
// .buttonStyle(.borderedProminent)
//
// if let tokenData = cosTokenData {
// VStack(alignment: .leading, spacing: 4) {
// Text(LocalizedString("language_settings.token_success", comment: ""))
// .font(.headline)
// .foregroundColor(.green)
//
// Text(String(format: LocalizedString("language_settings.bucket", comment: ""), tokenData.bucket))
// .font(.caption)
//
// Text(String(format: LocalizedString("language_settings.region", comment: ""), tokenData.region))
// .font(.caption)
//
// Text(String(format: LocalizedString("language_settings.app_id", comment: ""), tokenData.appId))
// .font(.caption)
//
// Text(String(format: LocalizedString("language_settings.custom_domain", comment: ""), tokenData.customDomain))
// .font(.caption)
//
// Text(String(format: LocalizedString("language_settings.accelerate_status", comment: ""),
// tokenData.accelerate ?
// LocalizedString("language_settings.accelerate_enabled", comment: "") :
// LocalizedString("language_settings.accelerate_disabled", comment: "")))
// .font(.caption)
//
// Text(String(format: LocalizedString("language_settings.expiration_date", comment: ""), formatDate(tokenData.expirationDate)))
// .font(.caption)
//
// Text(String(format: LocalizedString("language_settings.remaining_time", comment: ""), tokenData.remainingTime))
// .font(.caption)
// }
// .padding(.leading, 8)
// }
// }
// } header: {
// Text(LocalizedString("language_settings.test_region", comment: ""))
// .font(.caption)
// .foregroundColor(.secondary)
// }
// #if DEBUG
// Section("") {
// Button(" COS Token") {
// Task {
// await testCOToken()
// }
// }
// .foregroundColor(.blue)
//
// if let tokenData = cosManager.token {
// VStack(alignment: .leading, spacing: 8) {
// Text(" Token ")
// .font(.headline)
// .foregroundColor(.green)
//
// Group {
// Text(": \(tokenData.bucket)")
// Text(": \(tokenData.region)")
// Text("ID: \(tokenData.appId)")
// Text(": \(tokenData.customDomain)")
// Text(": \(tokenData.accelerate ? "" : "")")
// Text(": \(formatDate(tokenData.expirationDate))")
// Text(": \(tokenData.remainingTime)")
// }
// .font(.caption)
// .foregroundColor(.secondary)
// }
// .padding(.vertical, 4)
// }
// }
// #endif
}
.navigationTitle(LocalizedString("language_settings.title", comment: ""))
.navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(true)
.onAppear {
// #if DEBUG
// // tcToken API
// Task {
// await cosManager.testTokenRetrieval(apiService: apiService)
// }
// #endif
}
}
}
// private func testCOToken() async {
// let token = await cosManager.getToken(apiService: apiService)
// if let token = token {
// print(" Token ")
// print(" - : \(token.bucket)")
// print(" - : \(token.region)")
// print(" - : \(token.remainingTime)")
//
// //
// cosTokenData = token
// } else {
// print(" Token : Token")
// cosTokenData = nil
// }
// }
}
struct LanguageRow: View {
let language: LocalizationManager.SupportedLanguage
let isSelected: Bool
let onTap: () -> Void
var body: some View {
Button(action: onTap) {
HStack {
VStack(alignment: .leading, spacing: 4) {
Text(language.localizedDisplayName)
.font(.body)
.foregroundColor(.primary)
Text(language.displayName)
.font(.caption)
.foregroundColor(.secondary)
}
Spacer()
if isSelected {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.blue)
.font(.system(size: 20))
}
}
.contentShape(Rectangle())
}
.buttonStyle(PlainButtonStyle())
}
}
// MARK: - Preview
//#Preview {
// LanguageSettingsView(isPresented: .constant(true))
//}