handle auth payload from email sign in correctly
This commit is contained in:
@ -14,22 +14,11 @@ enum EmailAuthState {
|
||||
|
||||
@MainActor final class EmailAuthViewModel: ObservableObject {
|
||||
@Published var loginError: LoginError?
|
||||
@Published var emailAuthState = EmailAuthState.loading
|
||||
@Published var emailAuthState = EmailAuthState.signIn
|
||||
@Published var potentialUsernameStatus = PotentialUsernameStatus.noUsername
|
||||
@Published var potentialUsername = ""
|
||||
|
||||
var subscriptions = Set<AnyCancellable>()
|
||||
|
||||
func loadAuthState() {
|
||||
// check tokens here to determine pending/active/no user
|
||||
if PublicValet.hasPendingEmailVerificationToken {
|
||||
// TODO: make network request to check status
|
||||
// if it's now active then log in the user\
|
||||
emailAuthState = .pendingEmailVerification
|
||||
} else {
|
||||
emailAuthState = .signIn
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct EmailAuthView: View {
|
||||
@ -70,8 +59,5 @@ struct EmailAuthView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
.task {
|
||||
viewModel.loadAuthState()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,7 +9,6 @@ extension EmailAuthViewModel {
|
||||
func signUp(
|
||||
email: String,
|
||||
password: String,
|
||||
username: String,
|
||||
fullName: String,
|
||||
authenticator: Authenticator
|
||||
) async {
|
||||
@ -17,7 +16,7 @@ extension EmailAuthViewModel {
|
||||
try await authenticator.submitUserSignUp(
|
||||
email: email,
|
||||
password: password,
|
||||
username: username,
|
||||
username: potentialUsername,
|
||||
name: fullName
|
||||
)
|
||||
emailAuthState = .pendingEmailVerification
|
||||
@ -170,7 +169,6 @@ struct EmailSignupFormView: View {
|
||||
await viewModel.signUp(
|
||||
email: email,
|
||||
password: password,
|
||||
username: username,
|
||||
fullName: name,
|
||||
authenticator: authenticator
|
||||
)
|
||||
|
||||
@ -56,7 +56,8 @@ public extension Authenticator {
|
||||
let params = EmailSignInParams(email: email, password: password)
|
||||
let emailAuthPayload = try await networker.submitEmailLogin(params: params)
|
||||
|
||||
if let authPayload = emailAuthPayload.authPayload {
|
||||
if let authCookieString = emailAuthPayload.authCookieString, let authToken = emailAuthPayload.authToken {
|
||||
let authPayload = AuthPayload(authCookieString: authCookieString, authToken: authToken)
|
||||
try ValetKey.authCookieString.setValue(authPayload.commentedAuthCookieString)
|
||||
try ValetKey.authToken.setValue(authPayload.authToken)
|
||||
DispatchQueue.main.async {
|
||||
@ -81,8 +82,7 @@ public extension Authenticator {
|
||||
) async throws {
|
||||
do {
|
||||
let params = EmailSignUpParams(email: email, password: password, username: username, name: name)
|
||||
let authPayload = try await networker.submitEmailSignUp(params: params)
|
||||
try ValetKey.authTokenWithPendingEmail.setValue(authPayload.pendingEmailVerificationToken)
|
||||
try await networker.submitEmailSignUp(params: params)
|
||||
} catch {
|
||||
let serverError = (error as? ServerError) ?? ServerError.unknown
|
||||
throw LoginError.make(serverError: serverError)
|
||||
|
||||
@ -41,7 +41,8 @@ struct AuthPayload: Decodable {
|
||||
}
|
||||
|
||||
struct EmailAuthPayload: Decodable {
|
||||
let authPayload: AuthPayload?
|
||||
let authCookieString: String?
|
||||
let authToken: String?
|
||||
let pendingEmailVerification: Bool?
|
||||
}
|
||||
|
||||
|
||||
@ -62,7 +62,7 @@ extension Networker {
|
||||
}
|
||||
}
|
||||
|
||||
func submitEmailSignUp(params: EmailSignUpParams) async throws -> PendingEmailVerificationAuthPayload {
|
||||
func submitEmailSignUp(params: EmailSignUpParams) async throws {
|
||||
let encodedParams = (try? JSONEncoder().encode(params)) ?? Data()
|
||||
|
||||
let urlRequest = URLRequest.create(
|
||||
@ -71,13 +71,13 @@ extension Networker {
|
||||
requestMethod: .post(params: encodedParams)
|
||||
)
|
||||
|
||||
let resource = ServerResource<PendingEmailVerificationAuthPayload>(
|
||||
let resource = ServerResource<EmptyResponse>(
|
||||
urlRequest: urlRequest,
|
||||
decode: PendingEmailVerificationAuthPayload.decode
|
||||
decode: EmptyResponse.decode
|
||||
)
|
||||
|
||||
do {
|
||||
return try await urlSession.performRequest(resource: resource)
|
||||
_ = try await urlSession.performRequest(resource: resource)
|
||||
} catch {
|
||||
if let error = error as? ServerError {
|
||||
throw LoginError.make(serverError: error)
|
||||
|
||||
@ -10,15 +10,10 @@ public enum PublicValet {
|
||||
public static var authToken: String? {
|
||||
ValetKey.authToken.value()
|
||||
}
|
||||
|
||||
public static var hasPendingEmailVerificationToken: Bool {
|
||||
ValetKey.authTokenWithPendingEmail.exists
|
||||
}
|
||||
}
|
||||
|
||||
enum ValetKey: String {
|
||||
case authToken = "app.omnivore.valet.auth-token"
|
||||
case authTokenWithPendingEmail = "app.omnivore.valet.auth-token-with-pending-email"
|
||||
case authCookieString = "app.omnivore.valet.auth-cookie-raw-string"
|
||||
case appEnvironmentString = "app.omnivore.valet.app-environment"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user