65 lines
2.4 KiB
Swift
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
|