From a70069ce8728da6b3337190f33db374d54de7fef Mon Sep 17 00:00:00 2001 From: swiftty <62803132+swiftty@users.noreply.github.com> Date: Fri, 24 Jun 2022 12:28:09 +0900 Subject: [PATCH] Fix sign in sheet cancel behavior --- Xcodes/Backend/AppState.swift | 19 +++++-------- Xcodes/Frontend/Common/XcodesSheet.swift | 35 ++++++++++++++++++++++-- Xcodes/Frontend/MainWindow.swift | 12 ++++---- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index 664f355..866346b 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -43,7 +43,6 @@ class AppState: ObservableObject { var isUpdating: Bool { updatePublisher != nil } @Published var presentedSheet: XcodesSheet? = nil @Published var isProcessingAuthRequest = false - @Published var secondFactorData: SecondFactorData? @Published var xcodeBeingConfirmedForUninstallation: Xcode? @Published var presentedAlert: XcodesAlert? @Published var helperInstallState: HelperInstallState = .notInstalled @@ -197,12 +196,11 @@ class AppState: ObservableObject { } func handleTwoFactorOption(_ option: TwoFactorOption, authOptions: AuthOptionsResponse, serviceKey: String, sessionID: String, scnt: String) { - self.secondFactorData = SecondFactorData( + self.presentedSheet = .twoFactor(.init( option: option, authOptions: authOptions, sessionData: AppleSessionData(serviceKey: serviceKey, sessionID: sessionID, scnt: scnt) - ) - self.presentedSheet = .twoFactor + )) } func requestSMS(to trustedPhoneNumber: AuthOptionsResponse.TrustedPhoneNumber, authOptions: AuthOptionsResponse, sessionData: AppleSessionData) { @@ -225,7 +223,11 @@ class AppState: ObservableObject { } func choosePhoneNumberForSMS(authOptions: AuthOptionsResponse, sessionData: AppleSessionData) { - secondFactorData = SecondFactorData(option: .smsPendingChoice, authOptions: authOptions, sessionData: sessionData) + self.presentedSheet = .twoFactor(.init( + option: .smsPendingChoice, + authOptions: authOptions, + sessionData: sessionData + )) } func submitSecurityCode(_ code: SecurityCode, sessionData: AppleSessionData) { @@ -255,7 +257,6 @@ class AppState: ObservableObject { switch self.authenticationState { case .authenticated, .unauthenticated, .notAppleDeveloper: self.presentedSheet = nil - self.secondFactorData = nil case let .waitingForSecondFactor(option, authOptions, sessionData): self.handleTwoFactorOption(option, authOptions: authOptions, serviceKey: sessionData.serviceKey, sessionID: sessionData.sessionID, scnt: sessionData.scnt) } @@ -698,12 +699,6 @@ class AppState: ObservableObject { var message: String var id: String { title + message } } - - struct SecondFactorData { - let option: TwoFactorOption - let authOptions: AuthOptionsResponse - let sessionData: AppleSessionData - } } extension OperatingSystemVersion { diff --git a/Xcodes/Frontend/Common/XcodesSheet.swift b/Xcodes/Frontend/Common/XcodesSheet.swift index 0a39add..a0270b5 100644 --- a/Xcodes/Frontend/Common/XcodesSheet.swift +++ b/Xcodes/Frontend/Common/XcodesSheet.swift @@ -1,8 +1,39 @@ import Foundation +import AppleAPI enum XcodesSheet: Identifiable { case signIn - case twoFactor + case twoFactor(SecondFactorData) - var id: Int { hashValue } + var id: Int { Kind(self).hashValue } + + struct SecondFactorData { + let option: TwoFactorOption + let authOptions: AuthOptionsResponse + let sessionData: AppleSessionData + } +} + +extension XcodesSheet { + private enum Kind: Hashable { + case signIn, twoFactor(TwoFactorOption) + + enum TwoFactorOption { + case smsSent + case codeSent + case smsPendingChoice + } + + init(_ sheet: XcodesSheet) { + switch sheet { + case .signIn: self = .signIn + case .twoFactor(let data): + switch data.option { + case .smsSent: self = .twoFactor(.smsSent) + case .smsPendingChoice: self = .twoFactor(.smsPendingChoice) + case .codeSent: self = .twoFactor(.codeSent) + } + } + } + } } diff --git a/Xcodes/Frontend/MainWindow.swift b/Xcodes/Frontend/MainWindow.swift index 9bd23d0..fcde005 100644 --- a/Xcodes/Frontend/MainWindow.swift +++ b/Xcodes/Frontend/MainWindow.swift @@ -47,8 +47,8 @@ struct MainWindow: View { case .signIn: signInView() .environmentObject(appState) - case .twoFactor: - secondFactorView(appState.secondFactorData!) + case .twoFactor(let secondFactorData): + secondFactorView(secondFactorData) .environmentObject(appState) } } @@ -69,14 +69,14 @@ struct MainWindow: View { } @ViewBuilder - private func secondFactorView(_ secondFactorData: AppState.SecondFactorData) -> some View { + private func secondFactorView(_ secondFactorData: XcodesSheet.SecondFactorData) -> some View { switch secondFactorData.option { case .codeSent: - SignIn2FAView(isPresented: $appState.secondFactorData.isNotNil, authOptions: secondFactorData.authOptions, sessionData: secondFactorData.sessionData) + SignIn2FAView(isPresented: $appState.presentedSheet.isNotNil, authOptions: secondFactorData.authOptions, sessionData: secondFactorData.sessionData) case .smsSent(let trustedPhoneNumber): - SignInSMSView(isPresented: $appState.secondFactorData.isNotNil, trustedPhoneNumber: trustedPhoneNumber, authOptions: secondFactorData.authOptions, sessionData: secondFactorData.sessionData) + SignInSMSView(isPresented: $appState.presentedSheet.isNotNil, trustedPhoneNumber: trustedPhoneNumber, authOptions: secondFactorData.authOptions, sessionData: secondFactorData.sessionData) case .smsPendingChoice: - SignInPhoneListView(isPresented: $appState.secondFactorData.isNotNil, authOptions: secondFactorData.authOptions, sessionData: secondFactorData.sessionData) + SignInPhoneListView(isPresented: $appState.presentedSheet.isNotNil, authOptions: secondFactorData.authOptions, sessionData: secondFactorData.sessionData) } }