diff options
Diffstat (limited to 'Jel/Views')
-rw-r--r-- | Jel/Views/SignIn/AddServerView.swift (renamed from Jel/Views/AddServerView.swift) | 33 | ||||
-rw-r--r-- | Jel/Views/SignIn/SignInToServerView.swift | 79 | ||||
-rw-r--r-- | Jel/Views/SignIn/SignInView.swift | 42 |
3 files changed, 137 insertions, 17 deletions
diff --git a/Jel/Views/AddServerView.swift b/Jel/Views/SignIn/AddServerView.swift index beab5e7..516b982 100644 --- a/Jel/Views/AddServerView.swift +++ b/Jel/Views/SignIn/AddServerView.swift @@ -8,12 +8,14 @@ import SwiftUI struct AddServerView: View { + @EnvironmentObject var jellyfinClient: JellyfinClientController @ObservedObject var authState: AuthStateController + @Binding var serverUrlIsValid: Bool - @State var serverUrlString: String = "" + @State var serverUrlString: String = "http://" @State var urlHasError: Bool = false @State var currentErrorMessage: String = "" - @State var loading: Bool = false + @State var isLoading: Bool = false @FocusState var serverUrlIsFocused: Bool @@ -22,10 +24,8 @@ struct AddServerView: View { Text("Connect to a server") .font(.title) HStack { - TextField(text: $serverUrlString) { Text("http://jellyfin.example.com") - .foregroundStyle(.placeholder) } .keyboardType(.URL) .textContentType(.URL) @@ -33,11 +33,6 @@ struct AddServerView: View { .textInputAutocapitalization(.never) .autocorrectionDisabled() .focused($serverUrlIsFocused) - .onChange(of: serverUrlIsFocused) { - if serverUrlIsFocused { - urlHasError = false - } - } .onSubmit { Task { await checkServerUrl() @@ -45,7 +40,7 @@ struct AddServerView: View { } - if !loading { + if !isLoading { Button(action: { Task { await checkServerUrl() @@ -55,14 +50,14 @@ struct AddServerView: View { .labelStyle(.iconOnly) } .buttonStyle(.bordered) - .disabled(urlHasError) } else { - ProgressView() + ProgressView() .progressViewStyle(.circular) - .padding() + .padding([.leading, .trailing]) } } .padding() + .disabled(isLoading) if urlHasError { Text(currentErrorMessage) @@ -73,13 +68,16 @@ struct AddServerView: View { } func checkServerUrl() async { - loading = true + isLoading = true serverUrlIsFocused = false if isValidUrl(data: serverUrlString) { let url = URL(string: serverUrlString)! - if await JellyfinClientController(serverUrl: url).isJellyfinServer() { + jellyfinClient.setUrl(url: url) + if await jellyfinClient.isJellyfinServer() { authState.serverUrl = url + authState.save() urlHasError = false + serverUrlIsValid = true } else { urlHasError = true currentErrorMessage = "Server not responding" @@ -90,7 +88,7 @@ struct AddServerView: View { currentErrorMessage = "Invalid url" } - loading = false + isLoading = false } func isValidUrl(data: String) -> Bool { @@ -105,5 +103,6 @@ struct AddServerView: View { } #Preview { - AddServerView(authState: AuthStateController()) + AddServerView(authState: AuthStateController(), serverUrlIsValid: .constant(false)) + } diff --git a/Jel/Views/SignIn/SignInToServerView.swift b/Jel/Views/SignIn/SignInToServerView.swift new file mode 100644 index 0000000..ae8d82d --- /dev/null +++ b/Jel/Views/SignIn/SignInToServerView.swift @@ -0,0 +1,79 @@ +// +// SignInToServerView.swift +// Jel +// +// Created by zerocool on 12/12/23. +// + +import SwiftUI + +struct SignInToServerView: View { + @EnvironmentObject var jellyfinClient: JellyfinClientController + @ObservedObject var authState: AuthStateController + + @State var username: String = "" + @State var password: String = "" + + @State var isLoading: Bool = false + @State var hasError: Bool = false + + var body: some View { + VStack { + Text("Sign in") + .font(.title) + TextField(text: $username) { + Text("Username") + } + .textContentType(.username) + + SecureField(text: $password) { + Text("Password") + } + .textContentType(.password) + .onSubmit { + Task { + await logInToServer() + } + } + + if !isLoading { + Button { + Task { + await logInToServer() + } + } label: { + Text("Sign in") + } + .disabled(username.isEmpty || password.isEmpty) + } else { + ProgressView() + .progressViewStyle(.circular) + } + + if hasError { + Text("Unable to sign in") + .font(.callout) + .foregroundStyle(.red) + } + } + .padding() + .textFieldStyle(.roundedBorder) + .textInputAutocapitalization(.never) + .disabled(isLoading) + } + + func logInToServer() async { + isLoading = true + hasError = false + do { + try await jellyfinClient.signIn(username: username, pw: password) + } catch { + hasError = true + } + isLoading = false + } +} + +#Preview { + SignInToServerView(authState: AuthStateController()) +} diff --git a/Jel/Views/SignIn/SignInView.swift b/Jel/Views/SignIn/SignInView.swift new file mode 100644 index 0000000..c06788d --- /dev/null +++ b/Jel/Views/SignIn/SignInView.swift @@ -0,0 +1,42 @@ +// +// SignInView.swift +// Jel +// +// Created by zerocool on 12/12/23. +// + +import SwiftUI + +struct SignInView: View { + @EnvironmentObject var jellyfinClient: JellyfinClientController + @ObservedObject var authState: AuthStateController + @State var serverUrlIsValid: Bool = false + + var body: some View { + NavigationStack { + AddServerView(authState: authState, serverUrlIsValid: $serverUrlIsValid) + .navigationDestination(isPresented: $serverUrlIsValid) { + SignInToServerView(authState: authState) + } + } + .onAppear { + Task { + await checkLoadedServerUrl() + } + } + } + + func checkLoadedServerUrl() async { + if authState.serverUrl == nil { + return + } + + if await jellyfinClient.isJellyfinServer() { + serverUrlIsValid = true + } + } +} + +#Preview { + SignInView(authState: AuthStateController()) +} |