ContentView.swift
//
// ContentView.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
import Firebase
import FirebaseStorage
struct ContentView: View {
@State var isLoginMode = false
@State var email = ""
@State var password = ""
@State var fname = ""
@State var lname = ""
@State var StatusMessage = ""
@State var shouldShowImagePicker = false
@State var image: UIImage?
var body: some View {
NavigationView {
ScrollView {
VStack(spacing: 16) {
Picker(selection: $isLoginMode, label: Text("Picker here")) {
Text("Login")
.tag(true)
Text("Create Account")
.tag(false)
}.pickerStyle(SegmentedPickerStyle())
if !isLoginMode {
Button {
shouldShowImagePicker.toggle()
} label: {
VStack {
Image(systemName: "person.fill")
.font(.system(size: 64))
.padding()
.foregroundColor(Color(.label))
}
.overlay(RoundedRectangle(cornerRadius: 64)
.stroke(Color.black, lineWidth: 3)
)
}
}
if !isLoginMode {
Group {
TextField("First Name", text: $fname)
TextField("Last Name", text: $lname)
TextField("Email", text: $email)
.keyboardType(.emailAddress)
.autocapitalization(.none)
SecureField("Password", text: $password)
}
.padding()
.background(Color.white)
.cornerRadius(10)
Button {
handleAction()
} label: {
HStack {
Spacer()
Text("Create Account")
.foregroundColor(.white)
.padding(.vertical, 10)
.font(.system(size: 18, weight: .semibold))
Spacer()
}.background(Color.green)
}.cornerRadius(10)
}else {
Image("Login")
.resizable()
.scaledToFill()
.frame(width: 128, height: 128)
.cornerRadius(64)
Group {
TextField("Email", text: $email)
.keyboardType(.emailAddress)
.autocapitalization(.none)
SecureField("Password", text: $password)
}
.padding()
.background(Color.white)
.cornerRadius(10)
Button {
loginUser()
} label: {
HStack {
Spacer()
Text("Login")
.foregroundColor(.white)
.padding(.vertical, 10)
.font(.system(size: 18, weight: .semibold))
Spacer()
}.background(Color.green)
}.cornerRadius(10)
}
Text(self.StatusMessage)
.foregroundColor(Color.white)
}
.padding()
} //End ScrollView
.navigationViewStyle(StackNavigationViewStyle())
.background(
LinearGradient(gradient: Gradient(colors: [.blue, .gray]), startPoint: .top, endPoint: .bottom)
.edgesIgnoringSafeArea(.all))
}// End Navigation
}
private func loginUser() {
Auth.auth().signIn(withEmail: email, password: password) { result, err in
if let err = err {
print("Failed to login user:", err)
self.StatusMessage = "Failed to login user: \(err)"
return
}
print("Successfully logged in as user: \(result?.user.uid ?? "")")
self.StatusMessage = "Successfully logged in as user: \(result?.user.uid ?? "")"
}
}
private func handleAction() {
createNewAccount()
}
private func createNewAccount() {
Auth.auth().createUser(withEmail: email, password: password) { result, err in
if let err = err {
print("Failed to create user:", err)
self.StatusMessage = "Failed to create user: \(err)"
return
}
print("Successfully created user: \(result?.user.uid ?? "")")
self.StatusMessage = "Successfully created user: \(result?.user.uid ?? "")"
self.storeUserInformation()
}
}
private func storeUserInformation() {
guard let uid = Auth.auth().currentUser?.uid else { return }
let userData = ["fname": self.fname, "lname": self.lname, "email": self.email, "uid": uid]
Firestore.firestore().collection("users")
.document(uid).setData(userData) { err in
if let err = err {
print(err)
self.StatusMessage = "\(err)"
return
}
print("Success")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
DevSwiftUIApp.swift
//
// DevSwiftUIApp.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
import Firebase
@main
struct DevSwiftUIApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
class AppDelegate: NSObject,UIApplicationDelegate{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
FirebaseApp.configure()
return true
}
}