diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index 087bb10..49a6de1 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -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 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 })