Minor fixes, split files into folders

This commit is contained in:
Arkadiusz Fal
2021-08-20 00:38:31 +02:00
parent c1d9e02475
commit ea634390a6
26 changed files with 101 additions and 46 deletions

View File

@@ -0,0 +1,102 @@
import SwiftUI
#if os(iOS)
import Introspect
#endif
typealias TabSelection = AppSidebarNavigation.TabSelection
struct AppSidebarNavigation: View {
enum TabSelection: String {
case subscriptions, popular, trending, playlists, channel, search
}
@EnvironmentObject<NavigationState> private var navigationState
@State private var didApplyPrimaryViewWorkAround = false
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 briefly showing the primary view.
if !didApplyPrimaryViewWorkAround, let splitVC = viewController.children.first as? UISplitViewController {
UIView.performWithoutAnimation {
splitVC.show(.primary)
splitVC.hide(.primary)
}
didApplyPrimaryViewWorkAround = true
}
}
#else
content
#endif
}
var content: some View {
NavigationView {
sidebar
.frame(minWidth: 180)
Text("Select section")
}
}
var sidebar: some View {
List {
NavigationLink(tag: TabSelection.subscriptions, selection: navigationState.tabSelectionOptionalBinding) {
SubscriptionsView()
}
label: {
Label("Subscriptions", systemImage: "play.rectangle.fill")
.accessibility(label: Text("Subscriptions"))
}
NavigationLink(tag: TabSelection.popular, selection: navigationState.tabSelectionOptionalBinding) {
PopularView()
}
label: {
Label("Popular", systemImage: "chart.bar")
.accessibility(label: Text("Popular"))
}
NavigationLink(tag: TabSelection.trending, selection: navigationState.tabSelectionOptionalBinding) {
TrendingView()
}
label: {
Label("Trending", systemImage: "chart.line.uptrend.xyaxis")
.accessibility(label: Text("Trending"))
}
NavigationLink(tag: TabSelection.playlists, selection: navigationState.tabSelectionOptionalBinding) {
PlaylistsView()
}
label: {
Label("Playlists", systemImage: "list.and.film")
.accessibility(label: Text("Playlists"))
}
NavigationLink(tag: TabSelection.search, selection: navigationState.tabSelectionOptionalBinding) {
SearchView()
}
label: {
Label("Search", systemImage: "magnifyingglass")
.accessibility(label: Text("Search"))
}
}
#if os(macOS)
.toolbar {
Button(action: toggleSidebar) {
Image(systemName: "sidebar.left").help("Toggle Sidebar")
}
}
#endif
}
#if os(macOS)
private func toggleSidebar() {
NSApp.keyWindow?.contentViewController?.tryToPerform(#selector(NSSplitViewController.toggleSidebar(_:)), with: nil)
}
#endif
}

View File

@@ -0,0 +1,55 @@
import Defaults
import SwiftUI
struct AppTabNavigation: View {
@State private var tabSelection: TabSelection = .subscriptions
var body: some View {
TabView(selection: $tabSelection) {
NavigationView {
SubscriptionsView()
}
.tabItem {
Label("Subscriptions", systemImage: "play.rectangle.fill")
.accessibility(label: Text("Subscriptions"))
}
.tag(TabSelection.subscriptions)
NavigationView {
PopularView()
}
.tabItem {
Label("Popular", systemImage: "chart.bar")
.accessibility(label: Text("Popular"))
}
.tag(TabSelection.popular)
NavigationView {
TrendingView()
}
.tabItem {
Label("Trending", systemImage: "chart.line.uptrend.xyaxis")
.accessibility(label: Text("Trending"))
}
.tag(TabSelection.trending)
NavigationView {
PlaylistsView()
}
.tabItem {
Label("Playlists", systemImage: "list.and.film")
.accessibility(label: Text("Playlists"))
}
.tag(TabSelection.playlists)
NavigationView {
SearchView()
}
.tabItem {
Label("Search", systemImage: "magnifyingglass")
.accessibility(label: Text("Search"))
}
.tag(TabSelection.search)
}
}
}

View File

@@ -0,0 +1,47 @@
import SwiftUI
struct ContentView: View {
@StateObject private var navigationState = NavigationState()
@StateObject private var searchState = SearchState()
#if os(iOS)
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
#endif
var body: some View {
Section {
#if os(iOS)
if horizontalSizeClass == .compact {
AppTabNavigation()
} else {
AppSidebarNavigation()
}
#elseif os(macOS)
AppSidebarNavigation()
#elseif os(tvOS)
TVNavigationView()
#endif
}
#if !os(tvOS)
.sheet(isPresented: $navigationState.showingVideo) {
if let video = navigationState.video {
VideoPlayerView(video)
#if !os(iOS)
.frame(minWidth: 590, minHeight: 500)
.onExitCommand {
navigationState.showingVideo = false
}
#endif
}
}
#endif
.environmentObject(navigationState)
.environmentObject(searchState)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}