https://github.com/firebase/firebase-ios-sdk.git
https://github.com/SDWebImage/SDWebImageSwiftUI.git
ContentView.swift
//
// ContentView.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
struct ContentView: View {
@State var show = false
@State var showMenu = false
var body: some View {
let drag = DragGesture() //swipe to close menu
.onEnded {
if $0.translation.width < -100 {
withAnimation {
self.showMenu = false
}
}
}
return NavigationView {
//geometry property to adjust the frame of our Home View to fill the entire screen.
GeometryReader { geometry in
ZStack(alignment: .leading) {
TabView{
Home().tabItem {
Image(systemName: "house")
}.tag(0)
Search().tabItem {
Image(systemName: "magnifyingglass.circle.fill")
}.tag(1)
Text("Notifications").tabItem {
Image(systemName: "bell")
}.tag(2)
Text("Messages").tabItem {
Image(systemName: "envelope")
}.tag(3)
}.accentColor(.blue)
.edgesIgnoringSafeArea(.top)
VStack{
Spacer()
HStack{
Spacer()
Button(action: {
self.show.toggle()
}) {
Image("addtwit").resizable().frame(width: 20, height: 20).padding()
}.background(Color("bg"))
.foregroundColor(.white)
.clipShape(Circle())
}.padding()
}.padding(.bottom,65)
if self.showMenu {
MenuView()
.frame(width: geometry.size.width/1.5)
.transition(.move(edge: .leading)) //slide in transition
}
} //ZStack
.sheet(isPresented: $show) {
CreateTweet(show: self.$show)
}
.gesture(drag) //swipe to the left the menu collapse
}
.navigationBarTitle(Text(""), displayMode: .inline)
.navigationBarItems(leading:
HStack {
Button(action: {
withAnimation {
self.showMenu.toggle()
}
print("Open the side menu")
}) {
Image("photo1").resizable().frame(width: 35, height: 35).clipShape(Circle())
}
Image("tweet")
.resizable()
.foregroundColor(.white)
.aspectRatio(contentMode: .fit)
.frame(width: 60, height: 40, alignment: .center)
.padding(UIScreen.main.bounds.size.width/4+30)
}
,trailing:
HStack {
Button(action: {
}) {
Image(systemName: "sparkles")
}
}
)
}// End Navigation
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Home.swift
//
// Home.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
import SDWebImageSwiftUI
struct Home: View {
@ObservedObject var viewModel = TweetModel()
var body : some View{
ScrollView(.vertical, showsIndicators: false) {
VStack(alignment: .leading){
ForEach(viewModel.data){i in
twitPost(name: i.name, id: i.tagId, pic: i.pic, image: i.url, msg: i.msg)
if i.pic != ""{
AnimatedImage(url: URL(string: i.pic)!).resizable().frame(height: 300).cornerRadius(20).padding()
}
twitButton(like: i.likes, retwit: i.retwetts).offset(x: UIScreen.main.bounds.width / 4)
}
}
}.padding(.bottom, 15)
}
}
struct Home_Previews: PreviewProvider {
//@State static var showMenu = false
static var previews: some View {
//Home(showMenu: $showMenu)
Home()
}
}
struct twitPost : 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()
}
}
struct twitButton : View {
var like = ""
var retwit = ""
var body : some View{
HStack(spacing : 40){
Button(action: {
}) {
Image(systemName: "message.and.waveform").resizable().frame(width: 20, height: 20)
Text(like)
}.foregroundColor(.gray)
Button(action: {
}) {
Image(systemName: "crop.rotate").resizable().frame(width: 20, height: 20)
Text(retwit)
}.foregroundColor(.gray)
Button(action: {
}) {
Image(systemName: "heart").resizable().frame(width: 20, height: 17)
}.foregroundColor(.gray)
Button(action: {
}) {
Image(systemName: "square.and.arrow.up").resizable().frame(width: 20, height: 20)
}.foregroundColor(.gray)
}
}
}
Search.swift
//
// Search.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
struct Search: View {
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct Search_Previews: PreviewProvider {
static var previews: some View {
Search()
}
}
Datatypes.swift
//
// Datatypes.swift
// DevSwiftUI
//
// Created by Cairocoders
//
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
}
TweetModel.swift
//
// TweetModel.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import Foundation
import FirebaseFirestore
class TweetModel : ObservableObject{
@Published var data = [datatype]()
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.data.append(datatype(id: id, name: name, msg: msg, retwetts: retweets ?? "0", likes: likes, pic: pic, url: url, tagId: tagID ?? "cairocoders"))
}
}
}// End ForEach
} //End db.collection
} //End init()
}
func postTweet(msg : String){
let db = Firestore.firestore()
db.collection("tweets").document().setData(["name" : "Cairocoders","id":"@cairocoders","msg":msg,"retweet":"0","likes":"0","pic":"","url":"https://images.pexels.com/photos/3981337/pexels-photo-3981337.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500"]) { (err) in
if err != nil{
print((err?.localizedDescription)!)
return
}
print("success")
}
}
CreateTweet.swift
//
// CreateTweet.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
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
//
// multilineTextField.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
struct multilineTextField : UIViewRepresentable {
@Binding var txt : String
func makeCoordinator() -> multilineTextField.Coordinator {
return multilineTextField.Coordinator(parent1 : self)
}
func makeUIView(context: UIViewRepresentableContext<multilineTextField>) -> 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<multilineTextField>) {
}
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
}
}
}
MenuView.swift
//
// MenuView.swift
// DevSwiftUI
//
// Created by Cairocoders
//
import SwiftUI
struct MenuView: View {
var body: some View {
VStack(alignment: .leading) {
HStack {
VStack(alignment: .leading) {
Text("Cairocoders")
.foregroundColor(.black)
Text("@Cairocoders")
.foregroundColor(.black)
Text("239 Following 93 Followers")
.foregroundColor(.black)
}
}
.padding(.top, 100)
HStack {
Image(systemName: "person")
.foregroundColor(.black)
.imageScale(.large)
Text("Profile")
.foregroundColor(.black)
.font(.headline)
}
.padding(.top, 30)
HStack {
Image(systemName: "list.bullet.rectangle")
.foregroundColor(.black)
.imageScale(.large)
Text("List")
.foregroundColor(.black)
.font(.headline)
}
.padding(.top, 30)
HStack {
Image(systemName: "message.and.waveform")
.foregroundColor(.black)
.imageScale(.large)
Text("Topics")
.foregroundColor(.black)
.font(.headline)
}
.padding(.top, 30)
HStack {
Image(systemName: "bookmark")
.foregroundColor(.black)
.imageScale(.large)
Text("Bookmarks")
.foregroundColor(.black)
.font(.headline)
}
.padding(.top, 30)
Divider()
HStack {
Text("Setting and privacy")
.foregroundColor(.black)
.font(.headline)
}
.padding(.top, 30)
HStack {
Text("Help Center")
.foregroundColor(.black)
.font(.headline)
}
.padding(.top, 30)
Spacer()
}
.padding()
.frame(maxWidth: .infinity, alignment: .leading)
.background(Color("1"))
.edgesIgnoringSafeArea(.all)
}
}
struct MenuView_Previews: PreviewProvider {
static var previews: some View {
MenuView()
}
}
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
}
}
