Some work

This commit is contained in:
Ethan Pippin 2021-08-30 11:09:26 -06:00
parent f9114ae6be
commit b349258086
5 changed files with 92 additions and 87 deletions

View File

@ -993,8 +993,8 @@
isa = PBXGroup;
children = (
535BAE9E2649E569005FA86D /* ItemView.swift */,
E14F7D0626DB36EF007C3AE6 /* ItemPortraitBodyView.swift */,
E14F7D0826DB36F7007C3AE6 /* ItemLandscapeBodyView.swift */,
E14F7D0626DB36EF007C3AE6 /* ItemPortraitBodyView.swift */,
E1AD106126D9B7CD003E4A08 /* ItemPortraitHeaderOverlayView.swift */,
);
path = ItemView;

View File

@ -12,16 +12,16 @@ import JellyfinAPI
struct ItemPortraitBodyView<PortraitHeaderView: View, PortraitStaticOverlayView: View>: View {
@Binding var videoIsLoading: Bool
@EnvironmentObject var viewModel: MovieItemViewModel
@EnvironmentObject var videoPlayerItem: VideoPlayerItem
@Binding private var videoIsLoading: Bool
@EnvironmentObject private var viewModel: DetailItemViewModel
@EnvironmentObject private var videoPlayerItem: VideoPlayerItem
private let item: BaseItemDto
private let portraitHeaderView: (BaseItemDto) -> PortraitHeaderView
private let portraitStaticOverlayView: (BaseItemDto) -> PortraitStaticOverlayView
private let portraitHeaderView: (DetailItemViewModel) -> PortraitHeaderView
private let portraitStaticOverlayView: (DetailItemViewModel) -> PortraitStaticOverlayView
init(item: BaseItemDto, videoIsLoading: Binding<Bool>, portraitHeaderView: @escaping (BaseItemDto) -> PortraitHeaderView, portraitStaticOverlayView: @escaping (BaseItemDto) -> PortraitStaticOverlayView) {
self.item = item
init(videoIsLoading: Binding<Bool>,
portraitHeaderView: @escaping (DetailItemViewModel) -> PortraitHeaderView,
portraitStaticOverlayView: @escaping (DetailItemViewModel) -> PortraitStaticOverlayView) {
self._videoIsLoading = videoIsLoading
self.portraitHeaderView = portraitHeaderView
self.portraitStaticOverlayView = portraitStaticOverlayView
@ -43,8 +43,8 @@ struct ItemPortraitBodyView<PortraitHeaderView: View, PortraitStaticOverlayView:
}
// MARK: Body
ParallaxHeaderScrollView(header: portraitHeaderView(item),
staticOverlayView: portraitStaticOverlayView(item),
ParallaxHeaderScrollView(header: portraitHeaderView(viewModel),
staticOverlayView: portraitStaticOverlayView(viewModel),
overlayAlignment: .bottomLeading,
headerHeight: UIDevice.current.userInterfaceIdiom == .pad ? 350 : UIScreen.main.bounds.width * 0.5625) {
VStack {
@ -53,7 +53,7 @@ struct ItemPortraitBodyView<PortraitHeaderView: View, PortraitStaticOverlayView:
.padding(.bottom, UIDevice.current.userInterfaceIdiom == .pad ? 54 : 24)
// MARK: Overview
Text(item.overview ?? "")
Text(viewModel.item.overview ?? "")
.font(.footnote)
.padding(.top, 3)
.fixedSize(horizontal: false, vertical: true)
@ -63,12 +63,12 @@ struct ItemPortraitBodyView<PortraitHeaderView: View, PortraitStaticOverlayView:
// MARK: Genres
PillHStackView(title: "Genres",
items: item.genreItems ?? []) { genre in
items: viewModel.item.genreItems ?? []) { genre in
LibraryView(viewModel: .init(genre: genre), title: genre.title)
}
// MARK: Studios
if let studios = item.studios {
if let studios = viewModel.item.studios {
PillHStackView(title: "Studios",
items: studios) { studio in
LibraryView(viewModel: .init(studio: studio), title: studio.name ?? "")
@ -76,7 +76,7 @@ struct ItemPortraitBodyView<PortraitHeaderView: View, PortraitStaticOverlayView:
}
// MARK: Cast
PortraitImageHStackView(items: item.people?.filter({ $0.type == "Actor" }) ?? [],
PortraitImageHStackView(items: viewModel.item.people?.filter({ $0.type == "Actor" }) ?? [],
maxWidth: 150) {
Text("Cast")
.font(.callout)

View File

@ -15,26 +15,24 @@ struct PortraitHeaderOverlayView: View {
@EnvironmentObject private var viewModel: DetailItemViewModel
@EnvironmentObject private var videoPlayerItem: VideoPlayerItem
let item: BaseItemDto
var body: some View {
VStack(alignment: .leading) {
HStack(alignment: .bottom, spacing: 12) {
ImageView(src: item.portraitHeaderViewURL(maxWidth: 130))
ImageView(src: viewModel.item.portraitHeaderViewURL(maxWidth: 130))
.frame(width: 130, height: 195)
.cornerRadius(10)
VStack(alignment: .leading, spacing: 1) {
Spacer()
Text(item.name ?? "")
Text(viewModel.item.name ?? "")
.font(.headline)
.fontWeight(.semibold)
.foregroundColor(.primary)
.fixedSize(horizontal: false, vertical: true)
.offset(y: 5)
Text(item.getItemRuntime())
Text(viewModel.item.getItemRuntime())
.font(.subheadline)
.fontWeight(.medium)
.foregroundColor(.secondary)
@ -42,7 +40,7 @@ struct PortraitHeaderOverlayView: View {
.padding(.top, 10)
HStack {
if let productionYear = item.productionYear {
if let productionYear = viewModel.item.productionYear {
Text(String(productionYear))
.font(.subheadline)
.fontWeight(.medium)
@ -50,7 +48,7 @@ struct PortraitHeaderOverlayView: View {
.lineLimit(1)
}
if let officialRating = item.officialRating {
if let officialRating = viewModel.item.officialRating {
Text(officialRating)
.font(.subheadline)
.fontWeight(.semibold)
@ -65,18 +63,19 @@ struct PortraitHeaderOverlayView: View {
.padding(.bottom, UIDevice.current.userInterfaceIdiom == .pad ? 98 : 30)
}
if viewModel.item.itemType != .series {
HStack {
// MARK: Play
Button {
self.videoPlayerItem.itemToPlay = item
self.videoPlayerItem.itemToPlay = viewModel.item
self.videoPlayerItem.shouldShowPlayer = true
} label: {
HStack {
Image(systemName: "play.fill")
.foregroundColor(Color.white)
.font(.system(size: 20))
Text(item.getItemProgressString() == "" ? "Play" : item.getItemProgressString())
Text(viewModel.item.getItemProgressString() == "" ? "Play" : viewModel.item.getItemProgressString())
.foregroundColor(Color.white)
.font(.callout)
.fontWeight(.semibold)
@ -121,6 +120,7 @@ struct PortraitHeaderOverlayView: View {
.disabled(viewModel.isLoading)
}.padding(.top, 8)
}
}
.padding(.horizontal, 16)
.padding(.bottom, UIDevice.current.userInterfaceIdiom == .pad ? -189 : -64)
}

View File

@ -23,26 +23,27 @@ struct ItemView: View {
@Environment(\.horizontalSizeClass) var hSizeClass
@Environment(\.verticalSizeClass) var vSizeClass
private let item: BaseItemDto
private let viewModel: DetailItemViewModel
init(item: BaseItemDto) {
self.item = item
self.viewModel = DetailItemViewModel(item: item)
}
var body: some View {
if hSizeClass == .compact && vSizeClass == .regular {
ItemPortraitBodyView(item: item,
videoIsLoading: $videoIsLoading,
portraitHeaderView: { item in
ImageView(src: item.getBackdropImage(maxWidth: UIDevice.current.userInterfaceIdiom == .pad ? 622 : Int(UIScreen.main.bounds.width)),
bh: item.getBackdropImageBlurHash())
ItemPortraitBodyView(videoIsLoading: $videoIsLoading,
portraitHeaderView: { viewModel in
ImageView(src: viewModel.item.getBackdropImage(maxWidth: UIDevice.current.userInterfaceIdiom == .pad ? 622 : Int(UIScreen.main.bounds.width)),
bh: viewModel.item.getBackdropImageBlurHash())
.opacity(0.4)
.blur(radius: 2.0)
},
portraitStaticOverlayView: { item in
PortraitHeaderOverlayView(item: item)
.environmentObject(DetailItemViewModel(item: item))
}).environmentObject(videoPlayerItem)
portraitStaticOverlayView: { viewModel in
PortraitHeaderOverlayView()
.environmentObject(viewModel)
})
.environmentObject(videoPlayerItem)
.environmentObject(viewModel)
} else {
Text("Hello there")
}

View File

@ -11,7 +11,7 @@ import Foundation
import Foundation
import JellyfinAPI
class DetailItemViewModel: ViewModel {
class ItemViewModel: ViewModel {
@Published var item: BaseItemDto
@Published var similarItems: [BaseItemDto] = []
@ -83,3 +83,7 @@ class DetailItemViewModel: ViewModel {
}
}
}
class DetailItemViewModel: ItemViewModel {
}