dispatchMessage method

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

Dispatches a message through the provided callback.

This method handles the complete message lifecycle:

  1. Adds the message with loading state
  2. Calls the dispatch callback
  3. Updates the message based on the result
  4. Handles failures and retry logic

The onDispatch callback should return the processed message or null if the operation failed.

Returns a MessageDispatchResult indicating success or failure.

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);
    }

    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;
}