From 575abd235fca3d865d5bc6d9c54f58f9c24bd9d9 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 6 Aug 2025 00:53:02 +0700 Subject: [PATCH] TF-3944 Automatically close `CC, Bcc, ReplyTo` input field when clicking outside of it, regardless of whether it has been filled or not Signed-off-by: dab246 --- .../presentation/composer_controller.dart | 23 +++++++++++++++++++ .../presentation/composer_view_web.dart | 6 ++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index a096e3f5c..4aa5999ec 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -586,6 +586,9 @@ class ComposerController extends BaseController } _collapseAllRecipient(); autoCreateEmailTag(); + if (PlatformInfo.isWeb) { + _hideCcBccReplyToRecipients(); + } } } @@ -1359,6 +1362,14 @@ class ComposerController extends BaseController FocusScope.of(context).unfocus(); } + void clickOutsideComposer(BuildContext context) { + clearFocus(context); + if (PlatformInfo.isWeb) { + _collapseAllRecipient(); + _hideCcBccReplyToRecipients(); + } + } + void _closeComposerAction({dynamic result, bool closeOverlays = false}) { mailboxDashBoardController.closeComposer( result: result, @@ -1432,6 +1443,12 @@ class ComposerController extends BaseController replyToAddressExpandMode.value = ExpandMode.COLLAPSE; } + void _hideCcBccReplyToRecipients() { + ccRecipientState.value = PrefixRecipientState.disabled; + bccRecipientState.value = PrefixRecipientState.disabled; + replyToRecipientState.value = PrefixRecipientState.disabled; + } + void _closeSuggestionBox() { if (toEmailAddressController.text.isEmpty) { keyToEmailTagEditor.currentState?.closeSuggestionBox(); @@ -1660,6 +1677,9 @@ class ComposerController extends BaseController } _collapseAllRecipient(); autoCreateEmailTag(); + if (PlatformInfo.isWeb) { + _hideCcBccReplyToRecipients(); + } } void _onChangeCursorOnMobile(List? coordinates, BuildContext context) { @@ -1791,6 +1811,9 @@ class ComposerController extends BaseController void handleOnMouseDownHtmlEditorWeb() { _collapseAllRecipient(); autoCreateEmailTag(); + if (PlatformInfo.isWeb) { + _hideCcBccReplyToRecipients(); + } } FocusNode? getNextFocusOfToEmailAddress() { diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index d0cf84e87..3bd42ddad 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -44,7 +44,7 @@ class ComposerView extends GetWidget { mobile: MobileResponsiveContainerView( childBuilder: (context, constraints) { return GestureDetector( - onTap: () => controller.clearFocus(context), + onTap: () => controller.clickOutsideComposer(context), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -342,7 +342,7 @@ class ComposerView extends GetWidget { desktop: Obx(() => DesktopResponsiveContainerView( childBuilder: (context, constraints) { return GestureDetector( - onTap: () => controller.clearFocus(context), + onTap: () => controller.clickOutsideComposer(context), child: Column(children: [ Obx(() => DesktopAppBarComposerWidget( imagePaths: controller.imagePaths, @@ -666,7 +666,7 @@ class ComposerView extends GetWidget { tablet: TabletResponsiveContainerView( childBuilder: (context, constraints) { return GestureDetector( - onTap: () => controller.clearFocus(context), + onTap: () => controller.clickOutsideComposer(context), child: Column(children: [ Obx(() => DesktopAppBarComposerWidget( imagePaths: controller.imagePaths,