diff --git a/lib/features/composer/presentation/extensions/ai_scribe/handle_ai_scribe_in_composer_extension.dart b/lib/features/composer/presentation/extensions/ai_scribe/handle_ai_scribe_in_composer_extension.dart index 549465e31..ed334b810 100644 --- a/lib/features/composer/presentation/extensions/ai_scribe/handle_ai_scribe_in_composer_extension.dart +++ b/lib/features/composer/presentation/extensions/ai_scribe/handle_ai_scribe_in_composer_extension.dart @@ -101,6 +101,9 @@ extension HandleAiScribeInComposerExtension on ComposerController { } Future openAIAssistantModal(Offset? position, Size? size) async { + clearFocusRecipients(); + clearFocusSubject(); + final fullText = await _getTextOnlyContentInEditor(); await AiScribeModalManager.showAIScribeMenuModal( diff --git a/lib/features/composer/presentation/widgets/ai_scribe/composer_ai_scribe_selection_overlay.dart b/lib/features/composer/presentation/widgets/ai_scribe/composer_ai_scribe_selection_overlay.dart index 89f060601..eb859653b 100644 --- a/lib/features/composer/presentation/widgets/ai_scribe/composer_ai_scribe_selection_overlay.dart +++ b/lib/features/composer/presentation/widgets/ai_scribe/composer_ai_scribe_selection_overlay.dart @@ -24,7 +24,13 @@ class ComposerAiScribeSelectionOverlay extends StatelessWidget { imagePaths: controller.imagePaths, onSelectAiScribeSuggestionAction: controller.handleAiScribeSuggestionAction, + onTapFallback: _clearComposerInputFocus, ); }); } + + void _clearComposerInputFocus() { + controller.clearFocusRecipients(); + controller.clearFocusSubject(); + } } diff --git a/scribe/lib/scribe/ai/presentation/widgets/button/inline_ai_assist_button.dart b/scribe/lib/scribe/ai/presentation/widgets/button/inline_ai_assist_button.dart index 1b36ed095..06d3524ad 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/button/inline_ai_assist_button.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/button/inline_ai_assist_button.dart @@ -7,12 +7,14 @@ class InlineAiAssistButton extends StatelessWidget { final ImagePaths imagePaths; final String? selectedText; final OnSelectAiScribeSuggestionAction onSelectAiScribeSuggestionAction; + final VoidCallback? onTapFallback; const InlineAiAssistButton({ super.key, required this.imagePaths, required this.onSelectAiScribeSuggestionAction, this.selectedText, + this.onTapFallback, }); @override @@ -40,6 +42,8 @@ class InlineAiAssistButton extends StatelessWidget { size = renderBox.size; } + onTapFallback?.call(); + await AiScribeModalManager.showAIScribeMenuModal( imagePaths: imagePaths, availableCategories: AIScribeMenuCategory.values, diff --git a/scribe/lib/scribe/ai/presentation/widgets/overlay/ai_selection_overlay.dart b/scribe/lib/scribe/ai/presentation/widgets/overlay/ai_selection_overlay.dart index 33581851a..ea0621c4d 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/overlay/ai_selection_overlay.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/overlay/ai_selection_overlay.dart @@ -9,11 +9,13 @@ class AiSelectionOverlay extends StatelessWidget { required this.selection, required this.imagePaths, required this.onSelectAiScribeSuggestionAction, + this.onTapFallback, }); final TextSelectionModel? selection; final ImagePaths imagePaths; final OnSelectAiScribeSuggestionAction onSelectAiScribeSuggestionAction; + final VoidCallback? onTapFallback; @override Widget build(BuildContext context) { @@ -34,6 +36,7 @@ class AiSelectionOverlay extends StatelessWidget { imagePaths: imagePaths, selectedText: selectedText, onSelectAiScribeSuggestionAction: onSelectAiScribeSuggestionAction, + onTapFallback: onTapFallback, ), ), ); diff --git a/scribe/lib/scribe/ai/presentation/widgets/search/ai_scribe_bar.dart b/scribe/lib/scribe/ai/presentation/widgets/search/ai_scribe_bar.dart index eec55b5c4..b4f804ee5 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/search/ai_scribe_bar.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/search/ai_scribe_bar.dart @@ -71,22 +71,26 @@ class _AIScribeBarState extends State { child: Row( children: [ Expanded( - child: KeyboardListener( - focusNode: _focusNode, - onKeyEvent: _handleKeyboardEvent, - child: TextField( - controller: _controller, - decoration: InputDecoration( - hintText: ScribeLocalizations.of(context).inputPlaceholder, - hintStyle: AIScribeTextStyles.searchBarHint, - border: InputBorder.none, - contentPadding: const EdgeInsets.symmetric(vertical: 8), - isDense: true, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: _focusNode.requestFocus, + child: KeyboardListener( + focusNode: _focusNode, + onKeyEvent: _handleKeyboardEvent, + child: TextField( + controller: _controller, + decoration: InputDecoration( + hintText: ScribeLocalizations.of(context).inputPlaceholder, + hintStyle: AIScribeTextStyles.searchBarHint, + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric(vertical: 8), + isDense: true, + ), + style: AIScribeTextStyles.searchBar, + maxLines: null, + keyboardType: TextInputType.multiline, + cursorHeight: 16, ), - style: AIScribeTextStyles.searchBar, - maxLines: null, - keyboardType: TextInputType.multiline, - cursorHeight: 16, ), ), ),