diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index 3bf6138..59f3089 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -180,6 +180,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") } Logger.appState.error("Authentication error: \(error.legibleDescription)") diff --git a/Xcodes/Frontend/Preferences/GeneralPreferencePane.swift b/Xcodes/Frontend/Preferences/GeneralPreferencePane.swift index cef62a2..ac74ee7 100644 --- a/Xcodes/Frontend/Preferences/GeneralPreferencePane.swift +++ b/Xcodes/Frontend/Preferences/GeneralPreferencePane.swift @@ -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 })