diff options
Diffstat (limited to 'Jel/Views/Library/Item')
-rw-r--r-- | Jel/Views/Library/Item/ItemHeaderView.swift | 42 | ||||
-rw-r--r-- | Jel/Views/Library/Item/ItemInfoView.swift | 29 | ||||
-rw-r--r-- | Jel/Views/Library/Item/ItemMovieView.swift | 82 |
3 files changed, 91 insertions, 62 deletions
diff --git a/Jel/Views/Library/Item/ItemHeaderView.swift b/Jel/Views/Library/Item/ItemHeaderView.swift index d694c13..2c11719 100644 --- a/Jel/Views/Library/Item/ItemHeaderView.swift +++ b/Jel/Views/Library/Item/ItemHeaderView.swift @@ -13,35 +13,43 @@ struct ItemHeaderView: View { let overlayGradient = LinearGradient(gradient: Gradient(stops: [ .init(color: .clear, location: 0), - .init(color: .black, location: 0.3), - .init(color: .black, location: 0.7), - - .init(color: .clear, location: 1) + .init(color: .black, location: 0.5), + // .init(color: .black, location: 0.7), + // .init(color: .clear, location: 1) ]), startPoint: .bottom, endPoint: .top) var body: some View { ZStack(alignment: .bottom) { - LibraryIconView(library: item, imageType: "Backdrop", contentMode: .fill) - .hideCaption() - .setCornerRadius(0) - .mask(overlayGradient) -// .padding(.top, 50) - .background { - LibraryIconView(library: item, imageType: "Backdrop", contentMode: .fill) - .hideCaption() - .setCornerRadius(0) - .blur(radius: 50) - } + StickyHeaderView(minHeight: 300) { + LibraryIconView(library: item, imageType: "Backdrop", contentMode: .fill) + .hideCaption() + .setCornerRadius(0) + .mask(overlayGradient) + .background { + LibraryIconView(library: item, imageType: "Backdrop", contentMode: .fill) + .hideCaption() + .setCornerRadius(0) + .blur(radius: 50) + } + } HStack { LibraryIconView(library: item, imageType: "Logo", width: 200, height: 100, placeHolder: AnyView(Text(item.name ?? "Unknown").font(.title).bold().truncationMode(.middle))) .hideCaption() .setCornerRadius(0) .shadow(radius: 10) + .frame(alignment: .leading) Spacer() + ItemInfoView(item: item) + .foregroundStyle(.white) } - .frame(alignment: .leading) - .padding(.leading) + .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) } } } diff --git a/Jel/Views/Library/Item/ItemInfoView.swift b/Jel/Views/Library/Item/ItemInfoView.swift new file mode 100644 index 0000000..d48dfef --- /dev/null +++ b/Jel/Views/Library/Item/ItemInfoView.swift @@ -0,0 +1,29 @@ +// +// ItemInfoView.swift +// Jel +// +// Created by zerocool on 12/24/23. +// + +import SwiftUI +import JellyfinKit + +struct ItemInfoView: View { + @State var item: BaseItemDto + + var body: some View { + VStack(alignment: .leading) { + HStack { + Text(item.genres?.first ?? "---") + Text("•") + Text((item.productionYear != nil) ? String(item.productionYear!) : "---") + } + Text(item.getRuntime() ?? "-:--") + } + .font(.caption) + } +} + +//#Preview { +// ItemInfoView() +//} diff --git a/Jel/Views/Library/Item/ItemMovieView.swift b/Jel/Views/Library/Item/ItemMovieView.swift index 68ba1b2..be12696 100644 --- a/Jel/Views/Library/Item/ItemMovieView.swift +++ b/Jel/Views/Library/Item/ItemMovieView.swift @@ -18,59 +18,50 @@ struct ItemMovieView: View { @State var navigationTitle: String = "" var body: some View { - ScrollView { - // ItemHeaderView(item: item) - // .scrollTransition {content, phase in - // content - // .scaleEffect(phase.isIdentity ? 1 : 2) - // .opacity(phase.isIdentity ? 1 : 0.1) - // .blur(radius: phase.isIdentity ? 0 : 50) - // } - ItemHeaderView(item: item) - .opacity(0) // this is the jankiest thing in existence - .background { - GeometryReader {geo in - ItemHeaderView(item: item) - .onChange(of: geo.frame(in: .global).minY) { - navigationTitle = geo.frame(in: .global).minY < 0 ? item.name ?? "Unknown" : "" - } - .scaleEffect(1 + (geo.frame(in: .global).minY > 0 ? geo.frame(in: .global).minY * 0.001 : 0)) - .offset(y: 1 + (geo.frame(in: .global).minY > 0 ? geo.frame(in: .global).minY * 0.001 : 0)) - .scrollTransition {content, phase in - content - .scaleEffect(phase.isIdentity ? 1 : 2) - .opacity(phase.isIdentity ? 1 : 0.1) - .blur(radius: phase.isIdentity ? 0 : 50) + VStack { + if loading { + ProgressView() + .progressViewStyle(.circular) + } else { + ScrollView { + ItemHeaderView(item: item) + .padding(.bottom) + .background { + GeometryReader {geo in + EmptyView() + .onChange(of: geo.frame(in: .global).minY) { + let minY = geo.frame(in: .global).minY + if minY < 0 { + navigationTitle = item.name ?? "" + } else { + navigationTitle = "" + } + } } + } + + VStack(alignment: .leading) { + Text(item.taglines?.count ?? 0 > 0 ? item.taglines?[0] ?? "" : "") + .font(.headline) + .frame(maxWidth: .infinity, alignment: .leading) + + Text(item.overview ?? "---") } - } - - VStack { - Text(item.taglines?[0] ?? "Unknown") - .font(.headline) - .padding(.top, 20) - - Text(item.overview ?? "Unknown") - .padding() - Text(item.overview ?? "Unknown") - .padding() - Text(item.overview ?? "Unknown") - .padding() - Text(item.overview ?? "Unknown") .padding() + } } } - .redacted(reason: loading ? .placeholder : []) - .ignoresSafeArea(edges: .top) - .scrollIndicators(.hidden) .toolbarRole(.editor) - .navigationTitle(navigationTitle) .navigationBarTitleDisplayMode(.inline) + .navigationTitle(navigationTitle) + .ignoresSafeArea(edges: .bottom) + .scrollIndicators(.hidden) .onAppear { Task { do { let request = Paths.getItem(userID: authState.userId ?? "", itemID: item.id ?? "") - item = try await jellyfinClient.send(request).value + let response = try await jellyfinClient.send(request) + item = response.value loading = false } catch { } @@ -79,6 +70,7 @@ struct ItemMovieView: View { } } -#Preview { - ItemMovieView(item: BaseItemDto()) -} +//#Preview { +// ItemMovieView(item: BaseItemDto()) + +//} |