init: init proj
This commit is contained in:
84
DDYSClient/Views/Browse/BrowseView.swift
Normal file
84
DDYSClient/Views/Browse/BrowseView.swift
Normal file
@@ -0,0 +1,84 @@
|
||||
import SwiftUI
|
||||
|
||||
struct BrowseView: View {
|
||||
let category: ContentCategory
|
||||
@Bindable var viewModel: BrowseViewModel
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if !viewModel.hasData && viewModel.error == nil {
|
||||
VStack(spacing: 0) {
|
||||
FilterBarView(filter: $viewModel.filter) {
|
||||
Task { await viewModel.applyFilter(viewModel.filter) }
|
||||
}
|
||||
.padding(.vertical, 8)
|
||||
|
||||
ProgressView()
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
}
|
||||
} else {
|
||||
ScrollView {
|
||||
VStack(spacing: 0) {
|
||||
FilterBarView(filter: $viewModel.filter) {
|
||||
Task { await viewModel.applyFilter(viewModel.filter) }
|
||||
}
|
||||
.padding(.vertical, 8)
|
||||
|
||||
if let error = viewModel.error {
|
||||
errorView(error)
|
||||
} else if viewModel.items.isEmpty {
|
||||
emptyView
|
||||
} else {
|
||||
ContentGridView(items: viewModel.items) {
|
||||
Task { await viewModel.loadMore() }
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.padding(.top, 8)
|
||||
|
||||
if viewModel.isLoadingMore {
|
||||
ProgressView()
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.navigationTitle(category.displayName)
|
||||
.navigationDestination(for: ContentItem.self) { item in
|
||||
DetailView(item: item)
|
||||
}
|
||||
.refreshable {
|
||||
await viewModel.loadContent()
|
||||
}
|
||||
.task {
|
||||
viewModel.category = category
|
||||
await viewModel.loadContentIfNeeded()
|
||||
}
|
||||
}
|
||||
|
||||
private func errorView(_ message: String) -> some View {
|
||||
VStack(spacing: 16) {
|
||||
Image(systemName: "exclamationmark.triangle")
|
||||
.font(.system(size: 48))
|
||||
.foregroundStyle(.secondary)
|
||||
Text(message)
|
||||
.foregroundStyle(.secondary)
|
||||
Button("重试") {
|
||||
Task { await viewModel.loadContent() }
|
||||
}
|
||||
}
|
||||
.frame(maxWidth: .infinity, minHeight: 300)
|
||||
}
|
||||
|
||||
private var emptyView: some View {
|
||||
VStack(spacing: 12) {
|
||||
Image(systemName: "film.stack")
|
||||
.font(.system(size: 48))
|
||||
.foregroundStyle(.secondary)
|
||||
Text("暂无内容")
|
||||
.foregroundStyle(.secondary)
|
||||
}
|
||||
.frame(maxWidth: .infinity, minHeight: 300)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user