import Defaults import SwiftUI struct VideoContextMenuView: View { let video: Video @Binding var playerNavigationLinkActive: Bool @Environment(\.inNavigationView) private var inNavigationView @Environment(\.navigationStyle) private var navigationStyle @Environment(\.currentPlaylistID) private var playlistID @EnvironmentObject private var accounts @EnvironmentObject private var navigation @EnvironmentObject private var player @EnvironmentObject private var playlists @EnvironmentObject private var recents @EnvironmentObject private var subscriptions var body: some View { Section { playNowButton } Section { playNextButton addToQueueButton } Section { openChannelButton if accounts.app.supportsSubscriptions { subscriptionButton } } if accounts.app.supportsUserPlaylists { Section { addToPlaylistButton if let id = navigation.tabSelection?.playlistID ?? playlistID { removeFromPlaylistButton(playlistID: id) } } } #if os(tvOS) Button("Cancel", role: .cancel) {} #endif } private var playNowButton: some View { Button { player.playNow(video) if inNavigationView { playerNavigationLinkActive = true } else { player.presentPlayer() } } label: { Label("Play Now", systemImage: "play") } } private var playNextButton: some View { Button { player.playNext(video) } label: { Label("Play Next", systemImage: "text.insert") } } private var addToQueueButton: some View { Button { player.enqueueVideo(video) } label: { Label("Play Last", systemImage: "text.append") } } private var openChannelButton: some View { Button { let recent = RecentItem(from: video.channel) recents.add(recent) navigation.presentingChannel = true if navigationStyle == .sidebar { navigation.sidebarSectionChanged.toggle() navigation.tabSelection = .recentlyOpened(recent.tag) } } label: { Label("\(video.author) Channel", systemImage: "rectangle.stack.fill.badge.person.crop") } } private var subscriptionButton: some View { Group { if subscriptions.isSubscribing(video.channel.id) { Button(role: .destructive) { #if os(tvOS) subscriptions.unsubscribe(video.channel.id) #else navigation.presentUnsubscribeAlert(video.channel) #endif } label: { Label("Unsubscribe", systemImage: "xmark.circle") } } else { Button { subscriptions.subscribe(video.channel.id) { navigation.sidebarSectionChanged.toggle() } } label: { Label("Subscribe", systemImage: "star.circle") } } } } private var addToPlaylistButton: some View { Button { navigation.presentAddToPlaylist(video) } label: { Label("Add to playlist...", systemImage: "text.badge.plus") } } func removeFromPlaylistButton(playlistID: String) -> some View { Button(role: .destructive) { playlists.removeVideo(videoIndexID: video.indexID!, playlistID: playlistID) } label: { Label("Remove from playlist", systemImage: "text.badge.minus") } } }