Я создаю страницу входа с помощью api и не могу понять
- Как показать предупреждение об успешном / неудачном входе в систему на основе ответа api
- Как динамически обновлять представление на основе ответа
Я пробовал сделать 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")
}
}
}
}