// // AddServerView.swift // Jel // // Created by zerocool on 12/11/23. // import SwiftUI struct AddServerView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController @ObservedObject var authState: AuthStateController = AuthStateController.shared @Binding var serverUrlIsValid: Bool @State var serverUrlString: String = "" @State var urlHasError: Bool = false @State var currentErrorMessage: String = "" @State var isLoading: Bool = false @FocusState var serverUrlIsFocused: Bool var body: some View { VStack { Text("Connect to a server") .font(.title) HStack { TextField(text: $serverUrlString) { Text(verbatim: "https://jellyfin.example.com") } .keyboardType(.URL) .textContentType(.URL) .textFieldStyle(.roundedBorder) .textInputAutocapitalization(.never) .autocorrectionDisabled() .focused($serverUrlIsFocused) .onSubmit { Task { await checkServerUrl() } } if !isLoading { Button(action: { Task { await checkServerUrl() } }) { Label("Connect", systemImage: "arrow.right") .labelStyle(.iconOnly) } .buttonStyle(.bordered) } else { ProgressView() .progressViewStyle(.circular) .padding([.leading, .trailing]) } } .padding() .disabled(isLoading) if urlHasError { Text(currentErrorMessage) .font(.callout) .foregroundStyle(.red) } } .onAppear { serverUrlString = authState.serverUrl?.absoluteString ?? "" } } func checkServerUrl() async { isLoading = true serverUrlIsFocused = false if isValidUrl(data: serverUrlString) { let url = URL(string: serverUrlString)! jellyfinClient.setUrl(url: url) if await jellyfinClient.getPublicServerInfo() != nil { authState.serverUrl = url authState.save() urlHasError = false serverUrlIsValid = true } else { urlHasError = true currentErrorMessage = "Server not responding" } } else { urlHasError = true currentErrorMessage = "Invalid url" } isLoading = false } func isValidUrl(data: String) -> Bool { if let url = URL(string: data) { if UIApplication.shared.canOpenURL(url) { return true } } return false } } //#Preview { // AddServerView(serverUrlIsValid: .constant(false)) // //}