MainMessagesView.swift
class MainMessagesViewModel: ObservableObject { @Published var errorMessage = "" @Published var chatUser: ChatUser? @Published var isUserCurrentlyLoggedOut = false init() { DispatchQueue.main.async { self.isUserCurrentlyLoggedOut = FirebaseManager.shared.auth.currentUser?.uid == nil } fetchCurrentUser() fetchRecentMessages() } @Published var recentMessages = [RecentMessage]() private func fetchRecentMessages() { guard let uid = FirebaseManager.shared.auth.currentUser?.uid else { return } FirebaseManager.shared.firestore .collection("recent_messages") .document(uid) .collection("messages") .order(by: "timestamp") .addSnapshotListener { querySnapshot, error in if let error = error { self.errorMessage = "Failed to listen for recent messages: \(error)" print(error) return } querySnapshot?.documentChanges.forEach({ change in let docId = change.document.documentID if let index = self.recentMessages.firstIndex(where: { rm in return rm.documentId == docId }) { self.recentMessages.remove(at: index) } self.recentMessages.insert(.init(documentId: docId, data: change.document.data()), at: 0) }) } } func fetchCurrentUser() { guard let uid = FirebaseManager.shared.auth.currentUser?.uid else { self.errorMessage = "Could not find firebase uid" return } FirebaseManager.shared.firestore.collection("users").document(uid).getDocument { snapshot, error in if let error = error { self.errorMessage = "Failed to fetch current user: \(error)" print("Failed to fetch current user:", error) return } guard let data = snapshot?.data() else { self.errorMessage = "No data found" return } self.chatUser = .init(data: data) FirebaseManager.shared.currentUser = self.chatUser } } func handleSignOut() { isUserCurrentlyLoggedOut.toggle() try? FirebaseManager.shared.auth.signOut() } }