yattee/Shared/Views/ContentItemView.swift

124 lines
3.2 KiB
Swift
Raw Normal View History

import Defaults
import Foundation
import SwiftUI
struct ContentItemView: View {
let item: ContentItem
2022-12-12 00:18:29 +00:00
@Environment(\.listingStyle) private var listingStyle
2022-12-18 23:10:05 +00:00
@Environment(\.noListingDividers) private var noListingDividers
2023-05-23 16:54:53 +00:00
@Default(.hideShorts) private var hideShorts
@Default(.hideWatched) private var hideWatched
@FetchRequest private var watchRequest: FetchedResults<Watch>
init(item: ContentItem) {
self.item = item
if item.contentType == .video, let video = item.video {
_watchRequest = video.watchFetchRequest
} else {
_watchRequest = Video.fixture.watchFetchRequest
}
}
2023-02-25 15:42:18 +00:00
@ViewBuilder var body: some View {
if itemVisible {
Group {
switch item.contentType {
case .video:
videoItem(item.video)
case .channel:
channelItem(item.channel)
case .playlist:
playlistItem(item.playlist)
default:
placeholderItem()
}
}
2023-02-25 15:42:18 +00:00
.id(item.cacheKey)
}
2023-02-25 15:42:18 +00:00
}
var itemVisible: Bool {
if hideWatched, watch?.finished ?? false {
return false
}
2023-02-25 15:42:18 +00:00
guard hideShorts, item.contentType == .video, let video = item.video else {
return true
}
return !video.short
}
@ViewBuilder func videoItem(_ video: Video) -> some View {
if listingStyle == .cells {
VideoCell(video: video, watch: watch)
} else {
2022-12-18 23:10:05 +00:00
let item = PlayerQueueItem(video)
PlayerQueueRow(item: item, watch: watch)
.contextMenu {
VideoContextMenuView(video: video)
}
.id(item.contentItem.cacheKey)
#if os(tvOS)
.padding(.horizontal, 30)
#endif
#if !os(tvOS)
Divider()
2022-12-18 23:10:05 +00:00
.opacity(noListingDividers ? 0 : 1)
#endif
}
}
@ViewBuilder func playlistItem(_ playlist: ChannelPlaylist) -> some View {
if listingStyle == .cells {
ChannelPlaylistCell(playlist: playlist)
} else {
ChannelPlaylistListItem(playlist: playlist)
#if os(tvOS)
.padding(.horizontal, 30)
#endif
#if !os(tvOS)
Divider()
#endif
}
}
@ViewBuilder func channelItem(_ channel: Channel) -> some View {
if listingStyle == .cells {
ChannelCell(channel: channel)
} else {
ChannelListItem(channel: channel)
#if os(tvOS)
.padding(.horizontal, 30)
#endif
#if !os(tvOS)
Divider()
#endif
}
}
@ViewBuilder func placeholderItem() -> some View {
if listingStyle == .cells {
PlaceholderCell()
2022-12-14 16:20:24 +00:00
.id(item.id)
} else {
PlaceholderListItem()
#if os(tvOS)
.padding(.horizontal, 30)
#endif
#if !os(tvOS)
Divider()
#endif
}
}
private var watch: Watch? {
watchRequest.first
}
}