From a1046b90800c6a53d64610063a1f46a387e518ff Mon Sep 17 00:00:00 2001 From: tsibog Date: Thu, 13 Aug 2026 14:55:09 +0000 Subject: [PATCH 1/3] fix(player): pass playerBarNavigationAction to sidebar playlist views viewForSidebarPinnedItem creates PlaylistDetailView without a playerBarNavigationAction, defaulting to .disabled. This makes the artist name and album thumbnail in the player bar non-clickable when playing from a sidebar playlist. Liked Music already passes one (likedMusicPlayerBarNavigationAction); apply the same pattern using the per-item pinnedNavigationPaths binding via .playerBarMusicNavigation. Fixes #437 --- Sources/Kaset/Views/MainWindow.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/Kaset/Views/MainWindow.swift b/Sources/Kaset/Views/MainWindow.swift index 8565692e7..8964cf31e 100644 --- a/Sources/Kaset/Views/MainWindow.swift +++ b/Sources/Kaset/Views/MainWindow.swift @@ -696,6 +696,10 @@ struct MainWindow: View { // swiftlint:disable:this type_body_length } .id(item.contentId) .navigationDestinations(client: client) + .playerBarMusicNavigation(path: Binding( + get: { self.pinnedNavigationPaths[item.contentId, default: NavigationPath()] }, + set: { self.pinnedNavigationPaths[item.contentId] = $0 } + )) } .environment(\.libraryViewModel, self.libraryViewModel) .environment(\.onPlaylistDeleted) { From 03ea506b213540963e65f5b4bbca6422dc783bf1 Mon Sep 17 00:00:00 2001 From: tsibog Date: Thu, 13 Aug 2026 21:16:08 +0000 Subject: [PATCH 2/3] chore: retrigger CI (flaky HistoryViewModelTests) From 231cc1dcb318b6087c516ddadaaebce441a9d7b0 Mon Sep 17 00:00:00 2001 From: tsibog Date: Sat, 15 Aug 2026 21:39:40 +0200 Subject: [PATCH 3/3] fix(player): pass playerBarNavigationAction to sidebar playlist views PlaylistDetailView/SimplePlaylistDetailView set the environment on their own PlayerBar, overriding any value set higher up the tree. Passing the action only via .playerBarMusicNavigation left it at .disabled, so artist and album names stayed unclickable when playing from a sidebar playlist. Build the per-item action from pinnedNavigationPaths and pass it into the detail views and navigationDestinations, matching the Liked Music path. Extract the duplicated path binding into a helper. --- Sources/Kaset/Views/MainWindow.swift | 36 +++++++++++++++++++--------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/Sources/Kaset/Views/MainWindow.swift b/Sources/Kaset/Views/MainWindow.swift index 8964cf31e..06dfc2ec7 100644 --- a/Sources/Kaset/Views/MainWindow.swift +++ b/Sources/Kaset/Views/MainWindow.swift @@ -665,14 +665,26 @@ struct MainWindow: View { // swiftlint:disable:this type_body_length ) } + private func pinnedItemNavigationPath(for contentId: String) -> Binding { + Binding( + get: { self.pinnedNavigationPaths[contentId, default: NavigationPath()] }, + set: { self.pinnedNavigationPaths[contentId] = $0 } + ) + } + + private func pinnedItemPlayerBarNavigationAction(for contentId: String) -> PlayerBarNavigationAction { + PlayerBarNavigationAction( + openArtist: { self.pinnedNavigationPaths[contentId, default: NavigationPath()].append($0) }, + openAlbum: { self.pinnedNavigationPaths[contentId, default: NavigationPath()].append($0) } + ) + } + private func viewForSidebarPinnedItem( _ item: SidebarPinnedItem, client: any YTMusicClientProtocol ) -> some View { - NavigationStack(path: Binding( - get: { self.pinnedNavigationPaths[item.contentId, default: NavigationPath()] }, - set: { self.pinnedNavigationPaths[item.contentId] = $0 } - )) { + let playerBarNavigationAction = self.pinnedItemPlayerBarNavigationAction(for: item.contentId) + return NavigationStack(path: self.pinnedItemNavigationPath(for: item.contentId)) { Group { if !self.usesLegacyMacOS15UI, #available(macOS 26.0, *) { PlaylistDetailView( @@ -680,7 +692,8 @@ struct MainWindow: View { // swiftlint:disable:this type_body_length viewModel: PlaylistDetailViewModel( playlist: item.playlistRoute, client: client - ) + ), + playerBarNavigationAction: playerBarNavigationAction ) .environment(\.libraryViewModel, self.libraryViewModel) } else { @@ -689,17 +702,18 @@ struct MainWindow: View { // swiftlint:disable:this type_body_length viewModel: PlaylistDetailViewModel( playlist: item.playlistRoute, client: client - ) + ), + playerBarNavigationAction: playerBarNavigationAction ) .environment(\.libraryViewModel, self.libraryViewModel) } } .id(item.contentId) - .navigationDestinations(client: client) - .playerBarMusicNavigation(path: Binding( - get: { self.pinnedNavigationPaths[item.contentId, default: NavigationPath()] }, - set: { self.pinnedNavigationPaths[item.contentId] = $0 } - )) + .navigationDestinations( + client: client, + playerBarNavigationAction: playerBarNavigationAction + ) + .playerBarMusicNavigation(path: self.pinnedItemNavigationPath(for: item.contentId)) } .environment(\.libraryViewModel, self.libraryViewModel) .environment(\.onPlaylistDeleted) {