SwfitUI Firestore

firebase – SwiftUI – Simple Firestore Query – Display Results – Stack Overflow

ios – SwiftUI With Firebase Using Xcode 11 GM seed 2 – Swift UI Firestore – Stack Overflow

YouTube

GitHub – sgr-ksmt/SwiftUI-Firebase-Todo

GitHub – sgr-ksmt/FireTodo: Simple Todo Application using SwiftUI / Firebase / Redux.

Instagram Using Firebase In SwiftUI

  // ContetView.swift

  import SwiftUI
  import Firebase
  import SDWebImageSwiftUI
  
  
  struct ContentView: View {
      var body: some View {
          
          TabView{
              
              NavigationView{
                  
                  Home()
                      .navigationBarTitle("Instagram")
                      .navigationBarItems(leading: Button(action: {
                          
                      }, label: {
                          
                          Image("cam").resizable().frame(width: 30, height: 30)
                          
                      })
                      .foregroundColor(Color("darkAndWhite"))
                      , trailing:
                  
                          HStack{
                              
                              Button(action: {
                                  
                              }) {
                                  
                                  Image("IGTV").resizable().frame(width: 30, height: 30)
                                  
                              }.foregroundColor(Color("darkAndWhite"))
                              
                              Button(action: {
                                  
                              }) {
                                  
                                  Image("send").resizable().frame(width: 30, height: 30)
                              }
                              .foregroundColor(Color("darkAndWhite"))
                          }
                  
                  )
                  
                  
              }.tabItem {
                  
                  Image("home")
              }
              
              Text("Find").tabItem {
                  
                  Image("find")
              }
              
              Text("Upload").tabItem {
                  
                  Image("plus")
              }
              
              Text("Likes").tabItem {
                  
                  Image("heart")
              }
              
              Text("Profile").tabItem {
                  
                  Image("people")
              }
          }
      }
  }
  
  struct ContentView_Previews: PreviewProvider {
      static var previews: some View {
          ContentView()
      }
  }



  // statusView.swift

  import SwiftUI
  import SDWebImageSwiftUI
  
  struct statusView : View {
      
      var url = ""
      var name = ""
      
      var body : some View{
          
          ZStack{
              
              AnimatedImage(url: URL(string: url)).resizable()
              
              VStack{
                  
                  HStack{
                      
                      Text(name).font(.headline).fontWeight(.heavy).padding()
                      Spacer()
                  }
                  Spacer()
              }
          }
          
      }
  }
  

  // StatusCard.swift


import SwiftUI
import SDWebImageSwiftUI

struct StatusCard : View {
    
    var imName = ""
    var user = ""
    @Binding var show : Bool
    @Binding var user1 : String
    @Binding var url : String
    
    var body : some View{
     
            
        VStack{
            AnimatedImage(url: URL(string: imName))
                .resizable()
                .frame(width: 80, height: 80)
                .clipShape(Circle())
                .onTapGesture {
                    
                    self.user1 = self.user
                    self.url = self.imName
                    self.show.toggle()
                    
            }
            
            Text(user).fontWeight(.light)
            
        }
        
    }
}


// postCard.swift


import SwiftUI
import SDWebImageSwiftUI
import Firebase

struct postCard : View {
    
    var user = ""
    var image = ""
    var id = ""
    var likes = ""
    var comments = ""
    
    var body : some View{
        
        VStack(alignment: .leading, content: {
 
            HStack{
                
                AnimatedImage(url: URL(string: image)).resizable().frame(width: 30, height: 30).clipShape(Circle())
                Text(user)
                Spacer()
                Button(action: {
                    
                }) {
                    
                    Image("menu").resizable().frame(width: 15, height: 15)
                }.foregroundColor(Color("darkAndWhite"))
            }
            
            AnimatedImage(url: URL(string: image)).resizable().frame(height: 350)
            
            HStack{
                
                Button(action: {
                    
                }) {
                    
                    Image("comment").resizable().frame(width: 26, height: 26)
                }.foregroundColor(Color("darkAndWhite"))
                
                Button(action: {
                    
                    // update likes...
                    
                    let db = Firestore.firestore()
                   
                    let like = Int.init(self.likes)!
                    db.collection("posts").document(self.id).updateData(["likes": "(like + 1)"]) { (err) in
                        
                        if err != nil{
                            
                            print((err))
                            return
                        }
                        
                        print("updated....")
                    }
                    
                }) {
                    
                    Image("heart").resizable().frame(width: 26, height: 26)
                }.foregroundColor(Color("darkAndWhite"))
                
                Spacer()
                
                Button(action: {
                    
                }) {
                    
                    Image("saved").resizable().frame(width: 30, height: 30)
                }.foregroundColor(Color("darkAndWhite"))
                
            }.padding(.top, 8)
            
            
            Text("(likes) Likes").padding(.top, 8)
            Text("View all (comments) Comments")
            
         }).padding(8)
    }
}


