summaryrefslogtreecommitdiff
path: root/Sora/Views/Post
diff options
context:
space:
mode:
Diffstat (limited to 'Sora/Views/Post')
-rw-r--r--Sora/Views/Post/PostDetailsView.swift142
-rw-r--r--Sora/Views/Post/PostGridBookmarkButtonView.swift49
-rw-r--r--Sora/Views/Post/PostGridView.swift171
-rw-r--r--Sora/Views/Post/PostView.swift67
4 files changed, 219 insertions, 210 deletions
diff --git a/Sora/Views/Post/PostDetailsView.swift b/Sora/Views/Post/PostDetailsView.swift
index 0e2566d..133fa34 100644
--- a/Sora/Views/Post/PostDetailsView.swift
+++ b/Sora/Views/Post/PostDetailsView.swift
@@ -1,83 +1,83 @@
import SwiftUI
struct PostDetailsView: View {
- @EnvironmentObject var settings: Settings
- let post: BooruPost
- @State var loadingStage: PostLoadingState = .loadingPreview
- private var imageURL: URL? {
- switch settings.detailViewType {
- case .preview:
- post.previewURL
- case .sample:
- post.sampleURL
- case .original:
- post.fileURL
- }
+ @EnvironmentObject var settings: Settings
+ let post: BooruPost
+ @State var loadingStage: PostLoadingState = .loadingPreview
+ private var imageURL: URL? {
+ switch settings.detailViewType {
+ case .preview:
+ post.previewURL
+ case .sample:
+ post.sampleURL
+ case .original:
+ post.fileURL
}
+ }
- var body: some View {
- VStack(spacing: 0) {
- AsyncImageWithPreview(
- url: imageURL,
- loadingStage: $loadingStage,
- finalLoadingState: .loaded,
- postURL: URL(string: "https://yande.re/post/show/\(post.id)")!
- ) {
- AsyncImageWithPreview(
- url: post.previewURL,
- loadingStage: $loadingStage
- )
- .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
- .id(post.previewURL)
- }
- .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
- .id(imageURL)
- .padding(0)
- .zIndex(0)
+ var body: some View {
+ VStack(spacing: 0) {
+ AsyncImageWithPreview(
+ url: imageURL,
+ loadingStage: $loadingStage,
+ finalLoadingState: .loaded,
+ postURL: URL(string: "https://yande.re/post/show/\(post.id)")!
+ ) {
+ AsyncImageWithPreview(
+ url: post.previewURL,
+ loadingStage: $loadingStage
+ )
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
+ .id(post.previewURL)
+ }
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
+ .id(imageURL)
+ .padding(0)
+ .zIndex(0)
- VStack(spacing: 5) {
- HStack {
- Text(post.tags.joined(separator: ", "))
- }
- .frame(maxWidth: .infinity, alignment: .leading)
+ VStack(spacing: 5) {
+ HStack {
+ Text(post.tags.joined(separator: ", "))
+ }
+ .frame(maxWidth: .infinity, alignment: .leading)
- HStack {
- Text(
- post.createdAt.formatted()
- )
- .frame(maxWidth: .infinity, alignment: .leading)
+ HStack {
+ Text(
+ post.createdAt.formatted()
+ )
+ .frame(maxWidth: .infinity, alignment: .leading)
- Group {
- switch loadingStage {
- case .loadingPreview:
- Text("Loading preview …")
- case .loadingFile:
- Text("Loading \(settings.detailViewType.rawValue) …")
- case .loaded:
- EmptyView()
- }
- }
- .padding(.trailing, 5)
- }
- .frame(maxWidth: .infinity, alignment: .leading)
- .foregroundStyle(.secondary)
+ Group {
+ switch loadingStage {
+ case .loadingPreview:
+ Text("Loading preview …")
+ case .loadingFile:
+ Text("Loading \(settings.detailViewType.rawValue) …")
+ case .loaded:
+ EmptyView()
}
- .padding(.horizontal, 10)
- .padding(.vertical, 10 / 1.33)
- .textSelection(.enabled)
- .font(.footnote)
- #if os(iOS)
- .background(.ultraThinMaterial)
- #else
- .background(.opacity(0.1))
- #endif
- .zIndex(1)
+ }
+ .padding(.trailing, 5)
}
- .navigationTitle("Details")
- #if os(iOS)
- .navigationBarTitleDisplayMode(.inline)
- .toolbarBackground(.visible, for: .navigationBar)
- .toolbarBackground(.ultraThinMaterial, for: .navigationBar)
- #endif
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .foregroundStyle(.secondary)
+ }
+ .padding(.horizontal, 10)
+ .padding(.vertical, 10 / 1.33)
+ .textSelection(.enabled)
+ .font(.footnote)
+ #if os(iOS)
+ .background(.ultraThinMaterial)
+ #else
+ .background(.opacity(0.1))
+ #endif
+ .zIndex(1)
}
+ .navigationTitle("Details")
+ #if os(iOS)
+ .navigationBarTitleDisplayMode(.inline)
+ .toolbarBackground(.visible, for: .navigationBar)
+ .toolbarBackground(.ultraThinMaterial, for: .navigationBar)
+ #endif
+ }
}
diff --git a/Sora/Views/Post/PostGridBookmarkButtonView.swift b/Sora/Views/Post/PostGridBookmarkButtonView.swift
index 90336f9..f23482f 100644
--- a/Sora/Views/Post/PostGridBookmarkButtonView.swift
+++ b/Sora/Views/Post/PostGridBookmarkButtonView.swift
@@ -1,28 +1,33 @@
import SwiftUI
struct PostGridBookmarkButtonView: View {
- @EnvironmentObject private var manager: BooruManager
- @EnvironmentObject private var settings: Settings
+ @EnvironmentObject private var manager: BooruManager
+ @EnvironmentObject private var settings: Settings
- var contained: Bool {
- settings.bookmarks
- .contains(where: { $0.tags == manager.tags.map { $0.lowercased() } && $0.provider == manager.provider ?? settings.preferredBooru })
- }
+ var contained: Bool {
+ settings.bookmarks
+ .contains(where: {
+ $0.tags == manager.tags.map { $0.lowercased() }
+ && $0.provider == manager.provider ?? settings.preferredBooru
+ })
+ }
- var body: some View {
- Button(
- action: {
- contained ? settings
- .removeBookmark(withTags: manager.tags) : settings
- .addBookmark(
- provider: manager.provider ?? settings.preferredBooru,
- tags: manager.tags
- )
- }) {
- Label("Bookmark", systemImage:
- contained ?
- "bookmark.fill" :
- "bookmark")
- }
- }
+ var body: some View {
+ Button(
+ action: {
+ contained
+ ? settings
+ .removeBookmark(withTags: manager.tags)
+ : settings
+ .addBookmark(
+ provider: manager.provider ?? settings.preferredBooru,
+ tags: manager.tags
+ )
+ }) {
+ Label(
+ "Bookmark",
+ systemImage:
+ contained ? "bookmark.fill" : "bookmark")
+ }
+ }
}
diff --git a/Sora/Views/Post/PostGridView.swift b/Sora/Views/Post/PostGridView.swift
index 89c762a..842d0a6 100644
--- a/Sora/Views/Post/PostGridView.swift
+++ b/Sora/Views/Post/PostGridView.swift
@@ -2,98 +2,99 @@ import SwiftUI
import WaterfallGrid
struct PostGridView: View {
- @EnvironmentObject var settings: Settings
- @ObservedObject var manager: BooruManager
- @Environment(\.isSearching) private var isSearching
+ @EnvironmentObject var settings: Settings
+ @ObservedObject var manager: BooruManager
+ @Environment(\.isSearching) private var isSearching
- var filteredPosts: [BooruPost] {
- (settings.showNSFWPosts ? manager.posts : manager.posts.filter { $0.rating == "s" || $0.rating == "q" })
- .sorted(by: { $0.id > $1.id })
- }
+ var filteredPosts: [BooruPost] {
+ (settings.showNSFWPosts
+ ? manager.posts : manager.posts.filter { $0.rating == "s" || $0.rating == "q" })
+ .sorted(by: { $0.id > $1.id })
+ }
- var body: some View {
- ScrollViewReader { _ in
- ScrollView {
- if filteredPosts.isEmpty {
- ProgressView()
- .padding()
- }
+ var body: some View {
+ ScrollViewReader { _ in
+ ScrollView {
+ if filteredPosts.isEmpty {
+ ProgressView()
+ .padding()
+ }
- WaterfallGrid(filteredPosts, id: \.id) { post in
- Group {
- #if os(macOS)
- Button {
- manager.selectedPost = post
- } label: {
- PostView(
- post: post,
- manager: manager,
- posts: filteredPosts
- )
- }
- .buttonStyle(PlainButtonStyle())
- #else
- NavigationLink(value: post) {
- PostView(
- post: post,
- manager: manager,
- posts: filteredPosts
- )
- }
- #endif
- }
- }
- .gridStyle(columns: settings.columns)
- }
- .searchable(text: $manager.searchText, prompt: "Tags")
- .searchSuggestions {
- if settings.searchSuggestions {
- SearchSuggestionsView(
- tags: manager.allTags,
- searchText: $manager.searchText
- )
- }
- }
- .onSubmit(of: .search, manager.performSearch)
- .navigationDestination(for: BooruPost.self) { post in
- PostDetailsView(post: post)
- }
- .onChange(of: manager.searchText) { _, _ in
- if manager.searchText.isEmpty, !isSearching {
- Task {
- manager.performSearch()
- }
- }
+ WaterfallGrid(filteredPosts, id: \.id) { post in
+ Group {
+ #if os(macOS)
+ Button {
+ manager.selectedPost = post
+ } label: {
+ PostView(
+ post: post,
+ manager: manager,
+ posts: filteredPosts
+ )
+ }
+ .buttonStyle(PlainButtonStyle())
+ #else
+ NavigationLink(value: post) {
+ PostView(
+ post: post,
+ manager: manager,
+ posts: filteredPosts
+ )
+ }
+ #endif
+ }
+ }
+ .gridStyle(columns: settings.columns)
+ }
+ .searchable(text: $manager.searchText, prompt: "Tags")
+ .searchSuggestions {
+ if settings.searchSuggestions {
+ SearchSuggestionsView(
+ tags: manager.allTags,
+ searchText: $manager.searchText
+ )
+ }
+ }
+ .onSubmit(of: .search, manager.performSearch)
+ .navigationDestination(for: BooruPost.self) { post in
+ PostDetailsView(post: post)
+ }
+ .onChange(of: manager.searchText) { _, _ in
+ if manager.searchText.isEmpty, !isSearching {
+ Task {
+ manager.performSearch()
+ }
+ }
+ }
+ .toolbar {
+ #if os(macOS)
+ ToolbarItem {
+ Button(action: {
+ Task {
+ await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
+ }
+ }) {
+ Label("Refresh", systemImage: "arrow.clockwise")
}
- .toolbar {
- #if os(macOS)
- ToolbarItem {
- Button(action: {
- Task {
- await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
- }
- }) {
- Label("Refresh", systemImage: "arrow.clockwise")
- }
- }
- #endif
+ }
+ #endif
- if !manager.tags.isEmpty {
- #if os(macOS)
- ToolbarItem {
- PostGridBookmarkButtonView()
- }
- #else
- ToolbarItem(placement: .bottomBar) {
- PostGridBookmarkButtonView()
- }
- #endif
- }
+ if !manager.tags.isEmpty {
+ #if os(macOS)
+ ToolbarItem {
+ PostGridBookmarkButtonView()
}
- .navigationTitle("Posts")
- .refreshable {
- await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
+ #else
+ ToolbarItem(placement: .bottomBar) {
+ PostGridBookmarkButtonView()
}
+ #endif
}
+ }
+ .navigationTitle("Posts")
+ .refreshable {
+ await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
+ }
}
+ }
}
diff --git a/Sora/Views/Post/PostView.swift b/Sora/Views/Post/PostView.swift
index ce46152..9b92f4f 100644
--- a/Sora/Views/Post/PostView.swift
+++ b/Sora/Views/Post/PostView.swift
@@ -1,40 +1,43 @@
import SwiftUI
struct PostView: View {
- @EnvironmentObject var settings: Settings
- let post: BooruPost
- @ObservedObject var manager: BooruManager
- let posts: [BooruPost]
- private var thumbnailURL: URL? {
- switch settings.thumbnailType {
- case .preview:
- post.previewURL
- case .sample:
- post.sampleURL
- case .original:
- post.fileURL
- }
+ @EnvironmentObject var settings: Settings
+ let post: BooruPost
+ @ObservedObject var manager: BooruManager
+ let posts: [BooruPost]
+ private var thumbnailURL: URL? {
+ switch settings.thumbnailType {
+ case .preview:
+ post.previewURL
+ case .sample:
+ post.sampleURL
+ case .original:
+ post.fileURL
}
+ }
- var body: some View {
- VStack {
- AsyncImage(url: thumbnailURL) { image in
- image
- .resizable()
- .aspectRatio(contentMode: .fit)
- .onScrollVisibilityChange { visible in
- if post == posts.last, !manager.endOfData, visible {
- Task {
- manager.loadNextPage()
- }
- }
- }
- .blur(radius: settings.blurNSFWThumbnails ? (post.rating != "s" && post.rating != "q") ? 10 : 0 : 0)
- .animation(.default, value: settings.blurNSFWThumbnails)
- } placeholder: {
- ProgressView()
- .padding()
+ var body: some View {
+ VStack {
+ AsyncImage(url: thumbnailURL) { image in
+ image
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .onScrollVisibilityChange { visible in
+ if post == posts.last, !manager.endOfData, visible {
+ Task {
+ manager.loadNextPage()
+ }
}
- }
+ }
+ .blur(
+ radius: settings.blurNSFWThumbnails
+ ? (post.rating != "s" && post.rating != "q") ? 10 : 0 : 0
+ )
+ .animation(.default, value: settings.blurNSFWThumbnails)
+ } placeholder: {
+ ProgressView()
+ .padding()
+ }
}
+ }
}