Create BearWave macOS radio-first app
This commit is contained in:
79
Sources/BearWaveCore/Views/SidebarView.swift
Normal file
79
Sources/BearWaveCore/Views/SidebarView.swift
Normal file
@@ -0,0 +1,79 @@
|
||||
import SwiftUI
|
||||
|
||||
struct SidebarView: View {
|
||||
@Environment(AppModel.self) private var model
|
||||
@State private var showingNewFolderSheet = false
|
||||
@State private var selection: String = ""
|
||||
|
||||
var body: some View {
|
||||
List(selection: $selection) {
|
||||
Section("Stations") {
|
||||
pageRow(.top)
|
||||
pageRow(.germany)
|
||||
pageRow(.netherlands)
|
||||
pageRow(.world)
|
||||
pageRow(.search, badge: model.library.selectedPage == .search ? model.library.stations.count : nil)
|
||||
}
|
||||
Section("Library") {
|
||||
pageRow(.favorites, badge: model.library.favorites.count)
|
||||
pageRow(.recent, badge: model.library.recentStations.count)
|
||||
pageRow(.manual, badge: model.library.manualStations.count)
|
||||
}
|
||||
if !model.library.groups.isEmpty {
|
||||
Section("Folders") {
|
||||
ForEach(model.library.groups.sorted { $0.sortOrder < $1.sortOrder }) { group in
|
||||
GroupRowView(group: group)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
updateSelection()
|
||||
}
|
||||
.onChange(of: model.library.selectedPage) { _, _ in updateSelection() }
|
||||
.onChange(of: model.library.selectedGroupID) { _, _ in updateSelection() }
|
||||
.onChange(of: selection) { _, newValue in
|
||||
handleSelectionChange(newValue)
|
||||
}
|
||||
.listStyle(.sidebar)
|
||||
.navigationSplitViewColumnWidth(min: 190, ideal: 220, max: 280)
|
||||
.contextMenu {
|
||||
Button("New Folder") {
|
||||
showingNewFolderSheet = true
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showingNewFolderSheet) {
|
||||
NewGroupView()
|
||||
.environment(model)
|
||||
}
|
||||
}
|
||||
|
||||
private func updateSelection() {
|
||||
if model.library.selectedPage == .group {
|
||||
selection = model.library.selectedGroupID ?? ""
|
||||
} else {
|
||||
selection = model.library.selectedPage.rawValue
|
||||
}
|
||||
}
|
||||
|
||||
private func handleSelectionChange(_ value: String) {
|
||||
if let group = model.library.groups.first(where: { $0.id == value }) {
|
||||
model.library.selectGroup(group)
|
||||
} else if let page = StationPage(rawValue: value) {
|
||||
Task { await model.library.load(page) }
|
||||
}
|
||||
}
|
||||
|
||||
private func pageRow(_ page: StationPage, badge: Int? = nil) -> some View {
|
||||
HStack {
|
||||
Label(page.title, systemImage: page.systemImage)
|
||||
Spacer()
|
||||
if let badge, badge > 0 {
|
||||
Text(badge, format: .number)
|
||||
.font(.caption)
|
||||
.foregroundStyle(.secondary)
|
||||
}
|
||||
}
|
||||
.tag(page.rawValue)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user