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) } }