brute force working but just need to navigate user back to circle

This commit is contained in:
talksik
2021-12-20 18:36:23 -08:00
parent 4c5f8e6985
commit 61d357875a
6 changed files with 94 additions and 11 deletions
+4
View File
@@ -8,6 +8,7 @@
/* Begin PBXBuildFile section */
8904DEC8277055E90071E6CA /* OnboardingTrioView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8904DEC7277055E90071E6CA /* OnboardingTrioView.swift */; };
89110714277166D6005797FA /* UserFriends.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89110713277166D6005797FA /* UserFriends.swift */; };
891A15E127653A7000B26659 /* nirvana_iosApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891A15E027653A7000B26659 /* nirvana_iosApp.swift */; };
891A15E327653A7000B26659 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891A15E227653A7000B26659 /* ContentView.swift */; };
891A15E527653A7100B26659 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 891A15E427653A7100B26659 /* Assets.xcassets */; };
@@ -79,6 +80,7 @@
/* Begin PBXFileReference section */
8904DEC7277055E90071E6CA /* OnboardingTrioView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingTrioView.swift; sourceTree = "<group>"; };
89110713277166D6005797FA /* UserFriends.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFriends.swift; sourceTree = "<group>"; };
891A15DD27653A7000B26659 /* nirvana-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "nirvana-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; };
891A15E027653A7000B26659 /* nirvana_iosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = nirvana_iosApp.swift; sourceTree = "<group>"; };
891A15E227653A7000B26659 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
@@ -282,6 +284,7 @@
children = (
89BDCDF02769E64200577829 /* Messages.swift */,
891A160D27657CEA00B26659 /* User.swift */,
89110713277166D6005797FA /* UserFriends.swift */,
);
path = Models;
sourceTree = "<group>";
@@ -530,6 +533,7 @@
896CE7052770AE5D00DB474E /* InboxView.swift in Sources */,
891A160327656FC700B26659 /* HomeView.swift in Sources */,
896CE70927712CED00DB474E /* StringExtension.swift in Sources */,
89110714277166D6005797FA /* UserFriends.swift in Sources */,
896CE70727711BAB00DB474E /* FindFriendsView.swift in Sources */,
891A160B2765732700B26659 /* HomeViewModel.swift in Sources */,
89BCABEB276D2A09009E9B10 /* PhoneVerificationView.swift in Sources */,
+34
View File
@@ -0,0 +1,34 @@
//
// UserFriends.swift
// nirvana-ios
//
// Created by Arjun Patel on 12/20/21.
//
import Foundation
import Firebase
import FirebaseFirestoreSwift
enum UserFriendsState {
case active
case inactive
}
struct UserFriends: Identifiable, Codable {
@DocumentID var id: String? = UUID().uuidString
var userId: String
var friendId: String
var isActive: Bool
@ServerTimestamp var lastUpdatedTimestamp: Date?
@ServerTimestamp var createdTimestamp: Date?
enum CodingKeys: String, CodingKey {
case id
case userId
case friendId
case isActive
case createdTimestamp
case lastUpdatedTimestamp
}
}
@@ -7,13 +7,15 @@
import Foundation
import Firebase
import FirebaseCore
import FirebaseFirestore
import FirebaseFirestoreSwift
class FirestoreService {
enum Collection: String {
case users = "users"
case messages = "messages"
case user_friends = "user_friends" // associating a user to
case userFriends = "user_friends" // associating a user to
}
private var db = Firestore.firestore()
@@ -103,4 +105,21 @@ class FirestoreService {
return FieldValue.serverTimestamp()
}
func createOrUpdateUserFriends(userFriend: UserFriends, completion: @escaping((_ state: ServiceState) -> ())) {
do {
if userFriend.id != nil {
let _ = try db.collection(Collection.userFriends.rawValue).addDocument(from: userFriend)
completion(ServiceState.success("created/updated userfriend in firestore service"))
} else {
completion(ServiceState.error(ServiceError(description: "No userfriend id given to firestore service")))
}
} catch {
print("error in creating user friend \(error.localizedDescription)")
completion(ServiceState.error(ServiceError(description: error.localizedDescription)))
}
}
}
@@ -102,7 +102,7 @@ struct AddBasicInfoView: View {
Spacer()
// button to save information
Button {
print("attempting to save information")
@@ -93,6 +93,15 @@ class ContactsViewModel : ObservableObject {
}
}
func addOrActivateFriendToCircle(userId: String, friendId: String) {
// setting timestamps to nil to make sure that new server timestamp is set
var userFriend = UserFriends(userId: userId, friendId: friendId, isActive: true, lastUpdatedTimestamp: nil, createdTimestamp: nil)
self.firestoreService.createOrUpdateUserFriends(userFriend: userFriend) {[weak self] res in
print(res)
}
}
}
@@ -7,6 +7,7 @@
import SwiftUI
import Contacts
import NavigationStack
@@ -24,7 +25,7 @@ struct FindFriendsView: View {
List {
ForEach(searchItems, id: \.self) { key in
if let currContact = self.contactsVM.contacts[key] {
ListContactRow(contact: currContact)
ListContactRow(contactsVM: self.contactsVM, contact: currContact)
}
}
}
@@ -47,6 +48,8 @@ struct FindFriendsView: View {
return keys.filter { $0.contains(self.searchQuery) }
}
}
}
struct FindFriendsView_Previews: PreviewProvider {
@@ -55,14 +58,16 @@ struct FindFriendsView_Previews: PreviewProvider {
}
}
struct ListContactRow: View {
var contact: ContactsViewModelContact
@EnvironmentObject var navigationStack : NavigationStack
@EnvironmentObject var authSessionStore: AuthSessionStore
var contactsVM: ContactsViewModel
var contact:ContactsViewModelContact
@State var showAlert = false
@State var alertText = ""
@State var alertMessage = ""
@State var alertText = "🌱Confirm Arjun into Your Circle?"
@State var alertMessage = "Note: You can have a maximium of 12 people in your circle and you have 5 swaps left!"
var body: some View {
if contact.isExisting { // add to circle
@@ -81,9 +86,9 @@ struct ListContactRow: View {
Spacer()
Button {
print("adding contact to circle")
//show alert if circle is full
print("showing alert now")
// TODO: show alert if circle is full
self.showAlert.toggle()
} label: {
Label("Add", systemImage: "plus.circle")
@@ -91,6 +96,16 @@ struct ListContactRow: View {
.foregroundColor(NirvanaColor.solidTeal)
}
}
.alert(self.alertText, isPresented: self.$showAlert) {
Button("Add \(contact.cnName)", role: ButtonRole.cancel) {
print("adding contact to circle")
// call method in vm to get it done, then navigate to the circle
self.contactsVM.addOrActivateFriendToCircle(userId: self.authSessionStore.user!.id!, friendId: (contact.user!.id)!)
}
} message: {
Text(self.alertMessage)
}
}
else { // invite button to text the person
HStack(alignment: .center, spacing: 0) {
@@ -128,3 +143,5 @@ struct ListContactRow: View {
}
}
}