diff options
Diffstat (limited to 'Sora/Views/Post/Details')
| -rw-r--r-- | Sora/Views/Post/Details/PostDetailsTagsView.swift | 33 | ||||
| -rw-r--r-- | Sora/Views/Post/Details/PostDetailsView.swift | 43 |
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 } } |