import SwiftUI /// The native interface: feeds beside items, with the player bar under both. /// /// What is not here yet has somewhere to go rather than being missing. The item pane is #4 and /// the management screens are #5; until then the toolbar's Page button opens ipx's own page, /// which is still the whole app in a web view and can do everything this cannot. struct LibraryView: View { @ObservedObject var store: LibraryStore @ObservedObject var playback: Playback /// The file is the one asked for, or the item's first playable one. var play: (IPX.Entry, IPX.Enclosure?) -> Void var openPage: (WebViewController.Screen) -> Void /// Everything that lives in the page, named rather than hidden behind one button: it should /// be as easy to reach Settings here as it is in a browser. private var pageMenu: some View { Menu { Button { openPage(.settings) } label: { Label("Settings", systemImage: "gearshape") } Button { openPage(.directory) } label: { Label("Directory", systemImage: "square.grid.2x2") } Button { openPage(.popular) } label: { Label("Popular", systemImage: "star") } Button { openPage(.opml) } label: { Label("Import or export OPML", systemImage: "square.and.arrow.up") } if store.isAdmin { Divider() Button { openPage(.admin) } label: { Label("Admin", systemImage: "wrench.and.screwdriver") } } Divider() Button { openPage(.page) } label: { Label("Open the full page", systemImage: "safari") } } label: { Image(systemName: "ellipsis.circle") } .accessibilityLabel("More") .help("Settings, the directory, OPML") } var body: some View { NavigationSplitView { FeedListView(store: store) .background(Glass.Wash()) } detail: { ItemListView(store: store, playback: playback, play: play) .toolbar { ToolbarItem(placement: .primaryAction) { pageMenu } } } .tint(Glass.accent) .task { await store.refreshFeeds() store.reload() } .safeAreaInset(edge: .bottom, spacing: 0) { PlayerBarView(playback: playback) } } }