- API-Klasse mit allen CRUD-Operationen für Bookmarks - Login/Authentifizierung mit Bearer Token - Bookmarks abrufen (Liste und Details) - Artikel-Inhalt abrufen - DTO-Strukturen in separate Dateien aufgeteilt - UserDto für Authentifizierung - BookmarkDto für Bookmark-Listen - BookmarkDetailDto mit vollständigen Metadaten - MVVM-Architektur mit @Observable - SettingsViewModel für Anmeldung - BookmarksViewModel für Bookmark-Verwaltung - SwiftUI Views mit modernem Design - SettingsView mit Eingabefeldern und Validierung - BookmarksView mit Pull-to-Refresh und Leerzustand - MainTabView als Navigation - Use Case Pattern implementiert - LoginUseCase für Authentifizierung - GetBookmarksUseCase für Datenabfrage - DefaultUseCaseFactory für Dependency Injection - Fehlerbehandlung und Loading States - Protocol-basierte Architektur für bessere Testbarkeit
38 lines
903 B
Swift
38 lines
903 B
Swift
import Foundation
|
|
|
|
@Observable
|
|
class SettingsViewModel {
|
|
|
|
enum State {
|
|
case `default`, error, success
|
|
}
|
|
|
|
var username: String = "admin"
|
|
var password: String = "Diggah123"
|
|
var endpoint: String = ""
|
|
var isLoading: Bool = false
|
|
var state: State = .default
|
|
var showAlert: Bool = false
|
|
|
|
private let loginUseCase = DefaultUseCaseFactory.shared.makeLoginUseCase()
|
|
|
|
var isLoginDisabled: Bool {
|
|
username.isEmpty || password.isEmpty || isLoading
|
|
}
|
|
|
|
@MainActor
|
|
func login() async {
|
|
isLoading = true
|
|
|
|
do {
|
|
let userResult = try await loginUseCase.execute(username: username, password: password)
|
|
state = userResult.token.isEmpty ? .error : .success
|
|
isLoading = false
|
|
} catch {
|
|
state = .error
|
|
isLoading = false
|
|
}
|
|
|
|
}
|
|
}
|