// // LibraryDetailView.swift // Jel // // Created by zerocool on 12/22/23. // import SwiftUI import JellyfinKit struct LibraryDetailView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController @StateObject var authState: AuthStateController = AuthStateController.shared @State var library: BaseItemDto @State var items: [BaseItemDto]? = [] var filter: (_ items: [BaseItemDto]) -> [BaseItemDto] @State var loading: Bool = true @State var searchText: String = "" @State var searchResultHints: SearchHintResult? @State var searchResultItems: [BaseItemDto]? let columns = [ GridItem(.adaptive(minimum: 150)) ] var body: some View { if loading { ProgressView() .progressViewStyle(.circular) } else { EmptyView() } ScrollView { LazyVGrid(columns: columns) { // uses searchResultItems only if searchText is not empty ForEach(!searchText.isEmpty ? (searchResultItems ?? items) ?? [] : items ?? []) {item in NavigationLink { ItemView(item: item) } label: { ItemIconView(item: item, imageType: "Primary", width: 150) .showCaption() .setAspectRatio(item.primaryImageAspectRatio ?? 0.6) .padding() } .buttonStyle(PlainButtonStyle()) } } } .if(!loading) {view in view.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 } } } } .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, parentID: library.id, fields: [.primaryImageAspectRatio, .genres, .taglines, .overview, .parentID, .people] ) 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 { } } } } } //#Preview { // LibraryDetailView(library: BaseItemDto()) //}