summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShav Kinderlehrer <[email protected]>2023-12-25 00:41:45 -0500
committerShav Kinderlehrer <[email protected]>2023-12-25 00:41:45 -0500
commit8e73b094bafb635c30845b996340bc492e5633e4 (patch)
tree704e95f4641e6d8bf2f2a36558c7b504b6ee447e
parent69bed7745833add72cfe1b1516a61f62460b1765 (diff)
downloadjel-8e73b094bafb635c30845b996340bc492e5633e4.tar.gz
jel-8e73b094bafb635c30845b996340bc492e5633e4.zip
Implement library searching
-rw-r--r--Jel/Controllers/JellyfinClientController.swift11
-rw-r--r--Jel/Views/Dashboard/DashboardLibraryView.swift1
-rw-r--r--Jel/Views/Library/Item/ItemMovieView.swift2
-rw-r--r--Jel/Views/Library/LibraryDetailView.swift53
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())
+ }
+ } 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
+ }
}
- .buttonStyle(PlainButtonStyle())
+ return false
}
}
}