From 634b0187ed7dc2da6f37d0a559aad2ed6aae570b Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Sat, 25 Jun 2022 01:21:05 +0200 Subject: [PATCH] Improve sharing --- Model/NavigationModel.swift | 15 ++- .../Navigation/AppSidebarSubscriptions.swift | 2 +- Shared/Navigation/ContentView.swift | 11 -- Shared/Player/VideoDetails.swift | 64 ---------- Shared/Views/ControlsBar.swift | 118 ++++++++++++------ Shared/Views/ShareButton.swift | 1 - Shared/Views/VideoContextMenuView.swift | 22 ++-- 7 files changed, 107 insertions(+), 126 deletions(-) diff --git a/Model/NavigationModel.swift b/Model/NavigationModel.swift index 72c05c31..d50b4863 100644 --- a/Model/NavigationModel.swift +++ b/Model/NavigationModel.swift @@ -179,9 +179,20 @@ final class NavigationModel: ObservableObject { presentingPlaylistForm = true } - func presentUnsubscribeAlert(_ channel: Channel?) { + func presentUnsubscribeAlert(_ channel: Channel, subscriptions: SubscriptionsModel) { channelToUnsubscribe = channel - presentingUnsubscribeAlert = channelToUnsubscribe != nil + alert = Alert( + title: Text( + "Are you sure you want to unsubscribe from \(channelToUnsubscribe.name)?" + ), + primaryButton: .destructive(Text("Unsubscribe")) { [weak self] in + if let id = self?.channelToUnsubscribe.id { + subscriptions.unsubscribe(id) + } + }, + secondaryButton: .cancel() + ) + presentingAlert = true } func hideKeyboard() { diff --git a/Shared/Navigation/AppSidebarSubscriptions.swift b/Shared/Navigation/AppSidebarSubscriptions.swift index 2ad3aacd..750f0fde 100644 --- a/Shared/Navigation/AppSidebarSubscriptions.swift +++ b/Shared/Navigation/AppSidebarSubscriptions.swift @@ -15,7 +15,7 @@ struct AppSidebarSubscriptions: View { } .contextMenu { Button("Unsubscribe") { - navigation.presentUnsubscribeAlert(channel) + navigation.presentUnsubscribeAlert(channel, subscriptions: subscriptions) } } .id("channel\(channel.id)") diff --git a/Shared/Navigation/ContentView.swift b/Shared/Navigation/ContentView.swift index 5954cabc..402153e7 100644 --- a/Shared/Navigation/ContentView.swift +++ b/Shared/Navigation/ContentView.swift @@ -107,17 +107,6 @@ struct ContentView: View { } ) #endif - .alert(isPresented: $navigation.presentingUnsubscribeAlert) { - Alert( - title: Text( - "Are you sure you want to unsubscribe from \(navigation.channelToUnsubscribe.name)?" - ), - primaryButton: .destructive(Text("Unsubscribe")) { - subscriptions.unsubscribe(navigation.channelToUnsubscribe.id) - }, - secondaryButton: .cancel() - ) - } .alert(isPresented: $navigation.presentingAlert) { navigation.alert } } diff --git a/Shared/Player/VideoDetails.swift b/Shared/Player/VideoDetails.swift index e874c4cb..868ab39f 100644 --- a/Shared/Player/VideoDetails.swift +++ b/Shared/Player/VideoDetails.swift @@ -29,10 +29,6 @@ struct VideoDetails: View { @State private var subscribed = false @State private var subscriptionToggleButtonDisabled = false - @State private var presentingUnsubscribeAlert = false - @State private var presentingAddToPlaylist = false - @State private var presentingShareSheet = false - @State private var shareURL: URL? @StateObject private var page: Page = .first() @@ -262,66 +258,6 @@ struct VideoDetails: View { } } - var countsSection: some View { - Group { - if let video = player.currentVideo { - HStack { - ShareButton( - contentItem: contentItem, - presentingShareSheet: $presentingShareSheet, - shareURL: $shareURL - ) - - Spacer() - - if let views = video.viewsCount { - videoDetail(label: "Views", value: views, symbol: "eye") - } - - if let likes = video.likesCount { - Divider() - .frame(minHeight: 35) - - videoDetail(label: "Likes", value: likes, symbol: "hand.thumbsup") - } - - if let dislikes = video.dislikesCount { - Divider() - .frame(minHeight: 35) - - videoDetail(label: "Dislikes", value: dislikes, symbol: "hand.thumbsdown") - } - - Spacer() - - Button { - presentingAddToPlaylist = true - } label: { - Label("Add to Playlist", systemImage: "text.badge.plus") - .labelStyle(.iconOnly) - .help("Add to Playlist...") - } - .buttonStyle(.plain) - .opacity(accounts.app.supportsUserPlaylists ? 1 : 0) - #if os(macOS) - .frame(minWidth: 35, alignment: .trailing) - #endif - } - .frame(maxHeight: 35) - .foregroundColor(.secondary) - } - } - #if os(iOS) - .background( - EmptyView().sheet(isPresented: $presentingShareSheet) { - if let shareURL = shareURL { - ShareSheet(activityItems: [shareURL]) - } - } - ) - #endif - } - private var contentItem: ContentItem { ContentItem(video: player.currentVideo!) } diff --git a/Shared/Views/ControlsBar.swift b/Shared/Views/ControlsBar.swift index 2fb9d956..5c042112 100644 --- a/Shared/Views/ControlsBar.swift +++ b/Shared/Views/ControlsBar.swift @@ -14,6 +14,10 @@ struct ControlsBar: View { @EnvironmentObject private var model @EnvironmentObject private var playlists @EnvironmentObject private var recents + @EnvironmentObject private var subscriptions + + @State private var presentingShareSheet = false + @State private var shareURL: URL? @StateObject private var controlsPage = Page.first() @@ -36,6 +40,15 @@ struct ControlsBar: View { .borderTop(height: 0.4, color: Color("ControlsBorderColor")) .borderBottom(height: 0.4, color: Color("ControlsBorderColor")) .modifier(ControlBackgroundModifier(edgesIgnoringSafeArea: .bottom)) + #if os(iOS) + .background( + EmptyView().sheet(isPresented: $presentingShareSheet) { + if let shareURL = shareURL { + ShareSheet(activityItems: [shareURL]) + } + } + ) + #endif } var controls: some View { @@ -116,56 +129,89 @@ struct ControlsBar: View { var details: some View { HStack { HStack(spacing: 8) { - authorAvatar - .contextMenu { - if let video = model.currentVideo { - Group { - Section { - Text(video.title) + ZStack(alignment: .bottomTrailing) { + authorAvatar - if accounts.app.supportsUserPlaylists && accounts.signedIn { - Section { + if accounts.app.supportsSubscriptions, + accounts.signedIn, + let video = model.currentVideo, + subscriptions.isSubscribing(video.channel.id) + { + Image(systemName: "star.circle.fill") + .background(Color.background) + .clipShape(Circle()) + .foregroundColor(.secondary) + } + } + .contextMenu { + if let video = model.currentVideo { + Group { + Section { + Text(video.title) + + if accounts.app.supportsUserPlaylists && accounts.signedIn { + Section { + Button { + navigation.presentAddToPlaylist(video) + } label: { + Label("Add to Playlist...", systemImage: "text.badge.plus") + } + + if let playlist = playlists.lastUsed, let video = model.currentVideo { Button { - navigation.presentAddToPlaylist(video) + playlists.addVideo(playlistID: playlist.id, videoID: video.videoID, navigation: navigation) } label: { - Label("Add to Playlist...", systemImage: "text.badge.plus") - } - - if let playlist = playlists.lastUsed, let video = model.currentVideo { - Button { - playlists.addVideo(playlistID: playlist.id, videoID: video.videoID, navigation: navigation) - } label: { - Label("Add to \(playlist.title)", systemImage: "text.badge.star") - } - } - - Button {} label: { - Label("Share", systemImage: "square.and.arrow.up") + Label("Add to \(playlist.title)", systemImage: "text.badge.star") } } } - Section { - Button { - NavigationModel.openChannel( - video.channel, - player: model, - recents: recents, - navigation: navigation - ) - } label: { - Label("\(video.author) Channel", systemImage: "rectangle.stack.fill.badge.person.crop") - } + ShareButton( + contentItem: .init(video: model.currentVideo), + presentingShareSheet: $presentingShareSheet, + shareURL: $shareURL + ) + } - Button {} label: { - Label("Unsubscribe", systemImage: "xmark.circle") + Section { + Button { + NavigationModel.openChannel( + video.channel, + player: model, + recents: recents, + navigation: navigation + ) + } label: { + Label("\(video.author) Channel", systemImage: "rectangle.stack.fill.badge.person.crop") + } + + if accounts.app.supportsSubscriptions, accounts.signedIn { + if subscriptions.isSubscribing(video.channel.id) { + Button { + #if os(tvOS) + subscriptions.unsubscribe(video.channel.id) + #else + navigation.presentUnsubscribeAlert(video.channel, subscriptions: subscriptions) + #endif + } label: { + Label("Unsubscribe", systemImage: "xmark.circle") + } + } else { + Button { + subscriptions.subscribe(video.channel.id) { + navigation.sidebarSectionChanged.toggle() + } + } label: { + Label("Subscribe", systemImage: "star.circle") + } } } } } - .labelStyle(.automatic) } + .labelStyle(.automatic) } + } VStack(alignment: .leading, spacing: 5) { Text(model.currentVideo?.title ?? "Not playing") diff --git a/Shared/Views/ShareButton.swift b/Shared/Views/ShareButton.swift index 2bd0bc1e..f1c7ecfd 100644 --- a/Shared/Views/ShareButton.swift +++ b/Shared/Views/ShareButton.swift @@ -25,7 +25,6 @@ struct ShareButton: View { youtubeActions } label: { Label("Share", systemImage: "square.and.arrow.up") - .labelStyle(.iconOnly) } .menuStyle(.borderlessButton) #if os(macOS) diff --git a/Shared/Views/VideoContextMenuView.swift b/Shared/Views/VideoContextMenuView.swift index e7ff4731..068790fa 100644 --- a/Shared/Views/VideoContextMenuView.swift +++ b/Shared/Views/VideoContextMenuView.swift @@ -67,16 +67,6 @@ struct VideoContextMenuView: View { addToQueueButton } - if !inChannelView, !inChannelPlaylistView { - Section { - openChannelButton - - if accounts.app.supportsSubscriptions, accounts.api.signedIn { - subscriptionButton - } - } - } - if accounts.app.supportsUserPlaylists, accounts.signedIn { Section { addToPlaylistButton @@ -88,6 +78,16 @@ struct VideoContextMenuView: View { } } + if !inChannelView, !inChannelPlaylistView { + Section { + openChannelButton + + if accounts.app.supportsSubscriptions, accounts.api.signedIn { + subscriptionButton + } + } + } + #if os(tvOS) Button("Cancel", role: .cancel) {} #endif @@ -205,7 +205,7 @@ struct VideoContextMenuView: View { #if os(tvOS) subscriptions.unsubscribe(video.channel.id) #else - navigation.presentUnsubscribeAlert(video.channel) + navigation.presentUnsubscribeAlert(video.channel, subscriptions: subscriptions) #endif } label: { Label("Unsubscribe", systemImage: "xmark.circle")