From 89eb1ecc71e5656eff00c3397a0a6bed6c1c46a8 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 19 Dec 2025 09:59:38 +0700 Subject: [PATCH] feat(ai-scribe): Fix click on response text of AI, dialog to be disappeared --- .../utils/modal/ai_scribe_modal_manager.dart | 1 - .../widgets/modal/ai_scribe_modal_widget.dart | 76 ++++++++++--------- .../modal/ai_scribe_suggestion_widget.dart | 62 ++++++++------- 3 files changed, 73 insertions(+), 66 deletions(-) diff --git a/scribe/lib/scribe/ai/presentation/utils/modal/ai_scribe_modal_manager.dart b/scribe/lib/scribe/ai/presentation/utils/modal/ai_scribe_modal_manager.dart index dbf879c20..1db93eabd 100644 --- a/scribe/lib/scribe/ai/presentation/utils/modal/ai_scribe_modal_manager.dart +++ b/scribe/lib/scribe/ai/presentation/utils/modal/ai_scribe_modal_manager.dart @@ -67,7 +67,6 @@ class AiScribeModalManager { crossAxisAlignment: crossAxisAlignment, onSelectAiScribeSuggestionAction: onSelectAiScribeSuggestionAction, ), - barrierDismissible: false, barrierColor: AIScribeColors.dialogBarrier, ); } diff --git a/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart b/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart index 166a98028..9250bccda 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart @@ -39,34 +39,36 @@ class AiScribeModalWidget extends StatelessWidget { )) .toList(); - final dialogContent = Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - spacing: AIScribeSizes.fieldSpacing, - children: [ - if (hasContent) - Flexible( - child: AiScribeContextMenu( - imagePaths: imagePaths, - menuActions: menuActions, - submenuController: submenuController, - onActionSelected: (menuAction) => _onActionSelected( - context, - menuAction, + final dialogContent = PointerInterceptor( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: AIScribeSizes.fieldSpacing, + children: [ + if (hasContent) + Flexible( + child: AiScribeContextMenu( + imagePaths: imagePaths, + menuActions: menuActions, + submenuController: submenuController, + onActionSelected: (menuAction) => _onActionSelected( + context, + menuAction, + ), ), ), + MouseRegion( + onEnter: (_) => submenuController?.hide(), + child: AIScribeBar( + imagePaths: imagePaths, + onCustomPrompt: (customPrompt) { + Navigator.of(context).pop(CustomPromptAction(customPrompt)); + submenuController?.hide(); + }, + ), ), - MouseRegion( - onEnter: (_) => submenuController?.hide(), - child: AIScribeBar( - imagePaths: imagePaths, - onCustomPrompt: (customPrompt) { - Navigator.of(context).pop(CustomPromptAction(customPrompt)); - submenuController?.hide(); - }, - ), - ), - ], + ], + ), ); if (buttonPosition != null && buttonSize != null) { @@ -102,18 +104,20 @@ class AiScribeModalWidget extends StatelessWidget { : position.dy; return PointerInterceptor( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: Navigator.of(context).pop, - child: Stack( - children: [ - PositionedDirectional( - start: position.dx, - top: top, - child: dialogContent, + child: Stack( + children: [ + Positioned.fill( + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: Navigator.of(context).pop, ), - ], - ), + ), + PositionedDirectional( + start: position.dx, + top: top, + child: dialogContent, + ), + ], ), ); } diff --git a/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart b/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart index 988f3c9a0..3c8a9f99e 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart @@ -109,23 +109,25 @@ class _AiScribeSuggestionWidgetState extends State { ); return PointerInterceptor( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: _handleClickOutside, - child: Stack( - children: [ - PositionedDirectional( - start: layout.offset.dx, - top: layout.top, - bottom: layout.bottom, - child: _buildModalContainer( - width: modalWidth, - maxHeight: layout.availableHeight, - child: dialogContent, - ), + child: Stack( + children: [ + Positioned.fill( + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: _handleClickOutside, ), - ], - ), + ), + PositionedDirectional( + start: layout.offset.dx, + top: layout.top, + bottom: layout.bottom, + child: _buildModalContainer( + width: modalWidth, + maxHeight: layout.availableHeight, + child: dialogContent, + ), + ), + ], ), ); } @@ -177,21 +179,23 @@ class _AiScribeSuggestionWidgetState extends State { required double maxHeight, required Widget child, }) { - return Container( - width: width, - constraints: BoxConstraints( - minHeight: AIScribeSizes.suggestionModalMinHeight, - maxHeight: maxHeight, - ), - padding: AIScribeSizes.suggestionContentPadding, - decoration: BoxDecoration( - color: AIScribeColors.background, - borderRadius: BorderRadius.circular( - AIScribeSizes.menuRadius, + return PointerInterceptor( + child: Container( + width: width, + constraints: BoxConstraints( + minHeight: AIScribeSizes.suggestionModalMinHeight, + maxHeight: maxHeight, ), - boxShadow: AIScribeShadows.modal, + padding: AIScribeSizes.suggestionContentPadding, + decoration: BoxDecoration( + color: AIScribeColors.background, + borderRadius: BorderRadius.circular( + AIScribeSizes.menuRadius, + ), + boxShadow: AIScribeShadows.modal, + ), + child: child, ), - child: child, ); }