summaryrefslogtreecommitdiff
path: root/Jel/Views
diff options
context:
space:
mode:
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.swift79
-rw-r--r--Jel/Views/SignIn/SignInView.swift42
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())
+}