diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index b855b63..d1a6c21 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -164,9 +164,9 @@ children = ( CA735108257BF96D00EA9CF8 /* AttributedText.swift */, CA73510C257BFCEF00EA9CF8 /* NSAttributedString+.swift */, + CA5D781D257365D6008EDE9D /* PinCodeTextView.swift */, CAA1CB34255A5AD5003FD669 /* SignInCredentialsView.swift */, CAA1CB44255A5B60003FD669 /* SignIn2FAView.swift */, - CA5D781D257365D6008EDE9D /* PinCodeTextView.swift */, CAA1CB48255A5C97003FD669 /* SignInSMSView.swift */, CAA1CB4C255A5CFD003FD669 /* SignInPhoneListView.swift */, ); diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index 4ee7fb3..38fd512 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -15,6 +15,7 @@ class AppState: ObservableObject { @Published var allVersions: [XcodeVersion] = [] @Published var error: AlertContent? @Published var presentingSignInAlert = false + @Published var isProcessingRequest = false @Published var secondFactorData: SecondFactorData? // MARK: - Authentication @@ -62,11 +63,13 @@ class AppState: ObservableObject { try? Current.keychain.set(password, key: username) Current.defaults.set(username, forKey: "username") + isProcessingRequest = true return client.login(accountName: username, password: password) .receive(on: DispatchQueue.main) .handleEvents( receiveOutput: { authenticationState in self.authenticationState = authenticationState + self.isProcessingRequest = false }, receiveCompletion: { completion in self.handleAuthenticationFlowCompletion(completion) @@ -85,10 +88,12 @@ class AppState: ObservableObject { } func requestSMS(to trustedPhoneNumber: AuthOptionsResponse.TrustedPhoneNumber, authOptions: AuthOptionsResponse, sessionData: AppleSessionData) { + isProcessingRequest = true client.requestSMSSecurityCode(to: trustedPhoneNumber, authOptions: authOptions, sessionData: sessionData) .sink( receiveCompletion: { completion in self.handleAuthenticationFlowCompletion(completion) + self.isProcessingRequest = false }, receiveValue: { authenticationState in self.authenticationState = authenticationState @@ -105,11 +110,13 @@ class AppState: ObservableObject { } func submitSecurityCode(_ code: SecurityCode, sessionData: AppleSessionData) { + isProcessingRequest = true client.submitSecurityCode(code, sessionData: sessionData) .receive(on: DispatchQueue.main) .sink( receiveCompletion: { completion in self.handleAuthenticationFlowCompletion(completion) + self.isProcessingRequest = false }, receiveValue: { authenticationState in self.authenticationState = authenticationState diff --git a/Xcodes/Frontend/SignIn/SignIn2FAView.swift b/Xcodes/Frontend/SignIn/SignIn2FAView.swift index 329a108..d49f088 100644 --- a/Xcodes/Frontend/SignIn/SignIn2FAView.swift +++ b/Xcodes/Frontend/SignIn/SignIn2FAView.swift @@ -26,7 +26,7 @@ struct SignIn2FAView: View { Spacer() Button("Continue", action: { appState.submitSecurityCode(.device(code: code), sessionData: sessionData) }) .keyboardShortcut(.defaultAction) - .disabled(code.count != authOptions.securityCode.length) + .disabled(code.count != authOptions.securityCode.length || appState.isProcessingRequest) } } .padding() diff --git a/Xcodes/Frontend/SignIn/SignInCredentialsView.swift b/Xcodes/Frontend/SignIn/SignInCredentialsView.swift index 7b7c49c..f4f16db 100644 --- a/Xcodes/Frontend/SignIn/SignInCredentialsView.swift +++ b/Xcodes/Frontend/SignIn/SignInCredentialsView.swift @@ -29,7 +29,7 @@ struct SignInCredentialsView: View { Button("Cancel") { isPresented = false } .keyboardShortcut(.cancelAction) Button("Next") { appState.signIn(username: username, password: password) } - .disabled(username.isEmpty) + .disabled(username.isEmpty || appState.isProcessingRequest) .keyboardShortcut(.defaultAction) } } diff --git a/Xcodes/Frontend/SignIn/SignInPhoneListView.swift b/Xcodes/Frontend/SignIn/SignInPhoneListView.swift index 562882d..2fe8faf 100644 --- a/Xcodes/Frontend/SignIn/SignInPhoneListView.swift +++ b/Xcodes/Frontend/SignIn/SignInPhoneListView.swift @@ -30,7 +30,7 @@ struct SignInPhoneListView: View { Spacer() Button("Continue", action: { appState.requestSMS(to: authOptions.trustedPhoneNumbers!.first { $0.id == selectedPhoneNumberID }!, authOptions: authOptions, sessionData: sessionData) }) .keyboardShortcut(.defaultAction) - .disabled(selectedPhoneNumberID == nil) + .disabled(selectedPhoneNumberID == nil || appState.isProcessingRequest) } } .padding() diff --git a/Xcodes/Frontend/SignIn/SignInSMSView.swift b/Xcodes/Frontend/SignIn/SignInSMSView.swift index 11804b5..1fe1e9b 100644 --- a/Xcodes/Frontend/SignIn/SignInSMSView.swift +++ b/Xcodes/Frontend/SignIn/SignInSMSView.swift @@ -26,7 +26,7 @@ struct SignInSMSView: View { Spacer() Button("Continue", action: { appState.submitSecurityCode(.sms(code: code, phoneNumberId: trustedPhoneNumber.id), sessionData: sessionData) }) .keyboardShortcut(.defaultAction) - .disabled(code.count != authOptions.securityCode.length) + .disabled(code.count != authOptions.securityCode.length || appState.isProcessingRequest) } } .padding()