diff options
Diffstat (limited to 'Sora/Views/Post/Details')
5 files changed, 29 insertions, 15 deletions
diff --git a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift index 5aaa209..9d2d95e 100644 --- a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift +++ b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift @@ -2,6 +2,7 @@ import SwiftUI struct PostDetailsCarouselItemView: View { var post: BooruPost + var manager: BooruManager var index: Int @Binding var loadingStage: BooruPostLoadingState var imageURL: (BooruPost) -> URL? @@ -19,7 +20,8 @@ struct PostDetailsCarouselItemView: View { ZStack { PostDetailsImageView( url: post.previewURL, - loadingStage: $loadingStage + loadingStage: $loadingStage, + manager: manager ) { GeometryReader { geometry in ProgressView() @@ -32,6 +34,7 @@ struct PostDetailsCarouselItemView: View { PostDetailsImageView( url: imageURL(post), loadingStage: $loadingStage, + manager: manager, finalLoadingState: .loaded, post: post ) diff --git a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift index 4452b22..88714c3 100644 --- a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift +++ b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift @@ -1,7 +1,7 @@ import SwiftUI struct PostDetailsCarouselView: View { - @EnvironmentObject var manager: BooruManager + @ObservedObject var manager: BooruManager @EnvironmentObject var settings: SettingsManager let posts: [BooruPost] let focusedPost: BooruPost? @@ -12,11 +12,13 @@ struct PostDetailsCarouselView: View { init( posts: [BooruPost], loadingStage: Binding<BooruPostLoadingState>, - focusedPost: BooruPost? = nil + focusedPost: BooruPost? = nil, + manager: ObservedObject<BooruManager> ) { self.posts = posts self.focusedPost = focusedPost _loadingStage = loadingStage + _manager = manager if let focused = focusedPost, let index = posts.firstIndex(where: { $0.id == focused.id }) @@ -45,6 +47,7 @@ struct PostDetailsCarouselView: View { ForEach(Array(posts.enumerated()), id: \.offset) { index, post in PostDetailsCarouselItemView( post: post, + manager: manager, index: index, loadingStage: $loadingStage, imageURL: imageURL diff --git a/Sora/Views/Post/Details/PostDetailsImageView.swift b/Sora/Views/Post/Details/PostDetailsImageView.swift index 483d435..7d818f2 100644 --- a/Sora/Views/Post/Details/PostDetailsImageView.swift +++ b/Sora/Views/Post/Details/PostDetailsImageView.swift @@ -4,7 +4,7 @@ import UserNotifications struct PostDetailsImageView<Placeholder: View>: View { @EnvironmentObject var settings: SettingsManager - @EnvironmentObject var manager: BooruManager + @ObservedObject var manager: BooruManager var url: URL? @Binding var loadingState: BooruPostLoadingState var finalLoadingState: BooruPostLoadingState @@ -130,6 +130,7 @@ struct PostDetailsImageView<Placeholder: View>: View { init( url: URL?, loadingStage: Binding<BooruPostLoadingState>, + manager: BooruManager, finalLoadingState: BooruPostLoadingState = .loadingFile, post: BooruPost? = nil, @ViewBuilder placeholder: @escaping () -> Placeholder = { @@ -146,6 +147,7 @@ struct PostDetailsImageView<Placeholder: View>: View { self.finalLoadingState = finalLoadingState self.placeholder = placeholder self.post = post + self.manager = manager } private func postURL(for id: String) -> URL { diff --git a/Sora/Views/Post/Details/PostDetailsTagsView.swift b/Sora/Views/Post/Details/PostDetailsTagsView.swift index a9ab6a4..107c9f3 100644 --- a/Sora/Views/Post/Details/PostDetailsTagsView.swift +++ b/Sora/Views/Post/Details/PostDetailsTagsView.swift @@ -1,16 +1,18 @@ import SwiftUI struct PostDetailsTagsView: View { - @EnvironmentObject var manager: BooruManager + @ObservedObject var manager: BooruManager @EnvironmentObject var settings: SettingsManager @Binding var isPresented: Bool var tags: [String] + @Binding var selectedPost: (post: BooruPost?, manager: BooruManager?) var body: some View { List { ForEach(tags, id: \.self) { tag in Button(action: { manager.searchText = tag + selectedPost = (nil, nil) search() }) { @@ -19,6 +21,7 @@ struct PostDetailsTagsView: View { .contextMenu { Button(action: { manager.searchText += " \(tag)" + selectedPost = (nil, nil) search() }) { @@ -45,9 +48,3 @@ struct PostDetailsTagsView: View { isPresented.toggle() } } - -#Preview { - PostDetailsTagsView( - isPresented: .constant(true), tags: ["hololive", "absurdres", "nekomimi"] - ) -} diff --git a/Sora/Views/Post/Details/PostDetailsView.swift b/Sora/Views/Post/Details/PostDetailsView.swift index 3b6ef49..c75f022 100644 --- a/Sora/Views/Post/Details/PostDetailsView.swift +++ b/Sora/Views/Post/Details/PostDetailsView.swift @@ -3,7 +3,7 @@ import SwiftUI struct PostDetailsView: View { @EnvironmentObject var settings: SettingsManager let post: BooruPost - let manager: BooruManager + @ObservedObject var manager: BooruManager @State private var loadingStage: BooruPostLoadingState = .loadingPreview private var imageURL: URL? { switch settings.detailViewQuality { @@ -18,6 +18,7 @@ struct PostDetailsView: View { } } @State private var isTagsSheetPresented = false + @Binding var selectedPost: (post: BooruPost?, manager: BooruManager?) var filteredPosts: [BooruPost] { manager.posts @@ -30,12 +31,14 @@ struct PostDetailsView: View { PostDetailsImageView( url: imageURL, loadingStage: $loadingStage, + manager: manager, finalLoadingState: .loaded, post: post ) { PostDetailsImageView( url: post.previewURL, - loadingStage: $loadingStage + loadingStage: $loadingStage, + manager: manager ) .id(post.previewURL) } @@ -44,7 +47,8 @@ struct PostDetailsView: View { PostDetailsCarouselView( posts: filteredPosts, loadingStage: $loadingStage, - focusedPost: post + focusedPost: post, + manager: _manager ) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) #endif @@ -118,7 +122,12 @@ struct PostDetailsView: View { #endif } .sheet(isPresented: $isTagsSheetPresented) { - PostDetailsTagsView(isPresented: $isTagsSheetPresented, tags: post.tags) + PostDetailsTagsView( + manager: manager, + isPresented: $isTagsSheetPresented, + tags: post.tags, + selectedPost: $selectedPost + ) .frame(minHeight: 250) } } |