sendFriendRequest method

Future<void> sendFriendRequest(
  1. String senderEmail,
  2. String receiverUserName,
  3. BuildContext context
)

Sends a friend request from senderEmail to receiverUserName.

Displays a success, error, or warning snackbar depending on the outcome.

Implementation

Future<void> sendFriendRequest(
    String senderEmail, String receiverUserName, BuildContext context) async {
  final usersRef = FirebaseFirestore.instance.collection('users');
  final localizations = AppLocalizations.of(context)!;

  final senderQuery =
  await usersRef.where('email', isEqualTo: senderEmail).get();
  final receiverQuery =
  await usersRef.where('username', isEqualTo: receiverUserName).get();

  if (senderQuery.docs.isEmpty || receiverQuery.docs.isEmpty) {
    Helper.errorSnackBar(
      title: localizations.tError,
      message: localizations.tNoUserFound,
    );
    return;
  }

  final senderRef = senderQuery.docs.first.reference;
  final receiverRef = receiverQuery.docs.first.reference;

  final existing = await FirebaseFirestore.instance
      .collection('friendships')
      .where(Filter.or(
        Filter.and(
          Filter('sender', isEqualTo: senderRef),
          Filter('receiver', isEqualTo: receiverRef)
        ),
        Filter.and(
          Filter('sender', isEqualTo: receiverRef),
          Filter('receiver', isEqualTo: senderRef)
        ),
      ))
      .get();

  if (existing.docs.isEmpty) {
    final docRef = await FirebaseFirestore.instance.collection('friendships').add({
      'sender': senderRef,
      'receiver': receiverRef,
      'status': 'pending',
      'since': FieldValue.serverTimestamp(),
    });

    final senderData = senderQuery.docs.first.data();

    friends.add({
      'username': senderData['username'],
      'email': senderData['email'],
      'fullName': senderData['fullName'],
      'friendshipDocId': docRef.id,
      'status': 'pending',
    });

    Helper.successSnackBar(
      title: localizations.tSuccess,
      message: '${localizations.tFriendRequestSentTo} $receiverUserName',
    );
  } else {
    Helper.warningSnackBar(
      title: localizations.tInfo,
      message: localizations.tFriendshipAlreadyExists,
    );
  }
}