feat(remote): add network status banners, disable write actions in remote mode

feat/music-streaming
Laurent 1 month ago
parent 4b256f7811
commit d17dac287d
  1. 30
      Music/ContentView.swift
  2. 11
      Music/Views/PlaylistBarView.swift

@ -26,6 +26,35 @@ struct ContentView: View {
var body: some View { var body: some View {
VStack(spacing: 0) { 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( SearchBarView(
searchText: $searchText, searchText: $searchText,
trackCount: playlist.selectedItem != nil ? playlist.playlistTracks.count : library.trackCount, trackCount: playlist.selectedItem != nil ? playlist.playlistTracks.count : library.trackCount,
@ -152,6 +181,7 @@ struct ContentView: View {
playlists: playlist.allPlaylists, playlists: playlist.allPlaylists,
selectedItem: showHome ? nil : playlist.selectedItem, selectedItem: showHome ? nil : playlist.selectedItem,
isHomeSelected: showHome, isHomeSelected: showHome,
isRemoteMode: networkStatus?.isRemoteMode ?? false,
onHomeSelect: { onHomeSelect: {
if showHome { if showHome {
showHome = false showHome = false

@ -4,6 +4,7 @@ struct PlaylistBarView: View {
var playlists: [any PlaylistRepresentable] var playlists: [any PlaylistRepresentable]
var selectedItem: (any PlaylistRepresentable)? var selectedItem: (any PlaylistRepresentable)?
var isHomeSelected: Bool var isHomeSelected: Bool
var isRemoteMode: Bool = false
var onHomeSelect: () -> Void var onHomeSelect: () -> Void
var onSelect: (any PlaylistRepresentable) -> Void var onSelect: (any PlaylistRepresentable) -> Void
var onDeselect: () -> Void var onDeselect: () -> Void
@ -35,11 +36,13 @@ struct PlaylistBarView: View {
} }
) )
.contextMenu { .contextMenu {
Button("Rename...") { onRename(item) } if !isRemoteMode {
if let smart = item as? SmartPlaylist { Button("Rename...") { onRename(item) }
Button("Edit Search Query...") { onEditQuery(smart) } if let smart = item as? SmartPlaylist {
Button("Edit Search Query...") { onEditQuery(smart) }
}
Button("Delete") { onDelete(item) }
} }
Button("Delete") { onDelete(item) }
} }
} }
} }

Loading…
Cancel
Save