From 6b8d3372d21149ed0efb4d43bf0cab44bd24f9a4 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Thu, 11 Jan 2024 20:44:49 -0500 Subject: Implement peopleView --- Jel/Views/Library/Item/ItemGenresView.swift | 73 ---------------------- Jel/Views/Library/Item/ItemHeaderView.swift | 52 --------------- Jel/Views/Library/Item/ItemInfoView.swift | 37 ----------- Jel/Views/Library/Item/ItemMediaView.swift | 35 ----------- Jel/Views/Library/Item/ItemView.swift | 30 --------- Jel/Views/Library/Item/Person/ItemPeopleView.swift | 37 ----------- .../Library/Item/Person/ItemPersonIconView.swift | 70 --------------------- Jel/Views/Library/Item/Types/ItemMovieView.swift | 53 ---------------- 8 files changed, 387 deletions(-) delete mode 100644 Jel/Views/Library/Item/ItemGenresView.swift delete mode 100644 Jel/Views/Library/Item/ItemHeaderView.swift delete mode 100644 Jel/Views/Library/Item/ItemInfoView.swift delete mode 100644 Jel/Views/Library/Item/ItemMediaView.swift delete mode 100644 Jel/Views/Library/Item/ItemView.swift delete mode 100644 Jel/Views/Library/Item/Person/ItemPeopleView.swift delete mode 100644 Jel/Views/Library/Item/Person/ItemPersonIconView.swift delete mode 100644 Jel/Views/Library/Item/Types/ItemMovieView.swift (limited to 'Jel/Views/Library/Item') diff --git a/Jel/Views/Library/Item/ItemGenresView.swift b/Jel/Views/Library/Item/ItemGenresView.swift deleted file mode 100644 index 4e8321f..0000000 --- a/Jel/Views/Library/Item/ItemGenresView.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// 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 libraryItems: [BaseItemDto]? = [] - - var body: some View { - VStack(alignment: .leading) { - Text("Genres") - .font(.title2) - .padding(.horizontal) - - ScrollView(.horizontal) { - HStack { - ForEach(item.genres ?? [], id: \.self) {genre in - NavigationLink { - LibraryDetailView(library: BaseItemDto(name: genre), items: libraryItems) {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) - } - } - .padding(.horizontal) - } - .scrollIndicators(.hidden) - } - .onAppear { - Task { - let parameters = Paths.GetItemsParameters( - userID: authState.userId ?? "", - isRecursive: true, - includeItemTypes: [.movie, .series], - genres: item.genres ?? [] - ) - let request = Paths.getItems(parameters: parameters) - do { - let res = try await jellyfinClient.send(request) - libraryItems = res.value.items ?? [] - } catch { - } - } - - } - } -} - -//#Preview { -// ItemGenresView() -//} diff --git a/Jel/Views/Library/Item/ItemHeaderView.swift b/Jel/Views/Library/Item/ItemHeaderView.swift deleted file mode 100644 index 4c2bbe3..0000000 --- a/Jel/Views/Library/Item/ItemHeaderView.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// ItemHeaderView.swift -// Jel -// -// Created by zerocool on 12/23/23. -// - -import SwiftUI -import JellyfinKit - -struct ItemHeaderView: View { - var item: BaseItemDto - - let overlayGradientMask = LinearGradient(gradient: Gradient(stops: [ - .init(color: .clear, location: 0), - .init(color: .black, location: 0.3), - ]), startPoint: .bottom, endPoint: .top) - let overlayGradient = LinearGradient(gradient: Gradient(stops: [ - .init(color: .black, location: 0), - .init(color: .clear, location: 0.5) - ]), startPoint: .bottom, endPoint: .top) - - var body: some View { - ZStack(alignment: .bottom) { - StickyHeaderView(minHeight: 400) { - ItemIconView(item: item, imageType: "Backdrop", contentMode: .fill) - .setCornerRadius(0) - .overlay(overlayGradient) - } - - HStack { - ItemIconView(item: item, imageType: "Logo", width: 200, height: 100, placeHolder: AnyView(Text(item.name ?? "Unknown").font(.title).bold().truncationMode(.middle))) - .setCornerRadius(0) - .shadow(radius: 10) - .frame(alignment: .leading) - Spacer() - ItemInfoView(item: item) - } - .padding([.leading, .trailing]) - } -// .scrollTransition {content, phase in -// content -// .scaleEffect(phase.isIdentity ? 1 : 2) -// .opacity(phase.isIdentity ? 1 : 0.1) -// .blur(radius: phase.isIdentity ? 0 : 50) -// } - } -} - -// #Preview { -// ItemHeaderView(item: BaseItemDto()) -// } diff --git a/Jel/Views/Library/Item/ItemInfoView.swift b/Jel/Views/Library/Item/ItemInfoView.swift deleted file mode 100644 index dda1c39..0000000 --- a/Jel/Views/Library/Item/ItemInfoView.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// ItemInfoView.swift -// Jel -// -// Created by zerocool on 12/24/23. -// - -import SwiftUI -import JellyfinKit - -struct ItemInfoView: View { - var item: BaseItemDto - - var body: some View { - VStack(alignment: .leading) { - HStack { - Text((item.productionYear != nil) ? String(item.productionYear!) : "---") - Text("•") - Text(item.genres?.first ?? "---") - } - - HStack { - if item.type == .movie { - Text(item.getRuntime() ?? "-:--") - } - if let officialRating = item.officialRating { - TextRatingView(officialRating, fillStyle: .stroke) - } - } - } - .font(.caption) - } -} - -//#Preview { -// ItemInfoView() -//} diff --git a/Jel/Views/Library/Item/ItemMediaView.swift b/Jel/Views/Library/Item/ItemMediaView.swift deleted file mode 100644 index 1d1e53d..0000000 --- a/Jel/Views/Library/Item/ItemMediaView.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// ItemMediaView.swift -// Jel -// -// Created by zerocool on 12/23/23. -// - -import SwiftUI -import JellyfinKit -import VisibilityTrackingScrollView - -struct ItemMediaView: View { - @EnvironmentObject var jellyfinClient: JellyfinClientController - @StateObject var authState: AuthStateController = AuthStateController.shared - - var item: BaseItemDto - - - var body: some View { - VStack(alignment: .leading) { - Text(item.taglines?.count ?? 0 > 0 ? item.taglines?[0] ?? "" : "") - .font(.headline) - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.bottom) - - ForEach(item.overview?.components(separatedBy: "
") ?? [], id: \.self) {overview in - Text(overview) - } - } - } -} - -//#Preview { -// ItemMovieView(item: BaseItemDto()) -//} diff --git a/Jel/Views/Library/Item/ItemView.swift b/Jel/Views/Library/Item/ItemView.swift deleted file mode 100644 index da85f32..0000000 --- a/Jel/Views/Library/Item/ItemView.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// ItemView.swift -// Jel -// -// Created by zerocool on 12/23/23. -// - -import SwiftUI -import JellyfinKit - -struct ItemView: View { - @State var item: BaseItemDto - var body: some View { - ScrollView { - VStack { - switch item.type { - case .movie: - ItemMovieView(item: item) - default: - ItemMediaView(item: item) - } - } - } - .scrollIndicators(.hidden) - } -} - -//#Preview { -// ItemView(item: BaseItemDto()) -//} diff --git a/Jel/Views/Library/Item/Person/ItemPeopleView.swift b/Jel/Views/Library/Item/Person/ItemPeopleView.swift deleted file mode 100644 index 6e2a974..0000000 --- a/Jel/Views/Library/Item/Person/ItemPeopleView.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// ItemPeopleView.swift -// Jel -// -// Created by zerocool on 1/8/24. -// - -import SwiftUI -import JellyfinKit -import NukeUI - -struct ItemPeopleView: View { - - var item: BaseItemDto - - var body: some View { - VStack(alignment: .leading) { - Text("Cast and Crew") - .font(.title2) - .padding(.leading) - - ScrollView(.horizontal) { - LazyHStack(alignment: .top) { - ForEach(item.people ?? [], id: \.iterId) {person in - ItemPersonIconView(person: person) - } - } - .padding(.horizontal) - } - .scrollIndicators(.hidden) - } - } -} - -//#Preview { -// ItemPeopleView() -//} diff --git a/Jel/Views/Library/Item/Person/ItemPersonIconView.swift b/Jel/Views/Library/Item/Person/ItemPersonIconView.swift deleted file mode 100644 index a6e5161..0000000 --- a/Jel/Views/Library/Item/Person/ItemPersonIconView.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// ItemPersonIconView.swift -// Jel -// -// Created by zerocool on 1/8/24. -// - -import SwiftUI -import JellyfinKit -import NukeUI - -struct ItemPersonIconPlaceholderView: View { - var body: some View { - VStack { - Image(systemName: "person") - .resizable() - .padding() - .scaledToFit() - } - } -} - -struct ItemPersonIconView: View { - @StateObject var authState: AuthStateController = AuthStateController.shared - @EnvironmentObject var jellyfinClient: JellyfinClientController - - var person: BaseItemPerson - - @State var personImageUrl: URL? - @State var loading: Bool = true - - var body: some View { - VStack() { - LazyImage(url: personImageUrl) {state in - if let image = state.image { - image - .resizable() - .clipShape(RoundedRectangle(cornerRadius: 5)) - } else { - ItemPersonIconPlaceholderView() - } - } - .aspectRatio(contentMode: .fit) - .frame(width: 100, height: 170) - - VStack { - Text(person.name ?? "---") - .font(.callout) - Text(person.role ?? "---") - .font(.caption) - .foregroundStyle(.gray) - } - .frame(width: 100) - } - // .redacted(reason: loading ? .placeholder : []) - .onAppear { - Task { - let request = Paths.getItemImage(itemID: person.id ?? "", imageType: "Primary") - - let serverUrl = jellyfinClient.getUrl() - personImageUrl = serverUrl?.appending(path: request.url?.absoluteString ?? "") - // loading = false - } - } - } -} - -//#Preview { -// ItemPersonView() -//} diff --git a/Jel/Views/Library/Item/Types/ItemMovieView.swift b/Jel/Views/Library/Item/Types/ItemMovieView.swift deleted file mode 100644 index 5181e73..0000000 --- a/Jel/Views/Library/Item/Types/ItemMovieView.swift +++ /dev/null @@ -1,53 +0,0 @@ -// -// ItemMovieView.swift -// Jel -// -// Created by zerocool on 12/26/23. -// - -import SwiftUI -import JellyfinKit - -struct ItemMovieView: View { - var item: BaseItemDto - - @State var pageScrolled: Bool = false - - var body: some View { - VStack { - ItemHeaderView(item: item) - .foregroundStyle(.white) - .background { - GeometryReader {geo in - EmptyView() - .onChange(of: geo.frame(in: .global).minY) { - let minY = geo.frame(in: .global).minY - - pageScrolled = minY < -100 - } - } - } - - ItemMediaView(item: item) - .padding() - - ItemGenresView(item: item) - - ItemPeopleView(item: item) - } - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(item.name ?? "Untitled") - .toolbarRole(.editor) - .toolbar { - ToolbarItem(placement: .principal) { - Text(pageScrolled ? item.name ?? "Untitled" : "") - .bold() - } - } - .toolbarBackground(pageScrolled ? .visible : .hidden) - } -} - -//#Preview { -// ItemMovieView() -//} -- cgit v1.2.3