- Integrate Kingfisher for image caching with CachedAsyncImage component - Add CacheSettingsView for managing image cache size and clearing cache - Implement three card layout styles: compact, magazine (default), natural - Add AppearanceSettingsView with visual layout previews and theme settings - Create Clean Architecture for card layout with domain models and use cases - Implement FlowLayout for dynamic label width calculation - Add skeleton loading animation for initial bookmark loads - Replace delete confirmation dialogs with immediate delete + 3-second undo - Support multiple simultaneous undo operations with individual progress bars - Add grayed-out visual feedback for pending deletions - Centralize notification names in dedicated NotificationNames file - Remove pagination logic from label management (replaced with FlowLayout) - Update AsyncImage usage across BookmarkCardView, BookmarkDetailView, ImageViewerView - Improve UI consistency and spacing throughout the app
66 lines
1.9 KiB
Swift
66 lines
1.9 KiB
Swift
import Foundation
|
|
import Observation
|
|
import SwiftUI
|
|
|
|
@Observable
|
|
class SettingsGeneralViewModel {
|
|
private let saveSettingsUseCase: PSaveSettingsUseCase
|
|
private let loadSettingsUseCase: PLoadSettingsUseCase
|
|
|
|
// MARK: - UI Settings
|
|
var selectedTheme: Theme = .system
|
|
// MARK: - Sync Settings
|
|
var autoSyncEnabled: Bool = true
|
|
var syncInterval: Int = 15
|
|
// MARK: - Reading Settings
|
|
var enableReaderMode: Bool = false
|
|
var enableTTS: Bool = false
|
|
var openExternalLinksInApp: Bool = true
|
|
var autoMarkAsRead: Bool = false
|
|
|
|
// MARK: - Messages
|
|
|
|
var errorMessage: String?
|
|
var successMessage: String?
|
|
|
|
// MARK: - Data Management (Placeholder)
|
|
|
|
init(_ factory: UseCaseFactory = DefaultUseCaseFactory.shared) {
|
|
self.saveSettingsUseCase = factory.makeSaveSettingsUseCase()
|
|
self.loadSettingsUseCase = factory.makeLoadSettingsUseCase()
|
|
}
|
|
|
|
@MainActor
|
|
func loadGeneralSettings() async {
|
|
do {
|
|
if let settings = try await loadSettingsUseCase.execute() {
|
|
enableTTS = settings.enableTTS ?? false
|
|
selectedTheme = settings.theme ?? .system
|
|
autoSyncEnabled = false
|
|
}
|
|
} catch {
|
|
errorMessage = "Error loading settings"
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
func saveGeneralSettings() async {
|
|
do {
|
|
try await saveSettingsUseCase.execute(enableTTS: enableTTS)
|
|
try await saveSettingsUseCase.execute(theme: selectedTheme)
|
|
|
|
successMessage = "Settings saved"
|
|
|
|
// send notification to apply settings to the app
|
|
NotificationCenter.default.post(name: .settingsChanged, object: nil)
|
|
} catch {
|
|
errorMessage = "Error saving settings"
|
|
}
|
|
}
|
|
|
|
func clearMessages() {
|
|
errorMessage = nil
|
|
successMessage = nil
|
|
}
|
|
}
|