diff options
Diffstat (limited to 'Jel/Views')
-rw-r--r-- | Jel/Views/Library/Item/ItemGenresView.swift | 19 | ||||
-rw-r--r-- | Jel/Views/Library/Item/ItemMediaView.swift | 24 | ||||
-rw-r--r-- | Jel/Views/Library/LibraryDetailView.swift | 9 |
3 files changed, 38 insertions, 14 deletions
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: "<br>") ?? [], 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 { diff --git a/Jel/Views/Library/LibraryDetailView.swift b/Jel/Views/Library/LibraryDetailView.swift index b645a8a..8c74140 100644 --- a/Jel/Views/Library/LibraryDetailView.swift +++ b/Jel/Views/Library/LibraryDetailView.swift @@ -13,9 +13,9 @@ struct LibraryDetailView: View { @StateObject var authState: AuthStateController = AuthStateController.shared @State var library: BaseItemDto + @State var items: [BaseItemDto]? = [] var filter: (_ items: [BaseItemDto]) -> [BaseItemDto] - @State var items: [BaseItemDto]? = [] @State var loading: Bool = true @@ -73,6 +73,13 @@ struct LibraryDetailView: View { } } .onAppear { + if items?.count ?? 0 > 0 { + items = self.filter(items ?? []) + items?.sort(by: {$0.name?.lowercased() ?? "" < $1.name?.lowercased() ?? ""}) + loading = false + return + } + Task { let params = Paths.GetItemsParameters( userID: authState.userId, |