editUserMessage method

Future<void> editUserMessage(
  1. PupauMessage message,
  2. String newText
)

Fork after the previous user query (or new conversation if this was the first user message), then send newText.

Implementation

Future<void> editUserMessage(PupauMessage message, String newText) async {
  if (assistant.value == null || conversation.value == null) return;
  if (message.isMessageFromAssistant) return;
  final String trimmed = newText.trim();
  if (trimmed.isEmpty) return;

  final String? previousMessageId = _previousUserMessageIdForEdit(message);
  isForking.value = true;
  update();
  try {
    if (previousMessageId == null || previousMessageId.isEmpty) {
      await createNewConversation();
      if (conversation.value == null) {
        showErrorSnackbar(Strings.apiErrorGeneric.tr);
        return;
      }
      await loadConversation(conversation.value!.id);
      assistantsReplying.value = 0;
      isStreaming.value = false;
      resetLoadingMessage();
      await sendMessage(trimmed, false);
      return;
    }

    final String title =
        "${conversation.value?.title ?? Strings.newConversation.tr} (${Strings.edit.tr})";
    final PupauConversation? forked =
        await ConversationService.forkConversation(
          assistantId,
          conversation.value!.id,
          title,
          previousMessageId,
          isMarketplace,
        );
    if (forked == null) {
      showErrorSnackbar(Strings.apiErrorGeneric.tr);
      return;
    }
    await loadConversation(forked.id);
    assistantsReplying.value = 0;
    isStreaming.value = false;
    resetLoadingMessage();
    await sendMessage(trimmed, false);
  } finally {
    isForking.value = false;
    update();
  }
}