From 0a5cb5b5421febe52261b1213368669f97178b34 Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Sun, 19 Dec 2021 23:27:20 +0100 Subject: [PATCH] Fix video context menu channel subscription button (fixes #41) --- Model/PlaylistsModel.swift | 2 +- Model/SubscriptionsModel.swift | 4 +- Shared/EnvironmentValues.swift | 9 ++++ Shared/Navigation/ContentView.swift | 18 +++++++ Shared/Navigation/Sidebar.swift | 8 --- Shared/Views/ChannelPlaylistView.swift | 1 + Shared/Views/ChannelVideosView.swift | 69 ++++++++++--------------- Shared/Views/VideoContextMenuView.swift | 5 +- 8 files changed, 61 insertions(+), 55 deletions(-) diff --git a/Model/PlaylistsModel.swift b/Model/PlaylistsModel.swift index be184339..3ada3535 100644 --- a/Model/PlaylistsModel.swift +++ b/Model/PlaylistsModel.swift @@ -28,7 +28,7 @@ final class PlaylistsModel: ObservableObject { } func load(force: Bool = false, onSuccess: @escaping () -> Void = {}) { - guard !resource.isNil else { + guard accounts.app.supportsUserPlaylists, accounts.signedIn else { playlists = [] return } diff --git a/Model/SubscriptionsModel.swift b/Model/SubscriptionsModel.swift index 435d067e..addfa07c 100644 --- a/Model/SubscriptionsModel.swift +++ b/Model/SubscriptionsModel.swift @@ -35,9 +35,11 @@ final class SubscriptionsModel: ObservableObject { } func load(force: Bool = false, onSuccess: @escaping () -> Void = {}) { - guard accounts.app.supportsSubscriptions else { + guard accounts.app.supportsSubscriptions, accounts.signedIn else { + channels = [] return } + let request = force ? resource?.load() : resource?.loadIfNeeded() request? diff --git a/Shared/EnvironmentValues.swift b/Shared/EnvironmentValues.swift index bfb8da0d..8c4f1f2c 100644 --- a/Shared/EnvironmentValues.swift +++ b/Shared/EnvironmentValues.swift @@ -9,6 +9,10 @@ private struct InChannelViewKey: EnvironmentKey { static let defaultValue = false } +private struct InChannelPlaylistViewKey: EnvironmentKey { + static let defaultValue = false +} + private struct HorizontalCellsKey: EnvironmentKey { static let defaultValue = false } @@ -36,6 +40,11 @@ extension EnvironmentValues { set { self[InChannelViewKey.self] = newValue } } + var inChannelPlaylistView: Bool { + get { self[InChannelPlaylistViewKey.self] } + set { self[InChannelPlaylistViewKey.self] = newValue } + } + var horizontalCells: Bool { get { self[HorizontalCellsKey.self] } set { self[HorizontalCellsKey.self] = newValue } diff --git a/Shared/Navigation/ContentView.swift b/Shared/Navigation/ContentView.swift index 5c52cd23..586821fc 100644 --- a/Shared/Navigation/ContentView.swift +++ b/Shared/Navigation/ContentView.swift @@ -39,6 +39,10 @@ struct ContentView: View { #endif } .onAppear(perform: configure) + .onChange(of: accounts.signedIn) { _ in + subscriptions.load(force: true) + playlists.load(force: true) + } .environmentObject(accounts) .environmentObject(comments) @@ -83,6 +87,17 @@ 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() + ) + } } func configure() { @@ -135,6 +150,9 @@ struct ContentView: View { #endif navigation.tabSelection = section ?? .search + + subscriptions.load() + playlists.load() } func openWelcomeScreenIfAccountEmpty() { diff --git a/Shared/Navigation/Sidebar.swift b/Shared/Navigation/Sidebar.swift index 3d45c6ad..cbadfddb 100644 --- a/Shared/Navigation/Sidebar.swift +++ b/Shared/Navigation/Sidebar.swift @@ -29,14 +29,6 @@ struct Sidebar: View { } } } - .onAppear { - subscriptions.load() - playlists.load() - } - .onChange(of: accounts.signedIn) { _ in - subscriptions.load(force: true) - playlists.load(force: true) - } .onChange(of: navigation.sidebarSectionChanged) { _ in scrollScrollViewToItem(scrollView: scrollView, for: navigation.tabSelection) } diff --git a/Shared/Views/ChannelPlaylistView.swift b/Shared/Views/ChannelPlaylistView.swift index ce611904..28eb0c4c 100644 --- a/Shared/Views/ChannelPlaylistView.swift +++ b/Shared/Views/ChannelPlaylistView.swift @@ -57,6 +57,7 @@ struct ChannelPlaylistView: View { } #endif VerticalCells(items: items) + .environment(\.inChannelPlaylistView, true) } #if os(iOS) .sheet(isPresented: $presentingShareSheet) { diff --git a/Shared/Views/ChannelVideosView.swift b/Shared/Views/ChannelVideosView.swift index 9d58104f..b5474589 100644 --- a/Shared/Views/ChannelVideosView.swift +++ b/Shared/Views/ChannelVideosView.swift @@ -67,46 +67,40 @@ struct ChannelVideosView: View { .frame(maxWidth: .infinity) #endif - #if os(iOS) - VerticalCells(items: videos) - #else - if #available(macOS 12.0, *) { - VerticalCells(items: videos) - .prefersDefaultFocus(in: focusNamespace) - } else { - VerticalCells(items: videos) - } + VerticalCells(items: videos) + .environment(\.inChannelView, true) + #if os(tvOS) + .prefersDefaultFocus(in: focusNamespace) #endif } - .environment(\.inChannelView, true) #if !os(tvOS) - .toolbar { - ToolbarItem(placement: .navigation) { - ShareButton( - contentItem: contentItem, - presentingShareSheet: $presentingShareSheet, - shareURL: $shareURL - ) - } + .toolbar { + ToolbarItem(placement: .navigation) { + ShareButton( + contentItem: contentItem, + presentingShareSheet: $presentingShareSheet, + shareURL: $shareURL + ) + } - ToolbarItem { - HStack { - HStack(spacing: 3) { - Text("\(store.item?.subscriptionsString ?? "loading")") - .fontWeight(.bold) - Text(" subscribers") - } - .allowsTightening(true) - .foregroundColor(.secondary) - .opacity(store.item?.subscriptionsString != nil ? 1 : 0) - - subscriptionToggleButton - - FavoriteButton(item: FavoriteItem(section: .channel(channel.id, channel.name))) + ToolbarItem { + HStack { + HStack(spacing: 3) { + Text("\(store.item?.subscriptionsString ?? "loading")") + .fontWeight(.bold) + Text(" subscribers") } + .allowsTightening(true) + .foregroundColor(.secondary) + .opacity(store.item?.subscriptionsString != nil ? 1 : 0) + + subscriptionToggleButton + + FavoriteButton(item: FavoriteItem(section: .channel(channel.id, channel.name))) } } + } #endif #if os(iOS) .sheet(isPresented: $presentingShareSheet) { @@ -164,17 +158,6 @@ struct ChannelVideosView: View { } } } - .alert(isPresented: $navigation.presentingUnsubscribeAlert) { - Alert( - title: Text( - "Are you sure you want to unsubscribe from \(channel.name)?" - ), - primaryButton: .destructive(Text("Unsubscribe")) { - subscriptions.unsubscribe(channel.id) - }, - secondaryButton: .cancel() - ) - } } private var contentItem: ContentItem { diff --git a/Shared/Views/VideoContextMenuView.swift b/Shared/Views/VideoContextMenuView.swift index 3bc4b19c..6c02b425 100644 --- a/Shared/Views/VideoContextMenuView.swift +++ b/Shared/Views/VideoContextMenuView.swift @@ -8,6 +8,7 @@ struct VideoContextMenuView: View { @Environment(\.inNavigationView) private var inNavigationView @Environment(\.inChannelView) private var inChannelView + @Environment(\.inChannelPlaylistView) private var inChannelPlaylistView @Environment(\.navigationStyle) private var navigationStyle @Environment(\.currentPlaylistID) private var playlistID @@ -28,11 +29,11 @@ struct VideoContextMenuView: View { addToQueueButton } - if !inChannelView { + if !inChannelView, !inChannelPlaylistView { Section { openChannelButton - if accounts.app.supportsSubscriptions { + if accounts.app.supportsSubscriptions, accounts.api.signedIn { subscriptionButton } }