Files
ABS-Client/LibraryView.swift
2026-05-14 19:24:52 +02:00

65 lines
2.4 KiB
Swift

import SwiftUI
struct LibraryView: View {
@ObservedObject var authManager: AuthManager
@State private var books: [AudiobookItem] = []
@State private var isLoading = true
@State private var errorMessage = ""
var body: some View {
NavigationView {
Group {
if isLoading {
ProgressView("Lädt Bibliothek...")
} else if !errorMessage.isEmpty {
Text(errorMessage).foregroundColor(.red)
} else {
ScrollView {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 150))], spacing: 16) {
ForEach(books) { book in
BookCard(book: book, authManager: authManager)
}
}
.padding()
}
}
}
.navigationTitle("Meine Bibliothek")
.toolbar {
Button("Logout") {
authManager.logout()
}
}
}
.onAppear { loadBooks() }
}
func loadBooks() {
guard let serverURL = authManager.serverURL,
let token = authManager.token else { return }
// Erst Libraries laden, dann Bücher
let url = URL(string: "\(serverURL)/api/libraries")!
var request = URLRequest(url: url)
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
URLSession.shared.dataTask(with: request) { data, _, error in
guard let data = data else { return }
if let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
let libraries = json["libraries"] as? [[String: Any]],
let firstLib = libraries.first,
let libId = firstLib["id"] as? String {
loadBooksFromLibrary(libId: libId, serverURL: serverURL, token: token)
}
}.resume()
}
func loadBooksFromLibrary(libId: String, serverURL: String, token: String) {
let url = URL(string: "\(serverURL)/api/libraries/\(libId)/items")!
var request = URLRequest(url: url)
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
URLSession.shared.dataTask(with: request) { data, _, _ in
guard let data = data else { return }
if let json = try? JSON