From 3f74421e5b33e9e284197ef8d8f5e27fc1dc2a22 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Sun, 7 Jan 2024 19:20:56 -0500 Subject: Add GenreView --- Jel/Views/Library/Item/ItemGenresView.swift | 64 +++++++++++++++++++++++++++++ Jel/Views/Library/Item/ItemHeaderView.swift | 2 +- Jel/Views/Library/Item/ItemInfoView.swift | 2 +- Jel/Views/Library/LibraryDetailView.swift | 9 +++- 4 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 Jel/Views/Library/Item/ItemGenresView.swift (limited to 'Jel/Views/Library') diff --git a/Jel/Views/Library/Item/ItemGenresView.swift b/Jel/Views/Library/Item/ItemGenresView.swift new file mode 100644 index 0000000..25b86e4 --- /dev/null +++ b/Jel/Views/Library/Item/ItemGenresView.swift @@ -0,0 +1,64 @@ +// +// ItemGenresView.swift +// Jel +// +// Created by zerocool on 1/7/24. +// + +import SwiftUI +import JellyfinKit + +struct ItemGenresView: View { + @EnvironmentObject var jellyfinClient: JellyfinClientController + + @StateObject var authState: AuthStateController = AuthStateController.shared + + var item: BaseItemDto + @State var library: BaseItemDto = BaseItemDto() + + var body: some View { + VStack(alignment: .leading) { + Text("Genres") + .font(.title2) + + ScrollView(.horizontal) { + HStack { + ForEach(item.genres ?? [], id: \.self) {genre in + NavigationLink { + LibraryDetailView(library: library) {items in + var matchingItems: [BaseItemDto] = [] + + for item in items { + if (item.genres ?? []).contains(genre) { + matchingItems.append(item) + } + } + return matchingItems + } + .navigationTitle(genre) + } label: { + Text(genre) + } + .buttonStyle(.bordered) + .clipShape(.capsule) + } + } + } + } + .onAppear { + Task { + let request = Paths.getItem(userID: authState.userId ?? "", itemID: item.parentID ?? "") + do { + let res = try await jellyfinClient.send(request) + library = res.value + } catch { + } + } + + } + } +} + +//#Preview { +// ItemGenresView() +//} diff --git a/Jel/Views/Library/Item/ItemHeaderView.swift b/Jel/Views/Library/Item/ItemHeaderView.swift index b8a708a..3b5769a 100644 --- a/Jel/Views/Library/Item/ItemHeaderView.swift +++ b/Jel/Views/Library/Item/ItemHeaderView.swift @@ -9,7 +9,7 @@ import SwiftUI import JellyfinKit struct ItemHeaderView: View { - @State var item: BaseItemDto + var item: BaseItemDto let overlayGradient = LinearGradient(gradient: Gradient(stops: [ .init(color: .clear, location: 0), diff --git a/Jel/Views/Library/Item/ItemInfoView.swift b/Jel/Views/Library/Item/ItemInfoView.swift index 022fa71..0e1ce11 100644 --- a/Jel/Views/Library/Item/ItemInfoView.swift +++ b/Jel/Views/Library/Item/ItemInfoView.swift @@ -9,7 +9,7 @@ import SwiftUI import JellyfinKit struct ItemInfoView: View { - @State var item: BaseItemDto + var item: BaseItemDto var body: some View { VStack(alignment: .leading) { diff --git a/Jel/Views/Library/LibraryDetailView.swift b/Jel/Views/Library/LibraryDetailView.swift index ece4e74..b645a8a 100644 --- a/Jel/Views/Library/LibraryDetailView.swift +++ b/Jel/Views/Library/LibraryDetailView.swift @@ -13,6 +13,7 @@ struct LibraryDetailView: View { @StateObject var authState: AuthStateController = AuthStateController.shared @State var library: BaseItemDto + var filter: (_ items: [BaseItemDto]) -> [BaseItemDto] @State var items: [BaseItemDto]? = [] @@ -71,19 +72,23 @@ struct LibraryDetailView: View { } } } - .navigationTitle(library.name ?? "Unknown") .onAppear { Task { let params = Paths.GetItemsParameters( userID: authState.userId, parentID: library.id, - fields: [.primaryImageAspectRatio] + fields: [.primaryImageAspectRatio, + .genres, + .taglines, + .overview, + .parentID] ) let request = Paths.getItems(parameters: params) do { let res = try await jellyfinClient.send(request) items = res.value.items + items = self.filter(items ?? []) items?.sort(by: {$0.name?.lowercased() ?? "" < $1.name?.lowercased() ?? ""}) loading = false } catch { -- cgit v1.2.3