diff options
author | Shav Kinderlehrer <[email protected]> | 2023-12-15 10:41:00 -0500 |
---|---|---|
committer | Shav Kinderlehrer <[email protected]> | 2023-12-15 10:41:00 -0500 |
commit | 2e3c12fed339c8bf3dc966217cbdf4c385fb98a1 (patch) | |
tree | 356a0bbfd24f98bf04545eb876cf20cd6179850e /Jel/Views | |
parent | 3994a6f408905049a5c280a303e30fe636b07968 (diff) | |
download | jel-2e3c12fed339c8bf3dc966217cbdf4c385fb98a1.tar.gz jel-2e3c12fed339c8bf3dc966217cbdf4c385fb98a1.zip |
Add settings view + fix signin flow
Diffstat (limited to 'Jel/Views')
-rw-r--r-- | Jel/Views/ConsoleSheetView.swift | 43 | ||||
-rw-r--r-- | Jel/Views/ContentView.swift | 34 | ||||
-rw-r--r-- | Jel/Views/Dashboard/DashBoardView.swift | 36 | ||||
-rw-r--r-- | Jel/Views/Settings/AppearancePicker.swift | 25 | ||||
-rw-r--r-- | Jel/Views/Settings/SettingsView.swift | 68 | ||||
-rw-r--r-- | Jel/Views/SignIn/AddServerView.swift | 6 | ||||
-rw-r--r-- | Jel/Views/SignIn/SignInToServerView.swift | 20 | ||||
-rw-r--r-- | Jel/Views/SignIn/SignInView.swift | 13 | ||||
-rw-r--r-- | Jel/Views/Utility/ConsoleSheetView.swift | 35 |
9 files changed, 208 insertions, 72 deletions
diff --git a/Jel/Views/ConsoleSheetView.swift b/Jel/Views/ConsoleSheetView.swift deleted file mode 100644 index 4d9ba32..0000000 --- a/Jel/Views/ConsoleSheetView.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// ConsoleSheetView.swift -// Jel -// -// Created by zerocool on 12/12/23. -// - -import SwiftUI -import PulseUI - -struct ConsoleSheetView: View { - @Binding var showingConsoleSheet: Bool - - var body: some View { - NavigationStack { - List { - NavigationLink { - ConsoleView(mode: .network) - .closeButtonHidden() - } label: { - Text("Network Console") - } - NavigationLink { - ConsoleView(mode: .logs) - .closeButtonHidden() - } label: { - Text("Logs Console") - } - } - .toolbar { - Button { - showingConsoleSheet.toggle() - } label: { - Text("Done") - } - } - } - } -} - -#Preview { - ConsoleSheetView(showingConsoleSheet: .constant(true)) -} diff --git a/Jel/Views/ContentView.swift b/Jel/Views/ContentView.swift index 91d5c7c..11a8277 100644 --- a/Jel/Views/ContentView.swift +++ b/Jel/Views/ContentView.swift @@ -9,34 +9,36 @@ import SwiftUI import PulseUI struct ContentView: View { - @ObservedObject var authState: AuthStateController + @EnvironmentObject var jellyfinClient: JellyfinClientController + @StateObject var settingsController: SettingsController = SettingsController.shared + + @StateObject var authState: AuthStateController = AuthStateController.shared @State var showingConsoleSheet: Bool = false var body: some View { VStack { - Button { - showingConsoleSheet.toggle() - } label: { - Label("Console", systemImage: "network") - } - .sheet(isPresented: $showingConsoleSheet) { - ConsoleSheetView(showingConsoleSheet: $showingConsoleSheet) - } - if !authState.loggedIn { - SignInView(authState: authState) + SignInView() } else { - Text("Logged in") - Button("Log out") { - authState.loggedIn = false - authState.save() + NavigationStack { + DashBoardView() } } } .padding() + .preferredColorScheme({ + switch settingsController.appearance { + case .dark: + return ColorScheme.dark + case .light: + return ColorScheme.light + case .automatic: + return .none + } + }()) } } #Preview { - ContentView(authState: AuthStateController()) + ContentView() } diff --git a/Jel/Views/Dashboard/DashBoardView.swift b/Jel/Views/Dashboard/DashBoardView.swift new file mode 100644 index 0000000..ea2003c --- /dev/null +++ b/Jel/Views/Dashboard/DashBoardView.swift @@ -0,0 +1,36 @@ +// +// DashBoardView.swift +// Jel +// +// Created by zerocool on 12/12/23. +// + +import SwiftUI + +struct DashBoardView: View { + @State var showingSettingsSheet: Bool = false + + var body: some View { + NavigationStack { + VStack { + + } + .toolbar { + ToolbarItem { + Button { + showingSettingsSheet.toggle() + } label: { + Label("Settings", systemImage: "gear") + } + } + } + .sheet(isPresented: $showingSettingsSheet) { + SettingsView(showingSettingsView: $showingSettingsSheet) + } + } + } +} + +#Preview { + DashBoardView() +} diff --git a/Jel/Views/Settings/AppearancePicker.swift b/Jel/Views/Settings/AppearancePicker.swift new file mode 100644 index 0000000..93edead --- /dev/null +++ b/Jel/Views/Settings/AppearancePicker.swift @@ -0,0 +1,25 @@ +// +// AppearancePicker.swift +// Jel +// +// Created by zerocool on 12/15/23. +// + +import SwiftUI + +struct AppearancePicker: View { + @ObservedObject var settingsController: SettingsController = SettingsController.shared + + var body: some View { + Picker("Appearance", selection: $settingsController.appearance) { + ForEach(AppearanceState.allCases) { option in + Text(String(describing: option)) + } + } + .pickerStyle(.menu) + } +} + +#Preview { + AppearancePicker() +} diff --git a/Jel/Views/Settings/SettingsView.swift b/Jel/Views/Settings/SettingsView.swift new file mode 100644 index 0000000..6eaa2e2 --- /dev/null +++ b/Jel/Views/Settings/SettingsView.swift @@ -0,0 +1,68 @@ +// +// SettingsView.swift +// Jel +// +// Created by zerocool on 12/13/23. +// + +import SwiftUI +import PulseUI + +struct SettingsView: View { + @Binding var showingSettingsView: Bool + + @StateObject var authState: AuthStateController = AuthStateController.shared + + @ObservedObject var settingsController: SettingsController = SettingsController.shared + var body: some View { + NavigationStack { + Form { + Section { + AppearancePicker() + } + + Section { + NavigationLink { + ConsoleView() + .closeButtonHidden() + } label: { + Text("Logs") + } + + Button(role: .destructive) { + authState.loggedIn = false + authState.save() + } label: { + Text("Sign out") + } + } + } + .navigationTitle("Settings") + .toolbar { + ToolbarItem { + Button { + showingSettingsView.toggle() + settingsController.save() + } label: { + Text("Done") + .bold() + } + } + } + .preferredColorScheme({ + switch settingsController.appearance { + case .dark: + return ColorScheme.dark + case .light: + return ColorScheme.light + case .automatic: + return .none + } + }()) + } + } +} + +#Preview { + SettingsView(showingSettingsView: .constant(true)) +} diff --git a/Jel/Views/SignIn/AddServerView.swift b/Jel/Views/SignIn/AddServerView.swift index 516b982..40c2312 100644 --- a/Jel/Views/SignIn/AddServerView.swift +++ b/Jel/Views/SignIn/AddServerView.swift @@ -9,7 +9,7 @@ import SwiftUI struct AddServerView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController - @ObservedObject var authState: AuthStateController + @ObservedObject var authState: AuthStateController = AuthStateController.shared @Binding var serverUrlIsValid: Bool @State var serverUrlString: String = "http://" @@ -73,7 +73,7 @@ struct AddServerView: View { if isValidUrl(data: serverUrlString) { let url = URL(string: serverUrlString)! jellyfinClient.setUrl(url: url) - if await jellyfinClient.isJellyfinServer() { + if await jellyfinClient.getPublicServerInfo() != nil { authState.serverUrl = url authState.save() urlHasError = false @@ -103,6 +103,6 @@ struct AddServerView: View { } #Preview { - AddServerView(authState: AuthStateController(), serverUrlIsValid: .constant(false)) + AddServerView(serverUrlIsValid: .constant(false)) } diff --git a/Jel/Views/SignIn/SignInToServerView.swift b/Jel/Views/SignIn/SignInToServerView.swift index ae8d82d..259e54d 100644 --- a/Jel/Views/SignIn/SignInToServerView.swift +++ b/Jel/Views/SignIn/SignInToServerView.swift @@ -9,17 +9,19 @@ import SwiftUI struct SignInToServerView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController - @ObservedObject var authState: AuthStateController + @StateObject var authState: AuthStateController = AuthStateController.shared @State var username: String = "" @State var password: String = "" @State var isLoading: Bool = false @State var hasError: Bool = false + @State var serverName: String = "" + var body: some View { VStack { - Text("Sign in") + Text("Sign in to \(serverName)") .font(.title) TextField(text: $username) { Text("Username") @@ -60,6 +62,13 @@ struct SignInToServerView: View { .textFieldStyle(.roundedBorder) .textInputAutocapitalization(.never) .disabled(isLoading) + .onAppear { + Task { + if let serverInfo = await jellyfinClient.getPublicServerInfo() { + serverName = serverInfo.serverName ?? "Unknown" + } + } + } } func logInToServer() async { @@ -74,6 +83,7 @@ struct SignInToServerView: View { } } -#Preview { - SignInToServerView(authState: AuthStateController()) -} +// FIXME: Preview broken for this view +//#Preview { +// SignInToServerView() +//} diff --git a/Jel/Views/SignIn/SignInView.swift b/Jel/Views/SignIn/SignInView.swift index c06788d..729b34b 100644 --- a/Jel/Views/SignIn/SignInView.swift +++ b/Jel/Views/SignIn/SignInView.swift @@ -6,17 +6,20 @@ // import SwiftUI +import PulseUI struct SignInView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController - @ObservedObject var authState: AuthStateController + + @StateObject var authState: AuthStateController = AuthStateController.shared @State var serverUrlIsValid: Bool = false + @State var showingConsoleSheet: Bool = false var body: some View { NavigationStack { - AddServerView(authState: authState, serverUrlIsValid: $serverUrlIsValid) + AddServerView(serverUrlIsValid: $serverUrlIsValid) .navigationDestination(isPresented: $serverUrlIsValid) { - SignInToServerView(authState: authState) + SignInToServerView() } } .onAppear { @@ -31,12 +34,12 @@ struct SignInView: View { return } - if await jellyfinClient.isJellyfinServer() { + if await jellyfinClient.getPublicServerInfo() != nil { serverUrlIsValid = true } } } #Preview { - SignInView(authState: AuthStateController()) + SignInView() } diff --git a/Jel/Views/Utility/ConsoleSheetView.swift b/Jel/Views/Utility/ConsoleSheetView.swift new file mode 100644 index 0000000..a047315 --- /dev/null +++ b/Jel/Views/Utility/ConsoleSheetView.swift @@ -0,0 +1,35 @@ +// +// ConsoleSheetView.swift +// Jel +// +// Created by zerocool on 12/12/23. +// + +import SwiftUI +import PulseUI + +struct ConsoleSheetView: View { + @Binding var showingConsoleSheet: Bool + + var body: some View { + NavigationStack { + ConsoleView() + .closeButtonHidden() + .navigationTitle("Debug consoles") + .toolbar { + ToolbarItem { + Button { + showingConsoleSheet.toggle() + } label: { + Text("Done") + .bold() + } + } + } + } + } +} + +#Preview { + ConsoleSheetView(showingConsoleSheet: .constant(true)) +} |