diff options
Diffstat (limited to 'Jel/Views/AddServerView.swift')
-rw-r--r-- | Jel/Views/AddServerView.swift | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/Jel/Views/AddServerView.swift b/Jel/Views/AddServerView.swift new file mode 100644 index 0000000..beab5e7 --- /dev/null +++ b/Jel/Views/AddServerView.swift @@ -0,0 +1,109 @@ +// +// AddServerView.swift +// Jel +// +// Created by zerocool on 12/11/23. +// + +import SwiftUI + +struct AddServerView: View { + @ObservedObject var authState: AuthStateController + + @State var serverUrlString: String = "" + @State var urlHasError: Bool = false + @State var currentErrorMessage: String = "" + @State var loading: Bool = false + + @FocusState var serverUrlIsFocused: Bool + + var body: some View { + VStack { + Text("Connect to a server") + .font(.title) + HStack { + + TextField(text: $serverUrlString) { + Text("http://jellyfin.example.com") + .foregroundStyle(.placeholder) + } + .keyboardType(.URL) + .textContentType(.URL) + .textFieldStyle(.roundedBorder) + .textInputAutocapitalization(.never) + .autocorrectionDisabled() + .focused($serverUrlIsFocused) + .onChange(of: serverUrlIsFocused) { + if serverUrlIsFocused { + urlHasError = false + } + } + .onSubmit { + Task { + await checkServerUrl() + } + } + + + if !loading { + Button(action: { + Task { + await checkServerUrl() + } + }) { + Label("Connect", systemImage: "arrow.right") + .labelStyle(.iconOnly) + } + .buttonStyle(.bordered) + .disabled(urlHasError) + } else { + ProgressView() + .progressViewStyle(.circular) + .padding() + } + } + .padding() + + if urlHasError { + Text(currentErrorMessage) + .font(.callout) + .foregroundStyle(.red) + } + } + } + + func checkServerUrl() async { + loading = true + serverUrlIsFocused = false + if isValidUrl(data: serverUrlString) { + let url = URL(string: serverUrlString)! + if await JellyfinClientController(serverUrl: url).isJellyfinServer() { + authState.serverUrl = url + urlHasError = false + } else { + urlHasError = true + currentErrorMessage = "Server not responding" + } + + } else { + urlHasError = true + currentErrorMessage = "Invalid url" + } + + loading = false + } + + func isValidUrl(data: String) -> Bool { + if let url = URL(string: data) { + if UIApplication.shared.canOpenURL(url) { + return true + } + } + return false + } + +} + +#Preview { + AddServerView(authState: AuthStateController()) +} |