From e807d063195b1299dcaeb6e7213d7e3d300a3112 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Sun, 7 Jan 2024 21:21:36 -0500 Subject: Fix ItemMediaView NavigationTitle + Implement Genre Filtering --- Jel/Views/Library/Item/ItemGenresView.swift | 19 +++++++++++++++---- Jel/Views/Library/Item/ItemMediaView.swift | 24 +++++++++++++++--------- 2 files changed, 30 insertions(+), 13 deletions(-) (limited to 'Jel/Views/Library/Item') diff --git a/Jel/Views/Library/Item/ItemGenresView.swift b/Jel/Views/Library/Item/ItemGenresView.swift index 25b86e4..5bfccb0 100644 --- a/Jel/Views/Library/Item/ItemGenresView.swift +++ b/Jel/Views/Library/Item/ItemGenresView.swift @@ -14,7 +14,7 @@ struct ItemGenresView: View { @StateObject var authState: AuthStateController = AuthStateController.shared var item: BaseItemDto - @State var library: BaseItemDto = BaseItemDto() + @State var libraryItems: [BaseItemDto]? = [] var body: some View { VStack(alignment: .leading) { @@ -25,7 +25,7 @@ struct ItemGenresView: View { HStack { ForEach(item.genres ?? [], id: \.self) {genre in NavigationLink { - LibraryDetailView(library: library) {items in + LibraryDetailView(library: BaseItemDto(name: genre), items: libraryItems) {items in var matchingItems: [BaseItemDto] = [] for item in items { @@ -47,10 +47,21 @@ struct ItemGenresView: View { } .onAppear { Task { - let request = Paths.getItem(userID: authState.userId ?? "", itemID: item.parentID ?? "") + let parameters = Paths.GetItemsParameters( + userID: authState.userId ?? "", + isRecursive: true, + fields: [.primaryImageAspectRatio, + .genres, + .taglines, + .overview, + .parentID], + includeItemTypes: [.movie, .series], + genres: item.genres ?? [] + ) + let request = Paths.getItems(parameters: parameters) do { let res = try await jellyfinClient.send(request) - library = res.value + libraryItems = res.value.items ?? [] } catch { } } diff --git a/Jel/Views/Library/Item/ItemMediaView.swift b/Jel/Views/Library/Item/ItemMediaView.swift index dfb6c7a..4b8f863 100644 --- a/Jel/Views/Library/Item/ItemMediaView.swift +++ b/Jel/Views/Library/Item/ItemMediaView.swift @@ -7,6 +7,7 @@ import SwiftUI import JellyfinKit +import VisibilityTrackingScrollView struct ItemMediaView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController @@ -15,7 +16,7 @@ struct ItemMediaView: View { @State var item: BaseItemDto @State var loading: Bool = true - @State var navigationTitle: String = "" + @State var pageScrolled: Bool = false var body: some View { GeometryReader {geo in @@ -23,7 +24,7 @@ struct ItemMediaView: View { ProgressView() .progressViewStyle(.circular) } else { - ScrollView { + ScrollView() { ItemHeaderView(item: item) .padding(.bottom) .background { @@ -31,11 +32,8 @@ struct ItemMediaView: View { EmptyView() .onChange(of: geo.frame(in: .global).minY) { let minY = geo.frame(in: .global).minY - if minY < 0 { - navigationTitle = item.name ?? "" - } else { - navigationTitle = "" - } + + pageScrolled = minY < 0 } } } @@ -49,6 +47,8 @@ struct ItemMediaView: View { ForEach(item.overview?.components(separatedBy: "
") ?? [], id: \.self) {overview in Text(overview) } + + ItemGenresView(item: item) } .if(max(geo.safeAreaInsets.leading, geo.safeAreaInsets.trailing) > 0) {view in view @@ -62,9 +62,15 @@ struct ItemMediaView: View { .ignoresSafeArea() } } - .toolbarRole(.editor) .navigationBarTitleDisplayMode(.inline) - .navigationTitle(navigationTitle) + .navigationTitle(item.name ?? "Untitled") + .toolbarRole(.editor) + .toolbar { + ToolbarItem(placement: .principal) { + Text(pageScrolled ? item.name ?? "Untitled" : "") + .bold() + } + } .scrollIndicators(.hidden) .onAppear { Task { -- cgit v1.2.3