From c04533d0a881419ef26165e46c93e927b5744eb0 Mon Sep 17 00:00:00 2001 From: Laurent Date: Sat, 30 May 2026 13:39:47 +0200 Subject: [PATCH] chore: add import Foundation and clarifying comments to context menu code --- Music/ContentView.swift | 2 ++ Music/Models/TrackContextMenuConfig.swift | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Music/ContentView.swift b/Music/ContentView.swift index f70abd5..a0d7dc3 100644 --- a/Music/ContentView.swift +++ b/Music/ContentView.swift @@ -366,6 +366,8 @@ struct ContentView: View { onAddToLastPlaylist: { track in try? playlist.addTrackToLastUsedPlaylist(track) }, + // Outer nil hides the "Remove from Playlist" menu item when not in a playlist view. + // Inner re-check defends against the playlist being deselected between menu display and action. onRemoveFromPlaylist: playlist.selectedPlaylist != nil ? { track in if let selected = playlist.selectedPlaylist { try? playlist.removeTrack(track, from: selected) diff --git a/Music/Models/TrackContextMenuConfig.swift b/Music/Models/TrackContextMenuConfig.swift index a089db2..07b9c82 100644 --- a/Music/Models/TrackContextMenuConfig.swift +++ b/Music/Models/TrackContextMenuConfig.swift @@ -1,8 +1,13 @@ +import Foundation + +// `nonisolated` opts this struct out of the project-wide `SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor` +// setting (same reason as Track, Playlist, etc.). `Sendable` is omitted because the closure +// properties are not Sendable — the config is created and consumed exclusively on @MainActor. nonisolated struct TrackContextMenuConfig { let playlists: [Playlist] let lastUsedPlaylistName: String? let selectedPlaylist: Playlist? let onAddToPlaylist: (Track, Playlist) -> Void - let onAddToLastPlaylist: ((Track) -> Void)? + let onAddToLastPlaylist: ((Track) -> Void)? // nil hides the "Add to [last]" button; always non-nil in practice let onRemoveFromPlaylist: ((Track) -> Void)? }