attempting to get working the killing of the app during a call

This commit is contained in:
talksik
2022-01-02 16:46:24 -08:00
parent 6b80b4a61a
commit ddb7380511
3 changed files with 82 additions and 20 deletions
+1 -1
View File
@@ -276,7 +276,7 @@ extension AuthSessionStore {
continue
}
// create a listener for this specific user
// create a listener for this specific friend if they are an active friend
let currFriendListener = self.db.collection("users").document(userFriend!.friendId)
.addSnapshotListener {documentSnapshot, error in
guard let document = documentSnapshot else {
+72 -19
View File
@@ -389,26 +389,10 @@ class ConvoViewModel: NSObject, ObservableObject {
return
}
var updatedConvo = convo
//update convo in database to show that I left...if I am the last person, also close out the channel
// handle edge cases
let updatedConvo = Self.updatedConvoOnLeaving(convo: convo!, userId: userId!)
// if I am the last one in the convo, then end the convo in the db
if updatedConvo!.users.count == 1 && updatedConvo!.users[0] == userId {
updatedConvo!.state = .complete
updatedConvo!.endedTimestamp = Date()
} // if I am second to last, the last guy is a loner and activate him to get out
else if updatedConvo!.users.count == 2 && updatedConvo!.users.contains(userId!) {
updatedConvo!.secondToLastUserEndedTimestamp = Date()
}
// remove me from the users array to omit me from the convo
let updatedUsers: [String] = updatedConvo!.users.filter{ arrUserId in
return arrUserId != userId
}
updatedConvo!.users = updatedUsers
self?.firestoreService.updateConvo(convo: updatedConvo!) {[weak self] res in
self?.firestoreService.updateConvo(convo: updatedConvo) {[weak self] res in
self?.selectedConvoId = nil
print("left convo officially in our db as well")
@@ -422,6 +406,75 @@ class ConvoViewModel: NSObject, ObservableObject {
}
}
/** force leave for when the user quits a session and is in a call */
static func leaveAnyConvo() {
print("leaving any convos user may be in")
let userId = AuthSessionStore.getCurrentUserId()
if userId == nil {
print("not authenticated...can't leave any channels")
return
}
let firestoreService = FirestoreService()
var db = Firestore.firestore()
// get all live convos where I am in the users array
db.collection("convos").whereField("state", isEqualTo: ConvoState.active.rawValue).whereField("users", arrayContains: userId)
.getDocuments() {(querySnapshot, err) in
if let err = err {
print("Error getting user's active friends: \(err)")
return
}
// for each...prolly just one...remove me from the list of users
for document in querySnapshot!.documents {
var convo:Convo? = try? document.data(as: Convo.self)
if convo == nil {
continue
}
print(convo)
// handle edge cases
let updatedConvo = self.updatedConvoOnLeaving(convo: convo!, userId: userId!)
// send update back to firestore
firestoreService.updateConvo(convo: updatedConvo) {res in
print(res)
AgoraRtcEngineKit.destroy()
}
}
}
}
static func updatedConvoOnLeaving(convo: Convo, userId: String) -> Convo {
var updatedConvo = convo
//update convo in database to show that I left...if I am the last person, also close out the channel
// if I am the last one in the convo, then end the convo in the db
if updatedConvo.users.count == 1 && updatedConvo.users[0] == userId {
updatedConvo.state = .complete
updatedConvo.endedTimestamp = Date()
} // if I am second to last, the last guy is a loner and activate him to get out
else if updatedConvo.users.count == 2 && updatedConvo.users.contains(userId) {
updatedConvo.secondToLastUserEndedTimestamp = Date()
}
// remove me from the users array to omit me from the convo
let updatedUsers: [String] = updatedConvo.users.filter{ arrUserId in
return arrUserId != userId
}
updatedConvo.users = updatedUsers
return updatedConvo
}
func destroyInstance() {
AgoraRtcEngineKit.destroy()
}
+9
View File
@@ -143,6 +143,15 @@ class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("failed to register for remote notifications with error: \(error)")
}
/** when user kills the app process completely if it is in the background */
func applicationWillTerminate(_ application: UIApplication) {
// TODO: get user off of all live convos
ConvoViewModel.leaveAnyConvo()
print("user killed app, leaving convos if in any")
}
}
// cloud messaging