show auth errors inline on sign in view

This commit is contained in:
Andrew Erickson 2021-05-01 09:12:36 -06:00
parent 499d33f8e0
commit 2289692422
3 changed files with 23 additions and 8 deletions

View file

@ -127,6 +127,7 @@ class AppState: ObservableObject {
} }
func signIn(username: String, password: String) { func signIn(username: String, password: String) {
authError = nil
signIn(username: username, password: password) signIn(username: username, password: password)
.sink( .sink(
receiveCompletion: { _ in }, receiveCompletion: { _ in },

View file

@ -133,6 +133,7 @@ struct MainWindow: View {
.padding() .padding()
} else { } else {
SignInCredentialsView() SignInCredentialsView()
.frame(width: 400)
} }
} }
} }

View file

@ -14,30 +14,42 @@ struct SignInCredentialsView: View {
Text("Apple ID:") Text("Apple ID:")
.frame(minWidth: 100, alignment: .trailing) .frame(minWidth: 100, alignment: .trailing)
TextField("example@icloud.com", text: $username) TextField("example@icloud.com", text: $username)
.frame(width: 250)
} }
HStack { HStack {
Text("Password:") Text("Password:")
.frame(minWidth: 100, alignment: .trailing) .frame(minWidth: 100, alignment: .trailing)
SecureField("Required", text: $password) SecureField("Required", text: $password)
.frame(width: 250) }
if appState.authError != nil {
HStack {
Text("")
.frame(minWidth: 100)
Text(appState.authError?.legibleLocalizedDescription ?? "")
.fixedSize(horizontal: false, vertical: true)
.foregroundColor(.red)
}
} }
HStack { HStack {
Spacer() Spacer()
Button("Cancel") { appState.presentedSheet = nil } Button("Cancel") {
.keyboardShortcut(.cancelAction) appState.authError = nil
ProgressButton(isInProgress: appState.isProcessingAuthRequest, appState.presentedSheet = nil
action: { appState.signIn(username: username, password: password) }) {
Text("Next")
} }
.keyboardShortcut(.cancelAction)
ProgressButton(
isInProgress: appState.isProcessingAuthRequest,
action: { appState.signIn(username: username, password: password) },
label: {
Text("Next")
}
)
.disabled(username.isEmpty || password.isEmpty) .disabled(username.isEmpty || password.isEmpty)
.keyboardShortcut(.defaultAction) .keyboardShortcut(.defaultAction)
} }
.frame(height: 25) .frame(height: 25)
} }
.padding() .padding()
.emittingError($appState.authError, recoveryHandler: { _ in })
} }
} }
@ -45,5 +57,6 @@ struct SignInCredentialsView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
SignInCredentialsView() SignInCredentialsView()
.environmentObject(AppState()) .environmentObject(AppState())
.previewLayout(.sizeThatFits)
} }
} }