summaryrefslogtreecommitdiff
path: root/Sora/Views/Post/Details
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-08-28 15:14:10 -0700
committerFuwn <[email protected]>2025-08-28 15:14:10 -0700
commita741e13d18a0927e984dfb6eb3d760f49afe3896 (patch)
tree34ba76fddeb26c80d902e7c1790a7fd192a52ff3 /Sora/Views/Post/Details
parentfeat: Development commit (diff)
downloadsora-testing-a741e13d18a0927e984dfb6eb3d760f49afe3896.tar.xz
sora-testing-a741e13d18a0927e984dfb6eb3d760f49afe3896.zip
feat: Development commit
Diffstat (limited to 'Sora/Views/Post/Details')
-rw-r--r--Sora/Views/Post/Details/PostDetailsTagsView.swift33
-rw-r--r--Sora/Views/Post/Details/PostDetailsView.swift43
2 files changed, 54 insertions, 22 deletions
diff --git a/Sora/Views/Post/Details/PostDetailsTagsView.swift b/Sora/Views/Post/Details/PostDetailsTagsView.swift
index bb69792..ca1dcae 100644
--- a/Sora/Views/Post/Details/PostDetailsTagsView.swift
+++ b/Sora/Views/Post/Details/PostDetailsTagsView.swift
@@ -4,16 +4,17 @@ struct PostDetailsTagsView: View {
@EnvironmentObject var manager: BooruManager
@EnvironmentObject var settings: SettingsManager
@Binding var isPresented: Bool
+ @Binding var navigationPath: NavigationPath
var tags: [String]
var body: some View {
List {
ForEach(tags, id: \.self) { tag in
Button(action: {
- Task { @MainActor in
- manager.searchText = tag
+ isPresented = false
- search()
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
+ navigateToTagInMainStack(tag)
}
}) {
Text(tag)
@@ -43,17 +44,41 @@ struct PostDetailsTagsView: View {
.buttonStyle(.plain)
#endif
}
+ .navigationTitle("Tags")
}
private func search() {
manager.selectedPost = nil
isPresented = false
}
+
+ private func navigateToTagInMainStack(_ tag: String) {
+ navigationPath.append(tag)
+
+ let query = BooruSearchQuery(
+ provider: settings.preferredBooru,
+ tags: [tag]
+ )
+
+ settings.appendToSearchHistory(query)
+
+ if manager.searchHistory.last?.tags != [tag] {
+ if manager.historyIndex < manager.searchHistory.count - 1 {
+ manager.searchHistory = Array(manager.searchHistory[0...manager.historyIndex])
+ }
+
+ manager.searchHistory.append(query)
+
+ manager.historyIndex = manager.searchHistory.count - 1
+ }
+ }
}
#Preview {
PostDetailsTagsView(
- isPresented: .constant(true), tags: ["hololive", "absurdres", "nekomimi"]
+ isPresented: .constant(true),
+ navigationPath: .constant(NavigationPath()),
+ tags: ["hololive", "absurdres", "nekomimi"]
)
.environmentObject(BooruManager(.danbooru))
.environmentObject(SettingsManager())
diff --git a/Sora/Views/Post/Details/PostDetailsView.swift b/Sora/Views/Post/Details/PostDetailsView.swift
index 8d62f67..8051cf2 100644
--- a/Sora/Views/Post/Details/PostDetailsView.swift
+++ b/Sora/Views/Post/Details/PostDetailsView.swift
@@ -4,7 +4,11 @@ struct PostDetailsView: View {
@EnvironmentObject var manager: BooruManager
@EnvironmentObject var settings: SettingsManager
let post: BooruPost
+ @Binding var navigationPath: NavigationPath
@State private var loadingStage: BooruPostLoadingState = .loadingPreview
+ @State private var isTagsSheetPresented = false
+ let posts: [BooruPost]?
+
private var imageURL: URL? {
switch settings.detailViewQuality {
case .preview:
@@ -17,11 +21,17 @@ struct PostDetailsView: View {
post.fileURL
}
}
- @State private var isTagsSheetPresented = false
+
+ init(post: BooruPost, navigationPath: Binding<NavigationPath>, posts: [BooruPost]? = nil) {
+ self.post = post
+ self._navigationPath = navigationPath
+ self.posts = posts
+ }
var filteredPosts: [BooruPost] {
- manager.posts
- .filter { settings.displayRatings.contains($0.rating) }
+ let sourcePosts = posts ?? manager.posts
+
+ return sourcePosts.filter { settings.displayRatings.contains($0.rating) }
}
var body: some View {
@@ -110,14 +120,7 @@ struct PostDetailsView: View {
}
#endif
}
- .sheet(
- isPresented: $isTagsSheetPresented,
- onDismiss: {
- Task(priority: .userInitiated) {
- await manager.performSearch(settings: settings)
- }
- }
- ) {
+ .sheet(isPresented: $isTagsSheetPresented) {
if #available(macOS 15.0, *) {
tagsSheetContent()
#if os(macOS)
@@ -131,12 +134,16 @@ struct PostDetailsView: View {
@ViewBuilder
private func tagsSheetContent() -> some View {
- PostDetailsTagsView(isPresented: $isTagsSheetPresented, tags: post.tags)
- #if os(macOS)
- .frame(
- minHeight: (NSScreen.main?.frame.height ?? 1_080) / 2,
- maxHeight: .infinity
- )
- #endif
+ PostDetailsTagsView(
+ isPresented: $isTagsSheetPresented,
+ navigationPath: $navigationPath,
+ tags: post.tags
+ )
+ #if os(macOS)
+ .frame(
+ minHeight: (NSScreen.main?.frame.height ?? 1_080) / 2,
+ maxHeight: .infinity
+ )
+ #endif
}
}