59 lines
2.0 KiB
Swift
59 lines
2.0 KiB
Swift
import SwiftUI
|
|
import SwiftData
|
|
|
|
struct BookDetailView: View {
|
|
@Environment(\.modelContext) private var modelContext
|
|
@ObservedObject var viewModel: BookDetailViewModel
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
VStack(alignment: .leading, spacing: 16) {
|
|
AsyncImage(url: viewModel.book.coverImageUrl) { phase in
|
|
if let image = phase.image {
|
|
image.resizable().scaledToFill()
|
|
} else {
|
|
RoundedRectangle(cornerRadius: 16).fill(.gray.opacity(0.2))
|
|
}
|
|
}
|
|
.frame(maxWidth: .infinity)
|
|
.frame(height: 320)
|
|
.clipShape(RoundedRectangle(cornerRadius: 16))
|
|
|
|
Text(viewModel.book.title)
|
|
.font(.title.bold())
|
|
Text(viewModel.book.authors.joined(separator: ", "))
|
|
.font(.headline)
|
|
.foregroundStyle(.secondary)
|
|
|
|
if let year = viewModel.book.publishedYear {
|
|
Text("\(year)")
|
|
.font(.subheadline)
|
|
}
|
|
|
|
if !viewModel.book.categories.isEmpty {
|
|
Text(viewModel.book.categories.joined(separator: " • "))
|
|
.font(.subheadline)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
|
|
if let description = viewModel.book.description {
|
|
Text(description)
|
|
.font(.body)
|
|
}
|
|
|
|
PrimaryPillButton(
|
|
title: viewModel.isInLibrary ? String(localized: "detail.remove") : String(localized: "detail.add")
|
|
) {
|
|
viewModel.toggleLibrary(context: modelContext)
|
|
}
|
|
.padding(.top, 8)
|
|
}
|
|
.padding(20)
|
|
}
|
|
.background(Theme.background.ignoresSafeArea())
|
|
.task {
|
|
viewModel.refresh(context: modelContext)
|
|
}
|
|
}
|
|
}
|