ReadKeep/readeck/UI/Settings/CacheSettingsView.swift
Ilyas Hallak 4fd55ef5d0 Refactor settings to use Clean Architecture with ViewModels
- Add cache settings UseCases (get/update size, clear cache)
- Create CacheSettingsViewModel and OfflineSettingsViewModel
- Replace direct UserDefaults access with repository pattern
- Add CachedArticlesPreviewView for viewing offline articles
- Integrate offline settings into main SettingsContainerView
- Wire up new UseCases in factory pattern
2025-12-01 21:56:13 +01:00

93 lines
2.9 KiB
Swift

import SwiftUI
struct CacheSettingsView: View {
@State private var viewModel = CacheSettingsViewModel()
var body: some View {
Section {
HStack {
VStack(alignment: .leading, spacing: 2) {
Text("Current Cache Size")
Text("\(viewModel.cacheSize) / \(Int(viewModel.maxCacheSize)) MB max")
.font(.caption)
.foregroundColor(.secondary)
}
Spacer()
Button("Refresh") {
Task {
await viewModel.updateCacheSize()
}
}
.font(.caption)
.foregroundColor(.blue)
}
VStack(alignment: .leading, spacing: 8) {
HStack {
Text("Max Cache Size")
Spacer()
Text("\(Int(viewModel.maxCacheSize)) MB")
.font(.caption)
.foregroundColor(.secondary)
}
Slider(value: $viewModel.maxCacheSize, in: 50...1200, step: 50) {
Text("Max Cache Size")
}
.onChange(of: viewModel.maxCacheSize) { _, newValue in
Task {
await viewModel.updateMaxCacheSize(newValue)
}
}
}
Button(action: {
viewModel.showClearAlert = true
}) {
HStack {
if viewModel.isClearing {
ProgressView()
.scaleEffect(0.8)
} else {
Image(systemName: "trash")
.foregroundColor(.red)
}
VStack(alignment: .leading, spacing: 2) {
Text("Clear Cache")
.foregroundColor(viewModel.isClearing ? .secondary : .red)
Text("Remove all cached images")
.font(.caption)
.foregroundColor(.secondary)
}
Spacer()
}
}
.disabled(viewModel.isClearing)
} header: {
Text("Cache Settings")
}
.task {
await viewModel.loadCacheSettings()
}
.alert("Clear Cache", isPresented: $viewModel.showClearAlert) {
Button("Cancel", role: .cancel) { }
Button("Clear", role: .destructive) {
Task {
await viewModel.clearCache()
}
}
} message: {
Text("This will remove all cached images. They will be downloaded again when needed.")
}
}
}
#Preview {
List {
CacheSettingsView()
}
.listStyle(.insetGrouped)
}