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
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")
}
}