yattee/Shared/Channels/ChannelPlaylistListItem.swift

105 lines
2.7 KiB
Swift

import SwiftUI
struct ChannelPlaylistListItem: View {
var playlist: ChannelPlaylist
@Environment(\.inNavigationView) private var inNavigationView
@Environment(\.navigationStyle) private var navigationStyle
var body: some View {
playlistControl
.contentShape(Rectangle())
}
var thumbnailView: some View {
ThumbnailView(url: playlist.thumbnailURL)
#if os(tvOS)
.frame(width: 250, height: 140)
#else
.frame(width: 100, height: 60)
#endif
.clipShape(RoundedRectangle(cornerRadius: 2))
}
@ViewBuilder private var playlistControl: some View {
#if os(tvOS)
playlistButton
#else
if navigationStyle == .tab, inNavigationView {
playlistNavigationLink
} else {
playlistButton
}
#endif
}
@ViewBuilder private var playlistNavigationLink: some View {
NavigationLink(destination: ChannelPlaylistView(playlist: playlist)) {
label
}
}
@ViewBuilder private var playlistButton: some View {
Button {
NavigationModel.shared.openChannelPlaylist(
playlist,
navigationStyle: navigationStyle
)
} label: {
label
}
#if os(tvOS)
.buttonStyle(.card)
#else
.buttonStyle(.plain)
#endif
.help("\(playlist.title) playlist")
}
@ViewBuilder private var displayTitle: some View {
Text(playlist.title)
.fontWeight(.semibold)
}
private var label: some View {
HStack(alignment: .top, spacing: 12) {
VStack {
thumbnailView
}
.frame(width: thumbnailWidth)
#if os(tvOS)
.frame(minHeight: 100)
#else
.frame(minHeight: 60)
#endif
VStack(alignment: .leading) {
displayTitle
Text("\(playlist.videosCount ?? playlist.videos.count) videos")
.font(.caption)
.foregroundColor(.secondary)
}
.frame(maxWidth: .infinity, alignment: .leading)
.multilineTextAlignment(.leading)
}
#if os(tvOS)
.padding(.vertical)
#endif
.frame(maxWidth: .infinity, alignment: .leading)
}
private var thumbnailWidth: Double {
#if os(tvOS)
250
#else
100
#endif
}
}
struct ChannelPlaylistListItem_Previews: PreviewProvider {
static var previews: some View {
ChannelPlaylistListItem(playlist: ChannelPlaylist.fixture)
}
}