Show stored username in General preference pane

This reverts the change from 90c067997b so that the username is shown in situations where we don't have a valid session but could almost certainly get one. Instead, to achieve what that commit was trying to do, we'll instead remove the username from UserDefaults if auth fails with an invalid username or password error. I think this will more closely match what users expect in this UI.

I've added a comment in the UI explaining why it is the way it is. It might also be worth considering renaming AuthenticationState or its cases to better reflect that it's probably more about the (short-lived) session state than whether the user has signed in before and has stored their credentials.
This commit is contained in:
Brandon Evans 2021-01-25 19:56:28 -07:00
parent 35dba9322c
commit 75457dd9eb
No known key found for this signature in database
GPG key ID: D58A4B8DB64F8E93
2 changed files with 8 additions and 2 deletions

View file

@ -179,6 +179,7 @@ class AppState: ObservableObject {
let username = Current.defaults.string(forKey: "username") {
// remove any keychain password if we fail to log with an invalid username or password so it doesn't try again.
try? Current.keychain.remove(username)
Current.defaults.removeObject(forKey: "username")
}
// This error message is not user friendly... need to extract some meaningful data in the different cases

View file

@ -13,8 +13,13 @@ struct GeneralPreferencePane: View {
Preferences.Container(contentWidth: 400.0) {
Preferences.Section(title: "Apple ID") {
VStack(alignment: .leading) {
if appState.authenticationState == .authenticated {
Text(Current.defaults.string(forKey: "username") ?? "-")
// If we have saved a username then we will show it here,
// even if we don't have a valid session right now,
// because we should be able to get a valid session if needed with the password in the keychain
// and a 2FA code from the user.
// Note that AppState.authenticationState is not necessarily .authenticated in this case, though.
if let username = Current.defaults.string(forKey: "username") {
Text(username)
Button("Sign Out", action: appState.signOut)
} else {
Button("Sign In", action: { self.appState.presentingSignInAlert = true })