sendMessage method

Future<void> sendMessage({
  1. required PeamanMessage message,
  2. dynamic onSuccess(
    1. PeamanMessage
    )?,
  3. dynamic onError(
    1. dynamic
    )?,
})

Implementation

Future<void> sendMessage({
  required final PeamanMessage message,
  final Function(PeamanMessage)? onSuccess,
  final Function(dynamic)? onError,
}) async {
  assert(
    message.senderId != null && message.receiverIds.isNotEmpty,
  );

  try {
    final _currentMillis = DateTime.now().millisecondsSinceEpoch;

    final _chatRef = PeamanReferenceHelper.chatsCol.doc(message.chatId);
    final _messagesRef =
        PeamanReferenceHelper.messagesCol(chatId: _chatRef.id);

    final _messagesDocs = await _messagesRef.limit(2).get();

    if (_messagesDocs.docs.isEmpty) {
      await _chatRef.set({
        'id': _chatRef.id,
        'visibility': true,
        'created_at': _currentMillis,
      });
    }

    final _chatUpdateData = <String, dynamic>{};

    _chatUpdateData['total_sent_messages'] = FieldValue.increment(1);
    _chatUpdateData['z_${message.senderId}_sent_messages'] =
        FieldValue.increment(1);
    message.receiverIds.forEach((receiverId) {
      _chatUpdateData['z_${receiverId}_unread_messages'] =
          FieldValue.increment(1);
    });

    final _lastMsgRef = _messagesRef.doc();
    final _message = message.copyWith(
      id: _lastMsgRef.id,
      chatId: _chatRef.id,
      createdAt: message.createdAt ?? _currentMillis,
      updatedAt: message.updatedAt ?? _currentMillis,
    );

    final _futures = <Future>[];

    final _lastMsgFuture = _lastMsgRef.set(_message.toJson());
    _futures.add(_lastMsgFuture);

    _chatUpdateData['updated_at'] = _currentMillis;
    _chatUpdateData['last_message_id'] = _message.id;

    final _chatUpdateFuture = _chatRef.update(_chatUpdateData);
    _futures.add(_chatUpdateFuture);

    if (_messagesDocs.docs.isEmpty) {
      final _additionalPropertiesFuture = _sendAdditionalProperties(
        message: _message,
      );
      _futures.add(_additionalPropertiesFuture);
    }

    if (_message.files.isNotEmpty) {
      final _mediaInfoFuture = _sendMediaInformation(message: _message);
      _futures.add(_mediaInfoFuture);
    }

    await Future.wait(_futures);
    onSuccess?.call(_message);
    print('Success: Sending message to ${message.receiverIds}');
  } catch (e) {
    print(e);
    print('Error: Sending message to ${message.receiverIds}');
    onError?.call(e);
  }
}