mirror of
https://github.com/yattee/yattee.git
synced 2024-11-12 17:18:22 +00:00
Improve sharing
This commit is contained in:
parent
f3f8466a95
commit
c88b410936
@ -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() {
|
||||||
|
@ -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)")
|
||||||
|
@ -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 }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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!)
|
||||||
}
|
}
|
||||||
|
@ -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")
|
||||||
|
@ -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)
|
||||||
|
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user