From 8e73b094bafb635c30845b996340bc492e5633e4 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Mon, 25 Dec 2023 00:41:45 -0500 Subject: [PATCH] Implement library searching --- .../JellyfinClientController.swift | 11 ++++ .../Dashboard/DashboardLibraryView.swift | 1 + Jel/Views/Library/Item/ItemMovieView.swift | 2 +- Jel/Views/Library/LibraryDetailView.swift | 53 ++++++++++++++++--- 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/Jel/Controllers/JellyfinClientController.swift b/Jel/Controllers/JellyfinClientController.swift index 08b74d0..e55afa3 100644 --- a/Jel/Controllers/JellyfinClientController.swift +++ b/Jel/Controllers/JellyfinClientController.swift @@ -114,5 +114,16 @@ extension JellyfinClientController { self.setToken(token: self.authState.authToken ?? "") } } + + func search(parameters: Paths.GetParameters) async -> SearchHintResult? { + let request = Paths.get(parameters: parameters) + do { + let res = try await self.api.send(request) + return res.value + } catch { + } + + return nil + } } diff --git a/Jel/Views/Dashboard/DashboardLibraryView.swift b/Jel/Views/Dashboard/DashboardLibraryView.swift index 2e0cd0e..57ffa50 100644 --- a/Jel/Views/Dashboard/DashboardLibraryView.swift +++ b/Jel/Views/Dashboard/DashboardLibraryView.swift @@ -15,6 +15,7 @@ struct DashboardLibraryView: View { @State var libraries: [BaseItemDto] = [] @State var loading: Bool = true + var body: some View { if loading { ProgressView() diff --git a/Jel/Views/Library/Item/ItemMovieView.swift b/Jel/Views/Library/Item/ItemMovieView.swift index be12696..055a158 100644 --- a/Jel/Views/Library/Item/ItemMovieView.swift +++ b/Jel/Views/Library/Item/ItemMovieView.swift @@ -54,7 +54,7 @@ struct ItemMovieView: View { .toolbarRole(.editor) .navigationBarTitleDisplayMode(.inline) .navigationTitle(navigationTitle) - .ignoresSafeArea(edges: .bottom) + .ignoresSafeArea() .scrollIndicators(.hidden) .onAppear { Task { diff --git a/Jel/Views/Library/LibraryDetailView.swift b/Jel/Views/Library/LibraryDetailView.swift index f4ff93c..9d4e46d 100644 --- a/Jel/Views/Library/LibraryDetailView.swift +++ b/Jel/Views/Library/LibraryDetailView.swift @@ -13,10 +13,15 @@ struct LibraryDetailView: View { @StateObject var authState: AuthStateController = AuthStateController.shared @State var library: BaseItemDto + @State var items: [BaseItemDto]? = [] @State var loading: Bool = true + + @State var searchText: String = "" + @State var searchResultHints: SearchHintResult? + @State var searchResultItems: [BaseItemDto]? let columns = [ GridItem(.adaptive(minimum: 150)) ] @@ -24,17 +29,51 @@ struct LibraryDetailView: View { if loading { ProgressView() .progressViewStyle(.circular) + } else { + EmptyView() } ScrollView { LazyVGrid(columns: columns) { - ForEach(items ?? []) {item in - NavigationLink { - ItemView(item: item) - } label: { - LibraryIconView(library: item, imageType: "Primary", width: 170) - .padding() + if !searchText.isEmpty { + ForEach(searchResultItems ?? []) {item in + NavigationLink { + ItemView(item: item) + } label: { + LibraryIconView(library: item, imageType: "Primary", width: 170) + .padding() + } + .buttonStyle(PlainButtonStyle()) } - .buttonStyle(PlainButtonStyle()) + } else { + ForEach(items ?? []) {item in + NavigationLink { + ItemView(item: item) + } label: { + LibraryIconView(library: item, imageType: "Primary", width: 170) + .padding() + } + .buttonStyle(PlainButtonStyle()) + } + } + } + } + .searchable(text: $searchText) + .onChange(of: searchText) { + Task { + let parameters = Paths.GetParameters( + userID: AuthStateController.shared.userId, + searchTerm: searchText.lowercased(), + parentID: library.id + ) + searchResultHints = await jellyfinClient.search(parameters: parameters) + + searchResultItems = items?.filter { item in + for hint in searchResultHints?.searchHints ?? [] { + if hint.name == item.name { + return true + } + } + return false } } }