From 867ad8ab4b6c4e5f53ba59912187dade397e8f75 Mon Sep 17 00:00:00 2001 From: Brandon Evans Date: Tue, 22 Dec 2020 16:41:59 -0700 Subject: [PATCH] Add SettingsView --- Xcodes.xcodeproj/project.pbxproj | 8 +++ Xcodes/Backend/Configure.swift | 5 ++ Xcodes/Frontend/XcodeList/XcodeListView.swift | 5 -- Xcodes/SettingsView.swift | 62 +++++++++++++++++++ Xcodes/XcodesApp.swift | 13 ++-- 5 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 Xcodes/Backend/Configure.swift create mode 100644 Xcodes/SettingsView.swift diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index dc3dcf1..0867a06 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -39,6 +39,8 @@ CABFA9F32592F0E400380FEE /* PMKFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CABFA9F22592F0E400380FEE /* PMKFoundation */; }; CABFA9F82592F0F900380FEE /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = CABFA9F72592F0F900380FEE /* KeychainAccess */; }; CABFA9FD2592F13300380FEE /* LegibleError in Frameworks */ = {isa = PBXBuildFile; productRef = CABFA9FC2592F13300380FEE /* LegibleError */; }; + CABFAA2C2592FBFC00380FEE /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFAA2A2592FBFC00380FEE /* SettingsView.swift */; }; + CABFAA2D2592FBFC00380FEE /* Configure.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFAA2B2592FBFC00380FEE /* Configure.swift */; }; CAD2E7A22449574E00113D76 /* XcodesApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAD2E7A12449574E00113D76 /* XcodesApp.swift */; }; CAD2E7A42449574E00113D76 /* XcodeListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAD2E7A32449574E00113D76 /* XcodeListView.swift */; }; CAD2E7A62449575000113D76 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CAD2E7A52449575000113D76 /* Assets.xcassets */; }; @@ -90,6 +92,8 @@ CABFA9B92592EEEA00380FEE /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = ""; }; CABFA9BA2592EEEA00380FEE /* DateFormatter+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DateFormatter+.swift"; sourceTree = ""; }; CABFA9D42592EF6300380FEE /* DECISIONS.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = DECISIONS.md; sourceTree = ""; }; + CABFAA2A2592FBFC00380FEE /* SettingsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SettingsView.swift; path = Xcodes/SettingsView.swift; sourceTree = SOURCE_ROOT; }; + CABFAA2B2592FBFC00380FEE /* Configure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Configure.swift; path = Xcodes/Backend/Configure.swift; sourceTree = SOURCE_ROOT; }; CAD2E79E2449574E00113D76 /* Xcodes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Xcodes.app; sourceTree = BUILT_PRODUCTS_DIR; }; CAD2E7A12449574E00113D76 /* XcodesApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodesApp.swift; sourceTree = ""; }; CAD2E7A32449574E00113D76 /* XcodeListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeListView.swift; sourceTree = ""; }; @@ -164,6 +168,7 @@ isa = PBXGroup; children = ( CA378F982466567600A58CE0 /* AppState.swift */, + CABFAA2B2592FBFC00380FEE /* Configure.swift */, CABFA9BA2592EEEA00380FEE /* DateFormatter+.swift */, CABFA9B22592EEEA00380FEE /* Entry+.swift */, CABFA9A92592EEE900380FEE /* Environment.swift */, @@ -187,6 +192,7 @@ children = ( CAA1CB50255A5D16003FD669 /* SignIn */, CABFAA142592F73000380FEE /* XcodeList */, + CABFAA2A2592FBFC00380FEE /* SettingsView.swift */, ); path = Frontend; sourceTree = ""; @@ -394,11 +400,13 @@ CABFA9CE2592EEEA00380FEE /* Version+Xcode.swift in Sources */, CAA1CB49255A5C97003FD669 /* SignInSMSView.swift in Sources */, CAA1CB35255A5AD5003FD669 /* SignInCredentialsView.swift in Sources */, + CABFAA2D2592FBFC00380FEE /* Configure.swift in Sources */, CA73510D257BFCEF00EA9CF8 /* NSAttributedString+.swift in Sources */, CABFA9C22592EEEA00380FEE /* Promise+.swift in Sources */, CAA1CB4D255A5CFD003FD669 /* SignInPhoneListView.swift in Sources */, CABFA9CF2592EEEA00380FEE /* Process.swift in Sources */, CABFA9C72592EEEA00380FEE /* Entry+.swift in Sources */, + CABFAA2C2592FBFC00380FEE /* SettingsView.swift in Sources */, CABFA9C92592EEEA00380FEE /* URLRequest+Apple.swift in Sources */, CABFA9CC2592EEEA00380FEE /* Path+.swift in Sources */, CAD2E7A22449574E00113D76 /* XcodesApp.swift in Sources */, diff --git a/Xcodes/Backend/Configure.swift b/Xcodes/Backend/Configure.swift new file mode 100644 index 0000000..46e3d8c --- /dev/null +++ b/Xcodes/Backend/Configure.swift @@ -0,0 +1,5 @@ +public func configure(_ subject: Subject, configuration: (inout Subject) -> Void) -> Subject { + var copy = subject + configuration(©) + return copy +} diff --git a/Xcodes/Frontend/XcodeList/XcodeListView.swift b/Xcodes/Frontend/XcodeList/XcodeListView.swift index c6ab09a..1247397 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListView.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListView.swift @@ -67,11 +67,6 @@ struct XcodeListView: View { } .toolbar { ToolbarItemGroup(placement: .primaryAction) { - Button("Login", action: { self.appState.presentingSignInAlert = true }) - .sheet(isPresented: $appState.presentingSignInAlert) { - SignInCredentialsView(isPresented: $appState.presentingSignInAlert) - .environmentObject(appState) - } Button(action: appState.update) { Image(systemName: "arrow.clockwise") } diff --git a/Xcodes/SettingsView.swift b/Xcodes/SettingsView.swift new file mode 100644 index 0000000..597ad6d --- /dev/null +++ b/Xcodes/SettingsView.swift @@ -0,0 +1,62 @@ +import AppleAPI +import SwiftUI + +struct SettingsView: View { + @EnvironmentObject var appState: AppState + + var body: some View { + VStack(alignment: .leading) { + GroupBox(label: Text("Apple ID")) { + VStack(alignment: .leading) { + switch appState.authenticationState { + case .authenticated: + Text("Signed in") + Button("Sign Out", action: {}) + + case .unauthenticated: + Button("Sign In", action: { self.appState.presentingSignInAlert = true }) + .sheet(isPresented: $appState.presentingSignInAlert) { + SignInCredentialsView(isPresented: $appState.presentingSignInAlert) + .environmentObject(appState) + } + + case .waitingForSecondFactor: + Button("Signing In...", action: {}) + .disabled(true) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + Spacer() + } + .padding() + .navigationTitle("Settings") + .frame(width: 300) + .frame(minHeight: 300) + } +} + +struct SettingsView_Previews: PreviewProvider { + static var previews: some View { + Group { + SettingsView() + .environmentObject(configure(AppState()) { + $0.authenticationState = .authenticated + }) + + SettingsView() + .environmentObject(configure(AppState()) { + $0.authenticationState = .unauthenticated + }) + + SettingsView() + .environmentObject(configure(AppState()) { + $0.authenticationState = .waitingForSecondFactor( + TwoFactorOption.codeSent, + AuthOptionsResponse(trustedPhoneNumbers: nil, trustedDevices: nil, securityCode: .init(length: 6)), + AppleSessionData(serviceKey: "", sessionID: "", scnt: "") + ) + }) + } + } +} diff --git a/Xcodes/XcodesApp.swift b/Xcodes/XcodesApp.swift index d7e97ae..5f27dbc 100644 --- a/Xcodes/XcodesApp.swift +++ b/Xcodes/XcodesApp.swift @@ -5,11 +5,14 @@ struct XcodesApp: App { @StateObject private var appState = AppState() var body: some Scene { - Group { - WindowGroup("Xcodes") { - XcodeListView() - .environmentObject(appState) - } + WindowGroup("Xcodes") { + XcodeListView() + .environmentObject(appState) + } + + Settings { + SettingsView() + .environmentObject(appState) } } }