diff --git a/nirvana-ios.xcodeproj/project.pbxproj b/nirvana-ios.xcodeproj/project.pbxproj index 75335e9..66a97fa 100644 --- a/nirvana-ios.xcodeproj/project.pbxproj +++ b/nirvana-ios.xcodeproj/project.pbxproj @@ -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 = ""; }; + 89110713277166D6005797FA /* UserFriends.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFriends.swift; sourceTree = ""; }; 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 = ""; }; 891A15E227653A7000B26659 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -282,6 +284,7 @@ children = ( 89BDCDF02769E64200577829 /* Messages.swift */, 891A160D27657CEA00B26659 /* User.swift */, + 89110713277166D6005797FA /* UserFriends.swift */, ); path = Models; sourceTree = ""; @@ -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 */, diff --git a/nirvana-ios/Models/UserFriends.swift b/nirvana-ios/Models/UserFriends.swift new file mode 100644 index 0000000..b4ae1e8 --- /dev/null +++ b/nirvana-ios/Models/UserFriends.swift @@ -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 + } +} diff --git a/nirvana-ios/Repositories/FirestoreService.swift b/nirvana-ios/Repositories/FirestoreService.swift index 625b3ba..5716083 100644 --- a/nirvana-ios/Repositories/FirestoreService.swift +++ b/nirvana-ios/Repositories/FirestoreService.swift @@ -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))) + } + + } + } diff --git a/nirvana-ios/Views/AddBasicInfo/AddBasicInfoView.swift b/nirvana-ios/Views/AddBasicInfo/AddBasicInfoView.swift index 394168d..6bff78b 100644 --- a/nirvana-ios/Views/AddBasicInfo/AddBasicInfoView.swift +++ b/nirvana-ios/Views/AddBasicInfo/AddBasicInfoView.swift @@ -102,7 +102,7 @@ struct AddBasicInfoView: View { Spacer() - + // button to save information Button { print("attempting to save information") diff --git a/nirvana-ios/Views/Contacts/ContactsViewModel.swift b/nirvana-ios/Views/Contacts/ContactsViewModel.swift index 36eeebb..5968261 100644 --- a/nirvana-ios/Views/Contacts/ContactsViewModel.swift +++ b/nirvana-ios/Views/Contacts/ContactsViewModel.swift @@ -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) + } + } } diff --git a/nirvana-ios/Views/Contacts/FindFriendsView.swift b/nirvana-ios/Views/Contacts/FindFriendsView.swift index 3693d7c..a537f0d 100644 --- a/nirvana-ios/Views/Contacts/FindFriendsView.swift +++ b/nirvana-ios/Views/Contacts/FindFriendsView.swift @@ -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 { } } } + +