Fix video context menu channel subscription button (fixes #41)

This commit is contained in:
Arkadiusz Fal 2021-12-19 23:27:20 +01:00
parent f132ba9683
commit 0a5cb5b542
8 changed files with 61 additions and 55 deletions

View File

@ -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
}

View File

@ -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?

View File

@ -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 }

View File

@ -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() {

View File

@ -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)
}

View File

@ -57,6 +57,7 @@ struct ChannelPlaylistView: View {
}
#endif
VerticalCells(items: items)
.environment(\.inChannelPlaylistView, true)
}
#if os(iOS)
.sheet(isPresented: $presentingShareSheet) {

View File

@ -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 {

View File

@ -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
}
}