From bf43285a9ea3eec85fb7d4a3cc33a4acebdbf1d9 Mon Sep 17 00:00:00 2001 From: "Stormacq, Sebastien" Date: Mon, 28 Oct 2019 14:57:54 +0100 Subject: [PATCH] add a custom view for login --- .../Landmarks/Landmarks/AppDelegate.swift | 19 +++++++ .../Landmarks/Landmarks/CustomLoginView.swift | 56 +++++++++++++++++++ .../Landmarks/Landmarks/LandingView.swift | 11 +--- 3 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 code/Complete/Landmarks/Landmarks/CustomLoginView.swift diff --git a/code/Complete/Landmarks/Landmarks/AppDelegate.swift b/code/Complete/Landmarks/Landmarks/AppDelegate.swift index 7e1a6e0..15100f7 100644 --- a/code/Complete/Landmarks/Landmarks/AppDelegate.swift +++ b/code/Complete/Landmarks/Landmarks/AppDelegate.swift @@ -132,6 +132,25 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } } + public func signIn(username: String, password: String) { + AWSMobileClient.default().signIn(username: username, password: password) { (signInResult, error) in + + if let error = error { + print("\(error)") + // in real life, present an error message to user + } else if let signInResult = signInResult { + switch (signInResult.signInState) { + case .signedIn: + print("User is signed in.") + case .smsMFA: + print("SMS message sent to \(signInResult.codeDetails!.destination!)") + default: + print("Sign In needs info which is not et supported.") + } + } + } + } + public func signOut() { AWSMobileClient.default().signOut() } diff --git a/code/Complete/Landmarks/Landmarks/CustomLoginView.swift b/code/Complete/Landmarks/Landmarks/CustomLoginView.swift new file mode 100644 index 0000000..46469a8 --- /dev/null +++ b/code/Complete/Landmarks/Landmarks/CustomLoginView.swift @@ -0,0 +1,56 @@ +import SwiftUI + +struct CustomLoginView : View { + + @State private var username: String = "" + @State private var password: String = "" + + private let app = UIApplication.shared.delegate as! AppDelegate + + var body: some View { // The body of the screen view + VStack { + Image("turtlerock") + .resizable() + .aspectRatio(contentMode: ContentMode.fit) + .padding(Edge.Set.bottom, 20) + + Text(verbatim: "Login").bold().font(.title) + + Text(verbatim: "Explore Landmarks of the world") + .font(.subheadline) + .padding(EdgeInsets(top: 0, leading: 0, bottom: 70, trailing: 0)) + + TextField("Username", text: $username) + .autocapitalization(.none) //avoid autocapitalization of the first letter + .padding() + .cornerRadius(4.0) + .background(Color(UIColor.systemFill)) + .padding(EdgeInsets(top: 0, leading: 0, bottom: 15, trailing: 0)) + + SecureField("Password", text: $password) + .padding() + .cornerRadius(4.0) + .background(Color(UIColor.systemFill)) + .padding(.bottom, 10) + + Button(action: { self.app.signIn(username: self.username, password: self.password) }) { + HStack() { + Spacer() + Text("Signin") + .foregroundColor(Color.white) + .bold() + Spacer() + } + + }.padding().background(Color.green).cornerRadius(4.0) + }.padding() + } +} + +#if DEBUG +struct ContentView_Previews : PreviewProvider { +static var previews: some View { + CustomLoginView() // Renders your UI View on the XCode preview + } +} +#endif diff --git a/code/Complete/Landmarks/Landmarks/LandingView.swift b/code/Complete/Landmarks/Landmarks/LandingView.swift index b57a19f..51c916f 100644 --- a/code/Complete/Landmarks/Landmarks/LandingView.swift +++ b/code/Complete/Landmarks/Landmarks/LandingView.swift @@ -11,19 +11,10 @@ struct LandingView: View { var body: some View { - let loginView = LoginViewController() - return VStack { // .wrappedValue is used to extract the Bool from Binding type if (!$user.isSignedIn.wrappedValue) { - - ZStack { - loginView - Button(action: { loginView.authenticate() } ) { - UserBadge().scaleEffect(0.5) - } - } - + CustomLoginView() } else { LandmarkList().environmentObject(user) }