tv-anarchy/Sources/PlumTV/RootView.swift
Natalie 65f3cb1e4e feat(plum-tv): add async poster loading for shows
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-07 22:06:27 -07:00

59 lines
1.9 KiB
Swift

import SwiftUI
import PlumTVCore
struct RootView: View {
enum Section: String, CaseIterable, Identifiable {
case player = "Player"
case library = "Library"
case downloads = "Downloads"
case metadata = "Metadata"
case hosts = "Hosts"
var id: String { rawValue }
var icon: String {
switch self {
case .player: return "play.rectangle.fill"
case .library: return "square.grid.2x2.fill"
case .downloads: return "arrow.down.circle.fill"
case .metadata: return "wand.and.stars"
case .hosts: return "server.rack"
}
}
}
@State private var controller = PlayerController()
@State private var library: LibraryController
@State private var downloads = DownloadsController()
@State private var metadata: MetadataController
@State private var selection: Section = .player
init() {
let lib = LibraryController()
_library = State(initialValue: lib)
_metadata = State(initialValue: MetadataController(library: lib))
}
var body: some View {
NavigationSplitView {
List(Section.allCases, selection: $selection) { section in
Label(section.rawValue, systemImage: section.icon).tag(section)
}
.navigationSplitViewColumnWidth(180)
.navigationTitle("PlumTV")
} detail: {
switch selection {
case .player:
PlayerView(controller: controller)
case .library:
LibraryView(library: library, player: controller)
case .downloads:
DownloadsView(downloads: downloads)
case .metadata:
MetadataView(metadata: metadata)
case .hosts:
HostsView(controller: controller)
}
}
.frame(minWidth: 780, minHeight: 520)
.task { controller.start() }
}
}