// // TokenLoginView.swift // Nextcloud Cookbook iOS Client // // Created by Vincent Meilinger on 21.11.23. // import Foundation import OSLog import SwiftUI struct TokenLoginView: View { @Binding var showAlert: Bool @Binding var alertMessage: String @FocusState private var focusedField: Field? @State var userSettings = UserSettings.shared // TextField handling enum Field { case server case username case token } var body: some View { VStack(alignment: .leading) { ServerAddressField() .padding(.bottom) LoginLabel(text: "User name") BorderedLoginTextField(example: "username", text: $userSettings.username) .focused($focusedField, equals: .username) .textContentType(.username) .submitLabel(.next) .padding(.bottom) LoginLabel(text: "App Token") BorderedLoginTextField(example: "can be generated in security settings of your nextcloud", text: $userSettings.token) .focused($focusedField, equals: .token) .textContentType(.password) .submitLabel(.join) HStack{ Spacer() Button { Task { if await loginCheck(nextcloudLogin: false) { userSettings.onboarding = false } } } label: { Text("Submit") .foregroundColor(.white) .font(.headline) .padding() .background( RoundedRectangle(cornerRadius: 10) .stroke(Color.white, lineWidth: 2) .foregroundColor(.clear) ) } .padding() Spacer() } } .onSubmit { switch focusedField { case .server: focusedField = .username case .username: focusedField = .token default: Logger.view.debug("Attempting to log in ...") } } } func loginCheck(nextcloudLogin: Bool) async -> Bool { if userSettings.serverAddress == "" { alertMessage = "Please enter a server address!" showAlert = true return false } else if !nextcloudLogin && (userSettings.username == "" || userSettings.token == "") { alertMessage = "Please enter a user name and app token!" showAlert = true return false } UserSettings.shared.setAuthString() let client = CookbookApiFactory.makeClient() do { let _ = try await client.getCategories() return true } catch { alertMessage = "Login failed. Please check your inputs and internet connection." showAlert = true return false } } }