// Home.swift


import SwiftUI
import SDWebImageSwiftUI
import Firebase

struct Home : View {
    
    @ObservedObject var observed = observer()
    @ObservedObject var postsobserver = Postsobserver()
    @State var show = false
    @State var user = ""
    @State var url = ""
    
    var body : some View{
        
        
        ScrollView(.vertical, showsIndicators: false) {
            
            VStack{
                
                ScrollView(.horizontal, showsIndicators: false) {
                    
                    HStack{
                        
                        ForEach(observed.status){i in
                            
                            StatusCard(imName: i.image, user: i.name, show: self.$show, user1: self.$user, url: self.$url).padding(.leading, 10)
                        }
                        
                    }.animation(.spring())
                }
                
                if postsobserver.posts.isEmpty{
                    
                    Text("No Posts").fontWeight(.heavy)
                }
                else{
                    
                    ForEach(postsobserver.posts){i in
                        
                        postCard(user: i.name, image: i.image, id: i.id, likes: i.likes, comments: i.comments)
                    }
                }

            }
            
        }.sheet(isPresented: $show) {
            
            statusView(url: self.url,name: self.user)
        }
    }
}


// Observers.swift


import SwiftUI
import Firebase


class observer : ObservableObject{
    
    @Published var status = [datatype]()
    
    init() {
        
        let db = Firestore.firestore()
        db.collection("status").addSnapshotListener { (snap, err) in
            
            if err != nil{
                
                print((err?.localizedDescription)!)
                return
            }
            
            for i in snap!.documentChanges{
                
                if i.type == .added{
                    
                    let id = i.document.documentID
                    let name = i.document.get("name") as! String
                    let image = i.document.get("image") as! String
                    
                    self.status.append(datatype(id: id, name: name, image: image))
                }
                
                if i.type == .removed{
                    
                    let id = i.document.documentID
                    
                    
                    for j in 0..< self.status.count{
                        
                        if self.status[j].id == id{
                            
                            self.status.remove(at: j)
                            return
                        }
                    }
                }
            }
        }
    }
}

class Postsobserver : ObservableObject{
    
    @Published var posts = [datatype1]()
    
    init() {
        
        let db = Firestore.firestore()
        db.collection("posts").addSnapshotListener { (snap, err) in
            
            if err != nil{
                
                print((err?.localizedDescription)!)
                return
            }
            
            for i in snap!.documentChanges{
                
                if i.type == .added{
                    
                    let id = i.document.documentID
                    let name = i.document.get("name") as! String
                    let image = i.document.get("image") as! String
                    let comment = i.document.get("comments") as! String
                    let likes = i.document.get("likes") as! String
                    
                    self.posts.append(datatype1(id: id, name: name, image: image, comments: comment, likes: likes))
                }
                
                if i.type == .removed{
                    
                    let id = i.document.documentID
                    
                    
                    for j in 0..< self.posts.count {
                        
                        if self.posts[j].id == id{
                            
                            self.posts.remove(at: j)
                            return
                        }
                    }
                }
                
                if i.type == .modified{
                    
                    let id = i.document.documentID
                    let likes = i.document.get("likes") as! String
                    
                    for j in 0..< self.posts.count {
                        
                        if self.posts[j].id == id{
                            
                            self.posts[j].likes = likes
                            return
                        }
                    }
                    
                }
            }
        }
    }
}


//dataTypes.swift

import Foundation
import SwiftUI


struct datatype1 : Identifiable {
    
    var id : String
    var name : String
    var image : String
    var comments : String
    var likes : String
}


struct datatype : Identifiable {
    
    var id : String
    var name : String
    var image : String
}

Twitter Using Firebase With SwiftUI

  //Content View

  import SwiftUI
import Firebase
import SDWebImageSwiftUI

struct ContentView: View {
    
    @State var show = false
    
