dispatchMessage method

Future<MessageDispatchResult> dispatchMessage(
  1. Message message, {
  2. required MessageDispatchCallback onDispatch,
})

Implementation

Future<MessageDispatchResult> dispatchMessage(
  Message message, {
  required MessageDispatchCallback onDispatch,
}) async {
  final messageGroup = addMessage(
    message.copyWith(isLoading: true, isFailed: false),
  );
  late final MessageDispatchResult dispatchResult;
  late final Message? result;

  result = await onDispatch(message);
  final index = messageGroup.messages.indexWhere(
    (element) => element.id == message.id,
  );
  if (result != null) {
    messageGroup.messages[index] = result;
    messageGroup.sortMessages();
    dispatchResult = MessageDispatchResult(
      message: message,
      isSuccess: true,
      exception: null,
    );
    if (!result.isSender) {
      _newReceiveMessageController.add(result);
    }
    if (result.isRead == true) {
      _unreadMessageIds.remove(result.id);
    } else if (result.isRead == false) {
      _unreadMessageIds.add(result.id);
    }
    notifyListeners();
  } else {
    dispatchResult = MessageDispatchResult(
      message: message,
      isSuccess: false,
      exception: Exception("Failed to dispatch message"),
    );
    removeMessageGroupAt(messageGroup, index);

    _failedMessageEntries[message.id] = FailedMessageEntry(
      messageId: message.id,
      messageGroup: messageGroup,
      onDispatch: onDispatch,
    );

    addMessage(message.copyWith(isLoading: false, isFailed: true));
  }
  if (_dispatchResultController.isClosed) return dispatchResult;
  _dispatchResultController.add(dispatchResult);

  return dispatchResult;
}