mirror of
https://github.com/yattee/yattee.git
synced 2024-12-23 14:03:41 +00:00
105 lines
2.7 KiB
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)
|
|
}
|
|
}
|