Как показать предупреждение после попытки входа в систему - PullRequest
0 голосов
/ 03 августа 2020

Я создаю страницу входа с помощью api и не могу понять

  1. Как показать предупреждение об успешном / неудачном входе в систему на основе ответа api
  2. Как динамически обновлять представление на основе ответа

Я пробовал сделать LoginResponse наблюдаемым классом, но это тоже не сработало

Сетевой код

struct Credentials: Codable {
    var login: String = ""
    var password: String = ""
}

struct LoginResponse: Codable {
    var success: Bool = false
    var userId: String?
    var error: String?
    var jwt: String?
}

func AttemptLogin(loginCredentials: Credentials)  {
    
    let url = URL(string: "")
    guard let requestUrl = url else { fatalError() }
    var request = URLRequest(url: requestUrl)
    request.httpMethod = "POST"
    
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let jsonData = try! JSONEncoder().encode(loginCredentials)
    request.httpBody = jsonData
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        
        if let error = error {
            print("Error took place \(error)")
            return
        }
        
        guard let data = data else {return}
        
        do{
            let loginResponse = try JSONDecoder().decode(LoginResponse.self, from: data)
            if loginResponse.success {print("Login was successful\nUserId:\t\(loginResponse.userId!)\nJWT:\t\(loginResponse.jwt!)\n")}
            else {print("Login Failed\nError:\t\(loginResponse.error!)")}
            
        }
        catch let jsonError{
            print(jsonError)
        }
    }
    task.resume()
}

Код просмотра

struct LoginView: View {
    
    @State var loginCredentials = Credentials()
    @State var loginResponse = LoginResponse()
    
    var body: some View {
        VStack{
            
            
            VStack{
                
                TextField("Username",text: $loginCredentials.login)
                    .autocapitalization(UITextAutocapitalizationType.none)
                    .padding(.top)
                
                SecureField("Password",text: $loginCredentials.password)
                    .padding(.top)
            }
            
            Button(action:{AttemptLogin(loginCredentials: self.loginCredentials)}){
                Text("LOGIN")
            }
        }
    }
}
...