sendMessage method

void sendMessage(
  1. dynamic partialMessage,
  2. String roomId
)

Sends a message to the Firestore. Accepts any partial message and a room ID. If arbitraty data is provided in the partialMessage does nothing.

Implementation

void sendMessage(dynamic partialMessage, String roomId) async {
  if (firebaseUser == null) return;

  mm.Message? message;

  if (partialMessage is mm.PartialCustom) {
    message = mm.CustomMessage.fromPartial(
      author: mm.User(id: firebaseUser!.uid),
      id: '',
      partialCustom: partialMessage,
    );
  } else if (partialMessage is mm.PartialFile) {
    message = mm.FileMessage.fromPartial(
      author: mm.User(id: firebaseUser!.uid),
      id: '',
      partialFile: partialMessage,
    );
  } else if (partialMessage is mm.PartialImage) {
    message = mm.ImageMessage.fromPartial(
      author: mm.User(id: firebaseUser!.uid),
      id: '',
      partialImage: partialMessage,
    );
  } else if (partialMessage is mm.PartialText) {
    message = mm.TextMessage.fromPartial(
      author: mm.User(id: firebaseUser!.uid),
      id: '',
      partialText: partialMessage,
    );
  }

  if (message != null) {
    final messageMap = message.toJson();
    messageMap.removeWhere((key, value) => key == 'author' || key == 'id');
    messageMap['authorId'] = firebaseUser!.uid;
    messageMap['createdAt'] = FieldValue.serverTimestamp();
    messageMap['updatedAt'] = FieldValue.serverTimestamp();
    messageMap['seenBy'] = {
      firebaseUser!.uid: FieldValue.serverTimestamp(),

      /// Sender has seen the message
    };

    await getFirebaseFirestore
        .collection('${FireChatConst.roomsCollectionName}/$roomId/messages')
        .add(messageMap);

    // Extract the text content of the message
    String lastMessageText = '';
    if (message is mm.TextMessage) {
      lastMessageText = message.text;
    } else if (message is mm.ImageMessage) {
      lastMessageText = '📷 Image';
    } else if (message is mm.FileMessage) {
      lastMessageText = '📄 File';
    } else if (message is mm.CustomMessage) {
      lastMessageText = 'Custom Message';
    }

    await getFirebaseFirestore
        .collection(FireChatConst.roomsCollectionName)
        .doc(roomId)
        .update({
      'updatedAt': FieldValue.serverTimestamp(),
      'lastMsg': lastMessageText
    });
  }
}