    var body: some View {
        
        
        ZStack{
            
            TabView{
                
                Home().tabItem {
                    
                    Image("Home")
                    
                }.tag(0)
                
                Search().tabItem {
                    
                    Image("Search")
                    
                }.tag(1)
                
                Text("Notifications").tabItem {
                    
                    Image("Notifications")
                    
                }.tag(2)
                
                Text("Messages").tabItem {
                    
                    Image("Messages")
                    
                }.tag(3)
                
            }.accentColor(.blue)
            .edgesIgnoringSafeArea(.top)
            
            VStack{
                
                Spacer()
                
                HStack{
                    
                    Spacer()
                    
                    Button(action: {
                        
                        self.show.toggle()
                        
                    }) {
                        
                        Image("Tweet").resizable().frame(width: 20, height: 20).padding()
                    }.background(Color("bg"))
                    .foregroundColor(.white)
                    .clipShape(Circle())
                    
                }.padding()
                
            }.padding(.bottom,65)

        }.sheet(isPresented: $show) {
            
            CreateTweet(show: self.$show)
        }

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

//Home.swift

import SwiftUI
import Firebase
import SDWebImageSwiftUI

struct Home : View {
    
    @EnvironmentObject var observedData : getData
    
    var body : some View{
        
        NavigationView{
                
                ScrollView(.vertical, showsIndicators: false) {
                    
                    VStack(alignment: .leading){
                        
                        ForEach(observedData.datas){i in
                            
                            tweetCellTop(name: i.name, id: i.tagId, pic: i.pic, image: i.url, msg: i.msg)
                            
                            if i.pic != ""{
                                
                                tweetCellMiddle(pic: i.pic).padding(.leading, 60)
                                
                            }
                            

                            tweetCellBottom().offset(x: UIScreen.main.bounds.width / 4)
                        }
                    }
                    
                }.padding(.bottom, 15)

            .navigationBarTitle("Home",displayMode: .inline)
            .navigationBarItems(leading:
            
                Image("User Image").resizable().frame(width: 35, height: 35).clipShape(Circle()).onTapGesture {
                    
                    print("slide out menu ....")
                }
            
            )
        }
    }
}

//TweetcellBottom.swift

import SwiftUI

struct tweetCellBottom : View {
    
    var body : some View{
        
        HStack(spacing : 40){
            
            Button(action: {
                
            }) {
                
                Image("Comments").resizable().frame(width: 20, height: 20)
                
            }.foregroundColor(.gray)
            
            Button(action: {
                
            }) {
                
                Image("Retweet").resizable().frame(width: 20, height: 20)
                
            }.foregroundColor(.gray)
            
            Button(action: {
                
            }) {
                
                Image("love").resizable().frame(width: 20, height: 17)
                
            }.foregroundColor(.gray)
            
            Button(action: {
                
            }) {
                
                Image("upload").resizable().frame(width: 20, height: 20)
                
            }.foregroundColor(.gray)
        }
    }
}

//TweetCellTop.swift

import SwiftUI
import SDWebImageSwiftUI

struct tweetCellTop : View {
    
    var name = ""
    var id = ""
    var pic = ""
    var image = ""
    var msg = ""
    
    var body : some View{
        
        HStack(alignment: .top){
            
            VStack{
                
                AnimatedImage(url: URL(string: image)!).resizable().frame(width: 50, height: 50).clipShape(Circle())

            }

            
            VStack(alignment: .leading){
                
                Text(name).fontWeight(.heavy)
                Text(id)
                Text(msg).padding(.top, 8)
                
            }
            
        }.padding()
    }
}

//TweetCellMiddle.swift

import SwiftUI
import SDWebImageSwiftUI


struct tweetCellMiddle : View {
    
    var pic = ""
    
    var body : some View{
        
        AnimatedImage(url: URL(string: pic)!).resizable().frame(height: 300).cornerRadius(20).padding()
    }
}

//CreateTweet.swift


import SwiftUI
import Firebase

struct CreateTweet : View {
    @Binding var show : Bool
    @State var txt = ""

    var body : some View{

        VStack{
            
            HStack{
                
                Button(action: {
                        
                    self.show.toggle()
                    
                }) {
                    
                    Text("Cancel")
                }
                
                Spacer()
                
                Button(action: {
                    
                    
                    postTweet(msg: self.txt)
                    self.show.toggle()
                    
                }) {
                    
                    Text("Tweet").padding()
                    
                }.background(Color("bg"))
                .foregroundColor(.white)
                .clipShape(Capsule())
            }
            
            multilineTextField(txt: $txt)
            
        }.padding()
    }
}

//multilineTextField.swift


import SwiftUI

// now we going to create multiline Textfield.....

struct multilineTextField : UIViewRepresentable {
    
    
    @Binding var txt : String
    
    func makeCoordinator() -> multilineTextField.Coordinator {
        
        return multilineTextField.Coordinator(parent1 : self)
    }
    func makeUIView(context: UIViewRepresentableContext) -> UITextView {
        
        let text = UITextView()
        text.isEditable = true
        text.isUserInteractionEnabled = true
        text.text = "Type Something"
        text.textColor = .gray
        text.font = .systemFont(ofSize: 20)
        text.delegate = context.coordinator
        return text
    }
    
    func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext) {
        
        
    }
    
    class Coordinator : NSObject,UITextViewDelegate{
        
        
        var parent : multilineTextField
        
        init(parent1 : multilineTextField) {
            
            parent = parent1
        }
        
        func textViewDidBeginEditing(_ textView: UITextView) {
            
            textView.text = ""
            textView.textColor = .black
        }
        
        func textViewDidChange(_ textView: UITextView) {
            
            self.parent.txt = textView.text
        }
    }
}


//Datatypes.swift

import Foundation

struct datatype : Identifiable {
    
