Fix sign in sheet cancel behavior

This commit is contained in:
swiftty 2022-06-24 12:28:09 +09:00
parent 1baf1f8515
commit a70069ce87
3 changed files with 46 additions and 20 deletions

View file

@ -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 {

View file

@ -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)
}
}
}
}
}

View file

@ -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)
}
}