listenToFriendships method

void listenToFriendships(
  1. String userId
)

Listens for changes to friendship documents where userId is involved.

Updates the friends list with accepted or pending friends.

Implementation

void listenToFriendships(String userId) {
  isLoadingFriends.value = true;
  friends.clear();

  final userRef = FirebaseFirestore.instance
      .collection('users')
      .doc(userId);
  final friendshipsRef = FirebaseFirestore.instance.collection('friendships');

  final senderQuery = friendshipsRef
      .where('sender', isEqualTo: userRef)
      .where('status', whereIn: ['accepted', 'pending'])
      .snapshots();

  final receiverQuery = friendshipsRef
      .where('receiver', isEqualTo: userRef)
      .where('status', isEqualTo: 'accepted')
      .snapshots();

  _friendsSubscription?.cancel();

  _friendsSubscription = senderQuery.listen((senderSnapshot) async {
    List<DocumentSnapshot> allDocs = List.from(senderSnapshot.docs);

    final receiverDocs = await friendshipsRef
        .where('receiver', isEqualTo: userRef)
        .where('status', isEqualTo: 'accepted')
        .get();

    allDocs.addAll(receiverDocs.docs);

    await _processNewFriendData(userId, allDocs);

    receiverQuery.listen((receiverSnapshot) async {
      List<DocumentSnapshot> combinedDocs = List.from(senderSnapshot.docs);
      combinedDocs.addAll(receiverSnapshot.docs);
      await _processNewFriendData(userId, combinedDocs);
    });
  });
}