jellyflood/Swiftfin tvOS/Views/ItemView/CinematicEpisodeItemView.swift

94 lines
3.3 KiB
Swift

//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2022 Jellyfin & Jellyfin Contributors
//
import Defaults
import Introspect
import SwiftUI
struct CinematicEpisodeItemView: View {
@EnvironmentObject
var itemRouter: ItemCoordinator.Router
@ObservedObject
var viewModel: EpisodeItemViewModel
@State
var wrappedScrollView: UIScrollView?
@Default(.showPosterLabels)
var showPosterLabels
func generateSubtitle() -> String? {
guard let seriesName = viewModel.item.seriesName, let episodeLocator = viewModel.item.episodeLocator else {
return nil
}
return "\(seriesName) - \(episodeLocator)"
}
var body: some View {
ZStack {
ImageView(
viewModel.item.getBackdropImage(maxWidth: 1920),
blurHash: viewModel.item.getBackdropImageBlurHash()
)
.frame(height: UIScreen.main.bounds.height - 10)
.ignoresSafeArea()
ScrollView {
VStack(spacing: 0) {
CinematicItemViewTopRow(
viewModel: viewModel,
wrappedScrollView: wrappedScrollView,
title: viewModel.item.name ?? "",
subtitle: generateSubtitle()
)
.focusSection()
.frame(height: UIScreen.main.bounds.height - 10)
ZStack(alignment: .topLeading) {
Color.black.ignoresSafeArea()
.frame(minHeight: UIScreen.main.bounds.height)
VStack(alignment: .leading, spacing: 20) {
CinematicItemAboutView(viewModel: viewModel)
// EpisodesRowView(viewModel: viewModel, onlyCurrentSeason: true)
// .focusSection()
// if let seriesItem = viewModel.series {
// PortraitItemsRowView(rowTitle: L10n.series,
// items: [seriesItem]) { seriesItem in
// itemRouter.route(to: \.item, seriesItem)
// }
// }
// if !viewModel.similarItems.isEmpty {
// PortraitImageHStack(rowTitle: L10n.recommended,
// items: viewModel.similarItems,
// showItemTitles: showPosterLabels) { item in
// itemRouter.route(to: \.item, item)
// }
// }
ItemDetailsView(viewModel: viewModel)
}
.padding(.top, 50)
}
}
}
.introspectScrollView { scrollView in
wrappedScrollView = scrollView
}
.ignoresSafeArea()
}
}
}