    var id : String
    var name : String
    var msg : String
    var retwetts : String
    var likes : String
    var pic : String
    var url : String
    var tagId : String
}

struct Topdatatype : Identifiable {
    
    var id : String
    var tag : String
    var tweets : String
}

//Search.swift

import SwiftUI
import Firebase

struct Search : View {
    
    @EnvironmentObject var datas : getData
    
    var body : some View{
        
        NavigationView{
            
            List(datas.top){i in
                
                SearchCell(tag: i.tag, tweets: i.tweets)
                
            }.navigationBarTitle("",displayMode: .inline)
            .navigationBarItems(leading:
                
                HStack{
                    
                    Image("User Image").resizable().frame(width: 35, height: 35).clipShape(Circle()).onTapGesture {
                        
                        print("slide out menu ....")
                    }
                    
                    SearchBar().frame(width: UIScreen.main.bounds.width - 120)
                }
                
                , trailing:
            
                Button(action: {
                    
                }, label: {
                    
                    Image("Add").resizable().frame(width: 35, height: 25)
                    
                }).foregroundColor(Color("bg"))
            
            )
            
        }
    }
}

struct SearchCell : View {
    
    var tag = ""
    var tweets = ""
    
    var body : some View{
        
        VStack(alignment : .leading,spacing : 5){
            
            Text(tag).fontWeight(.heavy)
            Text(tweets + " Tweets").fontWeight(.light)
        }
    }
}

struct SearchBar : UIViewRepresentable {
    
    func makeUIView(context: UIViewRepresentableContext) -> UISearchBar {
        
        let search = UISearchBar()
        return search
    }
    
    func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext) {
        
        
    }
}

//Observables.swift


import SwiftUI
import Firebase

class getData : ObservableObject{
    
    @Published var datas = [datatype]()
    @Published var top = [Topdatatype]()
    
    init() {
        
        let db = Firestore.firestore()
        
        db.collection("tweets").addSnapshotListener { (snap, err) in
            
            if err != nil{
                
                print((err?.localizedDescription)!)
                return
            }
            
            for i in snap!.documentChanges{
                
                if i.type == .added{
                    
                    print("hello world")
                    
                    let id = i.document.documentID
                    let name = i.document.get("name") as! String
                    let msg = i.document.get("msg") as! String
                    let pic = i.document.get("pic") as! String
                    let url = i.document.get("url") as! String
                    let retweets = i.document.get("retweet") as! String
                    let likes = i.document.get("likes") as! String
                    let tagID = i.document.get("id") as! String
                    
                    DispatchQueue.main.async {
                        
                        self.datas.append(datatype(id: id, name: name, msg: msg, retwetts: retweets, likes: likes, pic: pic, url: url, tagId: tagID))
                    }
                    
                }
            }
        }
        
        db.collection("Top").order(by: "tweets", descending: true).getDocuments { (snap, err) in
            
            if err != nil{
                
                print((err?.localizedDescription)!)
                return
            }
            
            for i in snap!.documents{
                
                let id = i.documentID
                let tag = i.get("tag") as! String
                let tweets = i.get("tweets") as! NSNumber
                
                self.top.append(Topdatatype(id: id, tag: tag, tweets: "(tweets)"))
            }
        }
    }
}

func postTweet(msg : String){
    
    let db = Firestore.firestore()
    
    // I'm going to use default name and image url.....
    
    db.collection("tweets").document().setData(["name" : "Kavsoft","id":"@kavsoft","msg":msg,"retweet":"0","likes":"0","pic":"","url":" Image URL "]) { (err) in
        
        if err != nil{
            
            print((err?.localizedDescription)!)
            
            return
        }
        print("success")
    }
}