diff --git a/frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_bloc.dart b/frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_bloc.dart index a34f6fa41a..d67b4b92eb 100644 --- a/frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_bloc.dart +++ b/frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_bloc.dart @@ -246,7 +246,7 @@ class ChatBloc extends Bloc { emit( state.copyWith( - promptResponseState: PromptResponseState.sendingQuestion, + promptResponseState: PromptResponseState.streamingAnswer, ), ); }, diff --git a/frontend/appflowy_flutter/lib/plugins/ai_chat/chat_page.dart b/frontend/appflowy_flutter/lib/plugins/ai_chat/chat_page.dart index 179f1e003d..2f2d673cfd 100644 --- a/frontend/appflowy_flutter/lib/plugins/ai_chat/chat_page.dart +++ b/frontend/appflowy_flutter/lib/plugins/ai_chat/chat_page.dart @@ -197,14 +197,13 @@ class _ChatContentPage extends StatelessWidget { final refSourceJsonString = message.metadata?[messageRefSourceJsonStringKey] as String?; - return BlocSelector( - selector: (state) { + return BlocBuilder( + builder: (context, state) { final chatController = context.read().chatController; final messages = chatController.messages .where((e) => onetimeMessageTypeFromMeta(e.metadata) == null); - return messages.isEmpty ? false : messages.last.id == message.id; - }, - builder: (context, isLastMessage) { + final isLastMessage = + messages.isEmpty ? false : messages.last.id == message.id; return ChatAIMessageWidget( user: message.author, messageUserId: message.id, @@ -213,6 +212,7 @@ class _ChatContentPage extends StatelessWidget { questionId: questionId, chatId: view.id, refSourceJsonString: refSourceJsonString, + isStreaming: state.promptResponseState != PromptResponseState.ready, isLastMessage: isLastMessage, onSelectedMetadata: (metadata) => _onSelectMetadata(context, metadata), diff --git a/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/chat_input/desktop_ai_prompt_input.dart b/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/chat_input/desktop_ai_prompt_input.dart index fd04be6a77..092c5ea422 100644 --- a/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/chat_input/desktop_ai_prompt_input.dart +++ b/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/chat_input/desktop_ai_prompt_input.dart @@ -189,6 +189,9 @@ class _DesktopAIPromptInputState extends State { } void handleSendPressed() { + if (widget.isStreaming) { + return; + } final trimmedText = inputControlCubit.formatIntputText( textController.text.trim(), ); diff --git a/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/chat_input/mobile_ai_prompt_input.dart b/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/chat_input/mobile_ai_prompt_input.dart index 07f2860f00..a4d8217466 100644 --- a/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/chat_input/mobile_ai_prompt_input.dart +++ b/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/chat_input/mobile_ai_prompt_input.dart @@ -155,6 +155,9 @@ class _MobileAIPromptInputState extends State { } void handleSendPressed() { + if (widget.isStreaming) { + return; + } final trimmedText = inputControlCubit.formatIntputText( textController.text.trim(), ); diff --git a/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/message/ai_text_message.dart b/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/message/ai_text_message.dart index f70de62f5b..5ea627c7f9 100644 --- a/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/message/ai_text_message.dart +++ b/frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/message/ai_text_message.dart @@ -35,6 +35,7 @@ class ChatAIMessageWidget extends StatelessWidget { this.onSelectedMetadata, this.onRegenerate, this.isLastMessage = false, + this.isStreaming = false, }); final User user; @@ -47,6 +48,7 @@ class ChatAIMessageWidget extends StatelessWidget { final String? refSourceJsonString; final void Function(ChatMessageRefSource metadata)? onSelectedMetadata; final void Function(String messageId)? onRegenerate; + final bool isStreaming; final bool isLastMessage; @override @@ -81,7 +83,9 @@ class ChatAIMessageWidget extends StatelessWidget { : ChatAIMessageBubble( message: message, isLastMessage: isLastMessage, - showActions: stream == null && state.text.isNotEmpty, + showActions: stream == null && + state.text.isNotEmpty && + !isStreaming, onRegenerate: onRegenerate, child: Column( crossAxisAlignment: CrossAxisAlignment.start,