From d17dac287db069181d062f151de4a534f218412c Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 26 May 2026 22:08:17 +0200 Subject: [PATCH] feat(remote): add network status banners, disable write actions in remote mode --- Music/ContentView.swift | 30 ++++++++++++++++++++++++++++++ Music/Views/PlaylistBarView.swift | 11 +++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Music/ContentView.swift b/Music/ContentView.swift index 2299888..1e58865 100644 --- a/Music/ContentView.swift +++ b/Music/ContentView.swift @@ -26,6 +26,35 @@ struct ContentView: View { var body: some View { VStack(spacing: 0) { + if let status = networkStatus { + switch status.mode { + case .remote(let hostName): + HStack(spacing: 8) { + Image(systemName: "antenna.radiowaves.left.and.right") + .font(.system(size: 10)).foregroundStyle(.blue) + Text("Connected to \(hostName)") + .font(.system(size: 11, weight: .medium)).foregroundStyle(.blue) + Spacer() + Button("Refresh") { status.onRefreshLibrary?() } + .font(.system(size: 11)).buttonStyle(.plain).foregroundStyle(.secondary) + Button("Disconnect") { status.onDisconnect?() } + .font(.system(size: 11)).buttonStyle(.plain).foregroundStyle(.red) + } + .padding(.horizontal, 12).padding(.vertical, 4) + .background(Color.blue.opacity(0.08)) + case .hosting(let remoteName): + HStack(spacing: 8) { + Image(systemName: "antenna.radiowaves.left.and.right") + .font(.system(size: 10)).foregroundStyle(.green) + Text(remoteName != nil ? "Hosting ยท \(remoteName!) connected" : "Hosting") + .font(.system(size: 11, weight: .medium)).foregroundStyle(.green) + Spacer() + } + .padding(.horizontal, 12).padding(.vertical, 4) + .background(Color.green.opacity(0.08)) + } + } + SearchBarView( searchText: $searchText, trackCount: playlist.selectedItem != nil ? playlist.playlistTracks.count : library.trackCount, @@ -152,6 +181,7 @@ struct ContentView: View { playlists: playlist.allPlaylists, selectedItem: showHome ? nil : playlist.selectedItem, isHomeSelected: showHome, + isRemoteMode: networkStatus?.isRemoteMode ?? false, onHomeSelect: { if showHome { showHome = false diff --git a/Music/Views/PlaylistBarView.swift b/Music/Views/PlaylistBarView.swift index 91e7476..e87ddb2 100644 --- a/Music/Views/PlaylistBarView.swift +++ b/Music/Views/PlaylistBarView.swift @@ -4,6 +4,7 @@ struct PlaylistBarView: View { var playlists: [any PlaylistRepresentable] var selectedItem: (any PlaylistRepresentable)? var isHomeSelected: Bool + var isRemoteMode: Bool = false var onHomeSelect: () -> Void var onSelect: (any PlaylistRepresentable) -> Void var onDeselect: () -> Void @@ -35,11 +36,13 @@ struct PlaylistBarView: View { } ) .contextMenu { - Button("Rename...") { onRename(item) } - if let smart = item as? SmartPlaylist { - Button("Edit Search Query...") { onEditQuery(smart) } + if !isRemoteMode { + Button("Rename...") { onRename(item) } + if let smart = item as? SmartPlaylist { + Button("Edit Search Query...") { onEditQuery(smart) } + } + Button("Delete") { onDelete(item) } } - Button("Delete") { onDelete(item) } } } }