diff options
author | Shav Kinderlehrer <[email protected]> | 2024-01-11 20:44:49 -0500 |
---|---|---|
committer | Shav Kinderlehrer <[email protected]> | 2024-01-11 20:44:49 -0500 |
commit | 6b8d3372d21149ed0efb4d43bf0cab44bd24f9a4 (patch) | |
tree | a6c393738b67dd753efe839aff59193da94b7bb3 /Jel/Views/Library | |
parent | 6edc39791a577a500c92f32361cf1e7d2590ec37 (diff) | |
download | jel-6b8d3372d21149ed0efb4d43bf0cab44bd24f9a4.tar.gz jel-6b8d3372d21149ed0efb4d43bf0cab44bd24f9a4.zip |
Implement peopleView
Diffstat (limited to 'Jel/Views/Library')
-rw-r--r-- | Jel/Views/Library/Item/ItemGenresView.swift | 73 | ||||
-rw-r--r-- | Jel/Views/Library/Item/ItemHeaderView.swift | 52 | ||||
-rw-r--r-- | Jel/Views/Library/Item/ItemInfoView.swift | 37 | ||||
-rw-r--r-- | Jel/Views/Library/Item/ItemMediaView.swift | 35 | ||||
-rw-r--r-- | Jel/Views/Library/Item/ItemView.swift | 30 | ||||
-rw-r--r-- | Jel/Views/Library/Item/Person/ItemPeopleView.swift | 37 | ||||
-rw-r--r-- | Jel/Views/Library/Item/Person/ItemPersonIconView.swift | 70 | ||||
-rw-r--r-- | Jel/Views/Library/Item/Types/ItemMovieView.swift | 53 | ||||
-rw-r--r-- | Jel/Views/Library/ItemIconView.swift | 106 |
9 files changed, 0 insertions, 493 deletions
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: "<br>") ?? [], 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() -//} diff --git a/Jel/Views/Library/ItemIconView.swift b/Jel/Views/Library/ItemIconView.swift deleted file mode 100644 index c2006cc..0000000 --- a/Jel/Views/Library/ItemIconView.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// ItemIconView.swift -// Jel -// -// Created by zerocool on 12/15/23. -// - -import SwiftUI -import JellyfinKit -import NukeUI - -struct ItemIconView: View { - @EnvironmentObject var jellyfinClient: JellyfinClientController - - var item: BaseItemDto - - var imageType: String = "Primary" - var width: CGFloat? - var height: CGFloat? - - @State var blurHashImage: UIImage = UIImage() - @State var imageUrl: URL? - @State var contentMode: ContentMode = .fit - - var placeHolder: AnyView? - - var shouldShowCaption: Bool = false - var imageCornerRadius: CGFloat = 5 - var body: some View { - VStack(alignment: .leading) { - LazyImage(url: imageUrl) {state in - if let image = state.image { - image - .resizable() - .aspectRatio(contentMode: contentMode) - } else { - if let content = placeHolder { - content - } else { - Image(uiImage: blurHashImage) - .resizable() - .aspectRatio(contentMode: .fill) - } - } - } - .frame(width: width, height: height) - .clipShape(RoundedRectangle(cornerRadius: imageCornerRadius)) - .onAppear { - let blurhash = getBlurHash(imageType: imageType) - blurHashImage = UIImage(blurHash: blurhash, size: CGSize(width: 32, height: 32)) ?? UIImage() - - let imageId = item.id ?? "" - let request = Paths.getItemImage(itemID: imageId, imageType: imageType) - imageUrl = jellyfinClient.getUrl()?.appending(path: request.url?.absoluteString ?? "") - } - - if shouldShowCaption { - Text(item.name ?? "Unknown") - .font(.subheadline) - } - } - } - - private func getBlurHash(imageType: String) -> String { - switch imageType { - case "Primary": - return item.imageBlurHashes?.primary?[item.imageTags?[imageType] ?? ""] ?? "" - case "Backdrop": - return item.imageBlurHashes?.backdrop?[item.backdropImageTags?[0] ?? ""] ?? "" - default: - return "" - } - } - - func showCaption(_ showCaption: Bool = true) -> Self { - var copy = self - copy.shouldShowCaption = showCaption - return copy - } - - func setCornerRadius(_ cornerRadius: CGFloat = 5) -> Self { - var copy = self - copy.imageCornerRadius = cornerRadius - return copy - } - - func setAspectRatio(_ aspectRatio: Double?) -> Self { - var copy = self - if aspectRatio == nil { - return copy - } - - if let newWidth = copy.width { - copy.height = newWidth / aspectRatio! - } - if let newHeight = copy.height { - copy.width = newHeight * aspectRatio! - } - - return copy - } -} - -//#Preview { -// LibraryIconView(library: BaseItemDto()) -//} |