- Split TabView and Sidebar logic into PhoneTabView, PadSidebarView, SidebarTab, and BookmarkState for better device adaptation - Remove old SettingsViewModel, introduce SettingsGeneralViewModel and SettingsServerViewModel for modular settings - Update BookmarksView and BookmarksViewModel for new paginated and filtered data model - Clean up and modularize settings UI (SettingsGeneralView, SettingsServerView, FontSettingsView) - Remove obsolete files (old TabView, File.swift, SettingsViewModel, etc.) - Add BookmarksPageDto and update related data flow - Various UI/UX improvements and code cleanup BREAKING: Settings and navigation structure refactored, old settings logic removed
106 lines
3.2 KiB
Swift
106 lines
3.2 KiB
Swift
import Foundation
|
|
import Observation
|
|
import SwiftUI
|
|
|
|
@Observable
|
|
class SettingsServerViewModel {
|
|
private let loginUseCase: LoginUseCase
|
|
private let logoutUseCase: LogoutUseCase
|
|
private let saveSettingsUseCase: SaveSettingsUseCase
|
|
private let loadSettingsUseCase: LoadSettingsUseCase
|
|
private let settingsRepository: SettingsRepository
|
|
|
|
// MARK: - Server Settings
|
|
var endpoint = ""
|
|
var username = ""
|
|
var password = ""
|
|
var isLoading = false
|
|
var isLoggedIn = false
|
|
// MARK: - Messages
|
|
var errorMessage: String?
|
|
var successMessage: String?
|
|
|
|
init() {
|
|
let factory = DefaultUseCaseFactory.shared
|
|
self.loginUseCase = factory.makeLoginUseCase()
|
|
self.logoutUseCase = factory.makeLogoutUseCase()
|
|
self.saveSettingsUseCase = factory.makeSaveSettingsUseCase()
|
|
self.loadSettingsUseCase = factory.makeLoadSettingsUseCase()
|
|
self.settingsRepository = SettingsRepository()
|
|
}
|
|
|
|
var isSetupMode: Bool {
|
|
!settingsRepository.hasFinishedSetup
|
|
}
|
|
|
|
@MainActor
|
|
func loadServerSettings() async {
|
|
do {
|
|
if let settings = try await loadSettingsUseCase.execute() {
|
|
endpoint = settings.endpoint ?? ""
|
|
username = settings.username ?? ""
|
|
password = settings.password ?? ""
|
|
isLoggedIn = settings.isLoggedIn
|
|
}
|
|
} catch {
|
|
errorMessage = "Fehler beim Laden der Einstellungen"
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
func saveServerSettings() async {
|
|
do {
|
|
try await saveSettingsUseCase.execute(
|
|
endpoint: endpoint,
|
|
username: username,
|
|
password: password
|
|
)
|
|
successMessage = "Server-Einstellungen gespeichert"
|
|
} catch {
|
|
errorMessage = "Fehler beim Speichern der Server-Einstellungen"
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
func login() async {
|
|
isLoading = true
|
|
errorMessage = nil
|
|
successMessage = nil
|
|
do {
|
|
let _ = try await loginUseCase.execute(username: username, password: password)
|
|
isLoggedIn = true
|
|
successMessage = "Erfolgreich angemeldet"
|
|
try await settingsRepository.saveHasFinishedSetup(true)
|
|
NotificationCenter.default.post(name: NSNotification.Name("SetupStatusChanged"), object: nil)
|
|
await DefaultUseCaseFactory.shared.refreshConfiguration()
|
|
} catch {
|
|
errorMessage = "Anmeldung fehlgeschlagen"
|
|
isLoggedIn = false
|
|
}
|
|
isLoading = false
|
|
}
|
|
|
|
@MainActor
|
|
func logout() async {
|
|
do {
|
|
try await logoutUseCase.execute()
|
|
isLoggedIn = false
|
|
successMessage = "Abgemeldet"
|
|
NotificationCenter.default.post(name: NSNotification.Name("SetupStatusChanged"), object: nil)
|
|
} catch {
|
|
errorMessage = "Fehler beim Abmelden"
|
|
}
|
|
}
|
|
|
|
func clearMessages() {
|
|
errorMessage = nil
|
|
successMessage = nil
|
|
}
|
|
|
|
var canSave: Bool {
|
|
!endpoint.isEmpty && !username.isEmpty && !password.isEmpty
|
|
}
|
|
var canLogin: Bool {
|
|
!username.isEmpty && !password.isEmpty
|
|
}
|
|
} |