import Defaults import SwiftUI #if os(iOS) import Introspect #endif struct AppSidebarNavigation: View { @ObservedObject private var accounts = AccountsModel.shared private var navigation: NavigationModel { .shared } #if os(iOS) @State private var didApplyPrimaryViewWorkAround = false #endif @Default(.showOpenActionsToolbarItem) private var showOpenActionsToolbarItem var body: some View { #if os(iOS) content.introspectViewController { viewController in // workaround for an empty supplementary view on launch // the supplementary view is determined by the default selection inside the // primary view, but the primary view is not loaded so its selection is not read // We work around that by showing the primary view if !didApplyPrimaryViewWorkAround, let splitVC = viewController.children.first as? UISplitViewController { UIView.performWithoutAnimation { splitVC.show(.primary) } didApplyPrimaryViewWorkAround = true } } #else content #endif } let sidebarMinWidth: Double = 280 var content: some View { NavigationView { Sidebar() .toolbar { toolbarContent } .frame(minWidth: sidebarMinWidth) VStack { HStack { Spacer() Image(systemName: "4k.tv") .renderingMode(.original) .font(.system(size: 60)) .foregroundColor(.accentColor) Spacer() } } } .environment(\.navigationStyle, .sidebar) } var toolbarContent: some ToolbarContent { Group { #if os(iOS) ToolbarItemGroup(placement: .navigationBarTrailing) { Button(action: { navigation.presentingSettings = true }) { Image(systemName: "gearshape.2") } } #endif ToolbarItemGroup(placement: openVideosToolbarItemPlacement) { if showOpenActionsToolbarItem { Button { navigation.presentingOpenVideos = true } label: { Label("Open Videos", systemImage: "play.circle.fill") } } } ToolbarItemGroup(placement: accountsMenuToolbarItemPlacement) { AccountViewButton() } #if os(macOS) ToolbarItem(placement: .navigation) { Button { NSApp.keyWindow?.firstResponder?.tryToPerform(#selector(NSSplitViewController.toggleSidebar(_:)), with: nil) } label: { Label("Toggle Sidebar", systemImage: "sidebar.left") } } #endif } } var openVideosToolbarItemPlacement: ToolbarItemPlacement { #if os(iOS) return .navigationBarLeading #else return .automatic #endif } var accountsMenuToolbarItemPlacement: ToolbarItemPlacement { #if os(iOS) return .bottomBar #else return .automatic #endif } } struct AppSidebarNavigation_Preview: PreviewProvider { static var previews: some View { AppSidebarNavigation() .injectFixtureEnvironmentObjects() } }