jellyflood/Shared/Coordinators/SettingsCoordinator.swift

178 lines
4.5 KiB
Swift

//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
//
import PulseUI
import Stinsen
import SwiftUI
final class SettingsCoordinator: NavigationCoordinatable {
let stack = NavigationStack(initial: \SettingsCoordinator.start)
@Root
var start = makeStart
#if os(iOS)
@Route(.push)
var about = makeAbout
@Route(.push)
var appIconSelector = makeAppIconSelector
@Route(.push)
var log = makeLog
@Route(.push)
var nativePlayerSettings = makeNativePlayerSettings
@Route(.push)
var quickConnect = makeQuickConnectSettings
@Route(.push)
var customizeViewsSettings = makeCustomizeViewsSettings
@Route(.push)
var experimentalSettings = makeExperimentalSettings
@Route(.push)
var itemFilterDrawerSelector = makeItemFilterDrawerSelector
@Route(.push)
var indicatorSettings = makeIndicatorSettings
@Route(.push)
var serverDetail = makeServerDetail
@Route(.push)
var videoPlayerSettings = makeVideoPlayerSettings
#if DEBUG
@Route(.push)
var debugSettings = makeDebugSettings
#endif
#endif
#if os(tvOS)
@Route(.modal)
var customizeViewsSettings = makeCustomizeViewsSettings
@Route(.modal)
var experimentalSettings = makeExperimentalSettings
@Route(.modal)
var indicatorSettings = makeIndicatorSettings
@Route(.modal)
var log = makeLog
@Route(.modal)
var serverDetail = makeServerDetail
@Route(.modal)
var videoPlayerSettings = makeVideoPlayerSettings
#endif
private let viewModel: SettingsViewModel
init() {
viewModel = .init()
}
#if os(iOS)
@ViewBuilder
func makeAbout() -> some View {
AboutAppView(viewModel: viewModel)
}
@ViewBuilder
func makeAppIconSelector() -> some View {
AppIconSelectorView(viewModel: viewModel)
}
@ViewBuilder
func makeNativePlayerSettings() -> some View {
NativeVideoPlayerSettingsView()
}
@ViewBuilder
func makeQuickConnectSettings() -> some View {
QuickConnectSettingsView(viewModel: .init())
}
@ViewBuilder
func makeCustomizeViewsSettings() -> some View {
CustomizeViewsSettings()
}
@ViewBuilder
func makeExperimentalSettings() -> some View {
ExperimentalSettingsView()
}
@ViewBuilder
func makeIndicatorSettings() -> some View {
IndicatorSettingsView()
}
@ViewBuilder
func makeServerDetail(server: ServerState) -> some View {
ServerDetailView(server: server)
}
#if DEBUG
@ViewBuilder
func makeDebugSettings() -> some View {
DebugSettingsView()
}
#endif
func makeItemFilterDrawerSelector(selection: Binding<[ItemFilterType]>) -> some View {
OrderedSectionSelectorView(selection: selection, sources: ItemFilterType.allCases)
}
func makeVideoPlayerSettings() -> VideoPlayerSettingsCoordinator {
VideoPlayerSettingsCoordinator()
}
#endif
#if os(tvOS)
func makeCustomizeViewsSettings() -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator(
BasicNavigationViewCoordinator {
CustomizeViewsSettings()
}
)
}
func makeExperimentalSettings() -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator(
BasicNavigationViewCoordinator {
ExperimentalSettingsView()
}
)
}
func makeIndicatorSettings() -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator(
BasicNavigationViewCoordinator {
IndicatorSettingsView()
}
)
}
func makeServerDetail(server: ServerState) -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator(
BasicNavigationViewCoordinator {
ServerDetailView(server: server)
}
)
}
func makeVideoPlayerSettings() -> NavigationViewCoordinator<VideoPlayerSettingsCoordinator> {
NavigationViewCoordinator(VideoPlayerSettingsCoordinator())
}
#endif
@ViewBuilder
func makeLog() -> some View {
ConsoleView()
}
@ViewBuilder
func makeStart() -> some View {
SettingsView(viewModel: viewModel)
}
}