As soon as a consumer logs in to my app, I wish to change the view from SignInView to AppShellView. The authData variable updates completely superb in UserViewModel as soon as it receives knowledge from the API (checked in UserViewModel by way of print assertion) however this replace is just not being mirrored in ContentView because it all the time reveals the SignInView.
Why is authData not being up to date in ContentView?
UserViewModel:
import SwiftUI
struct LoginRequestBody: Codable {
let e-mail: String
let password: String
}
struct AuthData: Codable {
let token: String
let loggedInUser: Consumer
}
class UserViewModel: ObservableObject {
// MARK: - PROPERTIES
@Revealed var authData: AuthData?
// MARK: - FUNCTIONS
func signIn(e-mail: String, password: String) {
guard let url = URL(string: "http://localhost:4000/api/customers/login") else {
return
}
let physique = LoginRequestBody(e-mail: e-mail, password: password)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("utility/json", forHTTPHeaderField: "Content material-Sort")
request.httpBody = strive? JSONEncoder().encode(physique)
URLSession.shared.dataTask(with: request) { [self] knowledge, response, error in
guard let knowledge = knowledge, error == nil else {
return
}
guard let loginResponse = strive? JSONDecoder().decode(AuthData.self, from: knowledge) else {
return
}
self.authData = loginResponse
if let encoded = strive? JSONEncoder().encode(self.authData) {
let defaults = UserDefaults.customary
defaults.set(encoded, forKey: "authData")
}
}.resume()
}
}
ContentView:
import SwiftUI
struct ContentView: View {
@ObservedObject var userViewModel = UserViewModel()
var physique: some View {
if userViewModel.authData != nil {
AppShellView()
} else {
SignInView()
}
}
}