Improve sharing

This commit is contained in:
Arkadiusz Fal 2022-06-25 01:21:05 +02:00
parent f3f8466a95
commit c88b410936
7 changed files with 107 additions and 126 deletions

View File

@ -179,9 +179,20 @@ final class NavigationModel: ObservableObject {
presentingPlaylistForm = true presentingPlaylistForm = true
} }
func presentUnsubscribeAlert(_ channel: Channel?) { func presentUnsubscribeAlert(_ channel: Channel, subscriptions: SubscriptionsModel) {
channelToUnsubscribe = channel 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() { func hideKeyboard() {

View File

@ -15,7 +15,7 @@ struct AppSidebarSubscriptions: View {
} }
.contextMenu { .contextMenu {
Button("Unsubscribe") { Button("Unsubscribe") {
navigation.presentUnsubscribeAlert(channel) navigation.presentUnsubscribeAlert(channel, subscriptions: subscriptions)
} }
} }
.id("channel\(channel.id)") .id("channel\(channel.id)")

View File

@ -107,17 +107,6 @@ struct ContentView: View {
} }
) )
#endif #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 } .alert(isPresented: $navigation.presentingAlert) { navigation.alert }
} }

View File

@ -29,10 +29,6 @@ struct VideoDetails: View {
@State private var subscribed = false @State private var subscribed = false
@State private var subscriptionToggleButtonDisabled = 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() @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 { private var contentItem: ContentItem {
ContentItem(video: player.currentVideo!) ContentItem(video: player.currentVideo!)
} }

View File

@ -14,6 +14,10 @@ struct ControlsBar: View {
@EnvironmentObject<PlayerModel> private var model @EnvironmentObject<PlayerModel> private var model
@EnvironmentObject<PlaylistsModel> private var playlists @EnvironmentObject<PlaylistsModel> private var playlists
@EnvironmentObject<RecentsModel> private var recents @EnvironmentObject<RecentsModel> private var recents
@EnvironmentObject<SubscriptionsModel> private var subscriptions
@State private var presentingShareSheet = false
@State private var shareURL: URL?
@StateObject private var controlsPage = Page.first() @StateObject private var controlsPage = Page.first()
@ -36,6 +40,15 @@ struct ControlsBar: View {
.borderTop(height: 0.4, color: Color("ControlsBorderColor")) .borderTop(height: 0.4, color: Color("ControlsBorderColor"))
.borderBottom(height: 0.4, color: Color("ControlsBorderColor")) .borderBottom(height: 0.4, color: Color("ControlsBorderColor"))
.modifier(ControlBackgroundModifier(edgesIgnoringSafeArea: .bottom)) .modifier(ControlBackgroundModifier(edgesIgnoringSafeArea: .bottom))
#if os(iOS)
.background(
EmptyView().sheet(isPresented: $presentingShareSheet) {
if let shareURL = shareURL {
ShareSheet(activityItems: [shareURL])
}
}
)
#endif
} }
var controls: some View { var controls: some View {
@ -116,56 +129,89 @@ struct ControlsBar: View {
var details: some View { var details: some View {
HStack { HStack {
HStack(spacing: 8) { HStack(spacing: 8) {
authorAvatar ZStack(alignment: .bottomTrailing) {
.contextMenu { authorAvatar
if let video = model.currentVideo {
Group {
Section {
Text(video.title)
if accounts.app.supportsUserPlaylists && accounts.signedIn { if accounts.app.supportsSubscriptions,
Section { 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 { Button {
navigation.presentAddToPlaylist(video) playlists.addVideo(playlistID: playlist.id, videoID: video.videoID, navigation: navigation)
} label: { } label: {
Label("Add to Playlist...", systemImage: "text.badge.plus") Label("Add to \(playlist.title)", systemImage: "text.badge.star")
}
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")
} }
} }
} }
Section { ShareButton(
Button { contentItem: .init(video: model.currentVideo),
NavigationModel.openChannel( presentingShareSheet: $presentingShareSheet,
video.channel, shareURL: $shareURL
player: model, )
recents: recents, }
navigation: navigation
)
} label: {
Label("\(video.author) Channel", systemImage: "rectangle.stack.fill.badge.person.crop")
}
Button {} label: { Section {
Label("Unsubscribe", systemImage: "xmark.circle") 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) { VStack(alignment: .leading, spacing: 5) {
Text(model.currentVideo?.title ?? "Not playing") Text(model.currentVideo?.title ?? "Not playing")

View File

@ -25,7 +25,6 @@ struct ShareButton: View {
youtubeActions youtubeActions
} label: { } label: {
Label("Share", systemImage: "square.and.arrow.up") Label("Share", systemImage: "square.and.arrow.up")
.labelStyle(.iconOnly)
} }
.menuStyle(.borderlessButton) .menuStyle(.borderlessButton)
#if os(macOS) #if os(macOS)

View File

@ -67,16 +67,6 @@ struct VideoContextMenuView: View {
addToQueueButton addToQueueButton
} }
if !inChannelView, !inChannelPlaylistView {
Section {
openChannelButton
if accounts.app.supportsSubscriptions, accounts.api.signedIn {
subscriptionButton
}
}
}
if accounts.app.supportsUserPlaylists, accounts.signedIn { if accounts.app.supportsUserPlaylists, accounts.signedIn {
Section { Section {
addToPlaylistButton addToPlaylistButton
@ -88,6 +78,16 @@ struct VideoContextMenuView: View {
} }
} }
if !inChannelView, !inChannelPlaylistView {
Section {
openChannelButton
if accounts.app.supportsSubscriptions, accounts.api.signedIn {
subscriptionButton
}
}
}
#if os(tvOS) #if os(tvOS)
Button("Cancel", role: .cancel) {} Button("Cancel", role: .cancel) {}
#endif #endif
@ -205,7 +205,7 @@ struct VideoContextMenuView: View {
#if os(tvOS) #if os(tvOS)
subscriptions.unsubscribe(video.channel.id) subscriptions.unsubscribe(video.channel.id)
#else #else
navigation.presentUnsubscribeAlert(video.channel) navigation.presentUnsubscribeAlert(video.channel, subscriptions: subscriptions)
#endif #endif
} label: { } label: {
Label("Unsubscribe", systemImage: "xmark.circle") Label("Unsubscribe", systemImage: "xmark.circle")