ContentView.swift
//
// ContentView.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
import Firebase
struct ContentView: View {
@ObservedObject private var viewModel = ContactViewModel()
@State private var showModal = false
var body: some View {
NavigationView {
List() {
ForEach(viewModel.contacts) { contact in
VStack(alignment: .leading) {
Text(contact.name ?? "").font(.title)
}
}
}.onAppear() {
self.viewModel.fetchData()
}
.navigationTitle("Contact List")
.navigationBarItems(trailing:
Button(action: {
self.showModal = true
}) {
VStack {
Image(systemName: "plus")
.resizable()
.scaledToFit()
.frame(width: 32, height: 32, alignment: .center)
.foregroundColor(.green)
}
}
.sheet(isPresented: self.$showModal, onDismiss: { }) {
AddView(showModal: self.$showModal)
})
.navigationBarTitle(Text("Add New"), displayMode: .inline)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
ContactViewModel.swift
//
// ContactViewModel.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import Foundation
import FirebaseFirestore
class ContactViewModel: ObservableObject {
@Published var contacts = [Contact]()
private var db = Firestore.firestore()
func fetchData() {
db.collection("contacts").addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.contacts = documents.map { (queryDocumentSnapshot) -> Contact in
let data = queryDocumentSnapshot.data()
let name = data["name"] as? String ?? ""
return Contact(name: name)
}
}
}
func addData(name: String) {
db.collection("contacts").addDocument(data: ["name": name]) { error in
if let error = error {
print(error.localizedDescription)
}
}
}
}
Contact.swift
//
// Contact.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
import FirebaseFirestoreSwift
struct Contact: Codable, Identifiable {
var id: String = UUID().uuidString
var name: String?
}
AddView.swift
//
// AddView.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
struct AddView: View {
@Binding var showModal: Bool
@State private var name: String = ""
@ObservedObject private var viewModel = ContactViewModel()
var body: some View {
NavigationView {
Form {
Section(header: Text("Name")) {
TextField("Enter your name", text: $name)
}
Section() {
Button(action: {
self.viewModel.addData(name: name)
self.showModal.toggle()
}) {
HStack {
Text("Add New")
.font(.title)
}
.padding()
.foregroundColor(.white)
.background(Color.blue)
.cornerRadius(30)
}
}
}
.navigationTitle("New Contact")
}
}
}
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
}
}
