diff options
Diffstat (limited to 'Sora/Views/Post/Details/Carousel')
| -rw-r--r-- | Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift | 50 | ||||
| -rw-r--r-- | Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift | 15 |
2 files changed, 33 insertions, 32 deletions
diff --git a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift index 9d2d95e..fc39ca3 100644 --- a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift +++ b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift @@ -1,8 +1,6 @@ import SwiftUI struct PostDetailsCarouselItemView: View { - var post: BooruPost - var manager: BooruManager var index: Int @Binding var loadingStage: BooruPostLoadingState var imageURL: (BooruPost) -> URL? @@ -15,33 +13,35 @@ struct PostDetailsCarouselItemView: View { return Color.gray #endif } + @Binding var selectedPost: (post: BooruPost?, manager: BooruManager?) var body: some View { - ZStack { - PostDetailsImageView( - url: post.previewURL, - loadingStage: $loadingStage, - manager: manager - ) { - GeometryReader { geometry in - ProgressView() - .frame(width: geometry.size.width, height: geometry.size.height) - .position(x: geometry.size.width / 2, y: geometry.size.height / 2) - .padding() + if let post = selectedPost.post { + ZStack { + PostDetailsImageView( + url: post.previewURL, + loadingStage: $loadingStage, + selectedPost: $selectedPost + ) { + GeometryReader { geometry in + ProgressView() + .frame(width: geometry.size.width, height: geometry.size.height) + .position(x: geometry.size.width / 2, y: geometry.size.height / 2) + .padding() + } } + + PostDetailsImageView( + url: imageURL(post), + loadingStage: $loadingStage, + selectedPost: $selectedPost, + finalLoadingState: .loaded + ) + .background( + loadingStage == .loaded ? systemBackgroundColor : Color.clear + ) } - - PostDetailsImageView( - url: imageURL(post), - loadingStage: $loadingStage, - manager: manager, - finalLoadingState: .loaded, - post: post - ) - .background( - loadingStage == .loaded ? systemBackgroundColor : Color.clear - ) + .tag(index) } - .tag(index) } } diff --git a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift index 88714c3..3ead408 100644 --- a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift +++ b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift @@ -1,24 +1,24 @@ import SwiftUI struct PostDetailsCarouselView: View { - @ObservedObject var manager: BooruManager @EnvironmentObject var settings: SettingsManager let posts: [BooruPost] let focusedPost: BooruPost? @Binding var loadingStage: BooruPostLoadingState @State private var currentIndex: Int private let cacheManager = ImageCacheManager.shared + @Binding var selectedPost: (post: BooruPost?, manager: BooruManager?) init( posts: [BooruPost], loadingStage: Binding<BooruPostLoadingState>, focusedPost: BooruPost? = nil, - manager: ObservedObject<BooruManager> + selectedPost: Binding<(post: BooruPost?, manager: BooruManager?)> ) { self.posts = posts self.focusedPost = focusedPost _loadingStage = loadingStage - _manager = manager + _selectedPost = selectedPost if let focused = focusedPost, let index = posts.firstIndex(where: { $0.id == focused.id }) @@ -46,18 +46,19 @@ struct PostDetailsCarouselView: View { TabView(selection: $currentIndex) { ForEach(Array(posts.enumerated()), id: \.offset) { index, post in PostDetailsCarouselItemView( - post: post, - manager: manager, index: index, loadingStage: $loadingStage, - imageURL: imageURL + imageURL: imageURL, + selectedPost: $selectedPost ) } } .onChange(of: currentIndex) { + guard let manager = selectedPost.manager else { return } + if currentIndex == posts.count - 1 { manager.loadNextPage() } - manager.selectedPost = posts[currentIndex] + selectedPost.post = posts[currentIndex] preloadNearbyImages() } |