diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index c845ff7e8..4d18f3bc3 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -314,6 +314,17 @@ class ComposerController extends BaseController { void createFocusNodeInput() { toAddressFocusNode = FocusNode(); subjectEmailInputFocusNode = FocusNode(); + + subjectEmailInputFocusNode?.addListener(() { + log('ComposerController::createFocusNodeInput():subjectEmailInputFocusNode: ${subjectEmailInputFocusNode?.hasFocus}'); + if (subjectEmailInputFocusNode?.hasFocus == true) { + if (!BuildUtils.isWeb) { + htmlEditorApi?.unfocus(); + } + _collapseAllRecipient(); + _autoCreateEmailTag(); + } + }); } void initRichTextForMobile(BuildContext context, HtmlEditorApi editorApi) { @@ -322,14 +333,8 @@ class ComposerController extends BaseController { editorApi, onEnterKeyDown: _onEnterKeyDown, context: context, + onFocus: _onEditorFocusOnMobile ); - - richTextMobileTabletController.htmlEditorApi?.onFocus = () { - FocusManager.instance.primaryFocus?.unfocus(); - - _collapseAllRecipient(); - _autoCreateEmailTag(); - }; } void _initEmail() { @@ -1170,15 +1175,6 @@ class ComposerController extends BaseController { } } - void onSubjectEmailFocusChange(bool isFocus) { - log('ComposerController::onSubjectEmailFocusChange(): Focus: $isFocus'); - if (isFocus) { - _collapseAllRecipient(); - htmlEditorApi?.unfocus(); - _autoCreateEmailTag(); - } - } - void onEditorFocusChange(bool isFocus) { log('ComposerController::onEditorFocusChange(): Focus: $isFocus'); if (isFocus) { @@ -1312,6 +1308,9 @@ class ComposerController extends BaseController { break; } _closeSuggestionBox(); + if (!BuildUtils.isWeb) { + htmlEditorApi?.unfocus(); + } } else { if (!BuildUtils.isWeb) { _collapseAllRecipient(); @@ -1507,6 +1506,13 @@ class ComposerController extends BaseController { popBack(); } + void _onEditorFocusOnMobile() { + if (Platform.isAndroid) { + _collapseAllRecipient(); + _autoCreateEmailTag(); + } + } + void _onEnterKeyDown() { if(scrollController.position.pixels < scrollController.position.maxScrollExtent) { scrollController.animateTo( diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index 7cc4b908f..a6eab3e26 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -337,115 +337,100 @@ class ComposerView extends GetWidget } Widget _buildEmailAddress(BuildContext context) { - return Focus( - onFocusChange: (focus) { - if(focus) { - controller.htmlEditorApi?.unfocus(); - controller.keyboardRichTextController.hideRichTextView(); - } - }, - child: Column( - children: [ - Obx(() => Padding( - padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), - child: (EmailAddressInputBuilder(context, imagePaths, - PrefixEmailAddress.to, - controller.listToEmailAddress, - controller.listEmailAddressType, - expandMode: controller.toAddressExpandMode.value, - controller: controller.toEmailAddressController, - focusNode: controller.toAddressFocusNode, - autoDisposeFocusNode: false, - keyTagEditor: controller.keyToEmailTagEditor, - isInitial: controller.isInitialRecipient.value) - ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) - ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) - ..addOnAddEmailAddressTypeAction((prefixEmailAddress) => controller.addEmailAddressType(prefixEmailAddress)) - ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word))) - .build() - )), - Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true - ? const Divider(color: AppColor.colorDividerComposer, height: 1) - : const SizedBox.shrink()), - Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true - ? Padding( - padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), - child: (EmailAddressInputBuilder(context, imagePaths, - PrefixEmailAddress.cc, - controller.listCcEmailAddress, - controller.listEmailAddressType, - expandMode: controller.ccAddressExpandMode.value, - controller: controller.ccEmailAddressController, - keyTagEditor: controller.keyCcEmailTagEditor, - isInitial: controller.isInitialRecipient.value,) - ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) - ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) - ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) - ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word))) - .build()) - : const SizedBox.shrink() - ), - Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true - ? const Divider(color: AppColor.colorDividerComposer, height: 1) - : const SizedBox.shrink()), - Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true - ? Padding( - padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), - child: (EmailAddressInputBuilder(context, imagePaths, - PrefixEmailAddress.bcc, - controller.listBccEmailAddress, - controller.listEmailAddressType, - expandMode: controller.bccAddressExpandMode.value, - controller: controller.bccEmailAddressController, - keyTagEditor: controller.keyBccEmailTagEditor, - isInitial: controller.isInitialRecipient.value,) - ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) - ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) - ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) - ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word))) - .build()) - : const SizedBox.shrink() - ), - ], - ), + return Column( + children: [ + Obx(() => Padding( + padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), + child: (EmailAddressInputBuilder(context, imagePaths, + PrefixEmailAddress.to, + controller.listToEmailAddress, + controller.listEmailAddressType, + expandMode: controller.toAddressExpandMode.value, + controller: controller.toEmailAddressController, + focusNode: controller.toAddressFocusNode, + autoDisposeFocusNode: false, + keyTagEditor: controller.keyToEmailTagEditor, + isInitial: controller.isInitialRecipient.value) + ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) + ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) + ..addOnAddEmailAddressTypeAction((prefixEmailAddress) => controller.addEmailAddressType(prefixEmailAddress)) + ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) + ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word))) + .build() + )), + Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true + ? const Divider(color: AppColor.colorDividerComposer, height: 1) + : const SizedBox.shrink()), + Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true + ? Padding( + padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), + child: (EmailAddressInputBuilder(context, imagePaths, + PrefixEmailAddress.cc, + controller.listCcEmailAddress, + controller.listEmailAddressType, + expandMode: controller.ccAddressExpandMode.value, + controller: controller.ccEmailAddressController, + keyTagEditor: controller.keyCcEmailTagEditor, + isInitial: controller.isInitialRecipient.value,) + ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) + ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) + ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) + ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) + ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word))) + .build()) + : const SizedBox.shrink() + ), + Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true + ? const Divider(color: AppColor.colorDividerComposer, height: 1) + : const SizedBox.shrink()), + Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true + ? Padding( + padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), + child: (EmailAddressInputBuilder(context, imagePaths, + PrefixEmailAddress.bcc, + controller.listBccEmailAddress, + controller.listEmailAddressType, + expandMode: controller.bccAddressExpandMode.value, + controller: controller.bccEmailAddressController, + keyTagEditor: controller.keyBccEmailTagEditor, + isInitial: controller.isInitialRecipient.value,) + ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) + ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) + ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) + ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) + ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word))) + .build()) + : const SizedBox.shrink() + ), + ], ); } Widget _buildSubjectEmail(BuildContext context) { - return Focus( - onFocusChange: (focus) { - if(focus) { - controller.htmlEditorApi?.unfocus(); - controller.keyboardRichTextController.hideRichTextView(); - } - }, - child: Row( - children: [ - Padding( - padding: const EdgeInsets.only(right: 8), - child: Text( - '${AppLocalizations.of(context).subject_email}:', - style: const TextStyle(fontSize: 15, color: AppColor.colorHintEmailAddressInput))), - Expanded( - child: FocusScope(child: Focus( - onFocusChange: (focus) => controller.onSubjectEmailFocusChange(focus), - child: (TextFieldBuilder() - ..key(const Key('subject_email_input')) - ..cursorColor(AppColor.colorTextButton) - ..maxLines(responsiveUtils.isMobile(context) ? null : 1) - ..addFocusNode(controller.subjectEmailInputFocusNode) - ..onChange((value) => controller.setSubjectEmail(value)) - ..textStyle(const TextStyle(color: Colors.black, fontSize: 15, fontWeight: FontWeight.normal)) - ..textDecoration(const InputDecoration(contentPadding: EdgeInsets.zero, border: InputBorder.none)) - ..addController(controller.subjectEmailInputController)) - .build(), - )) + log('ComposerView::_buildSubjectEmail(): '); + return Row( + children: [ + Padding( + padding: const EdgeInsets.only(right: 8), + child: Text( + '${AppLocalizations.of(context).subject_email}:', + style: const TextStyle( + fontSize: 15, + color: AppColor.colorHintEmailAddressInput ) - ] - ), + ) + ), + Expanded(child: (TextFieldBuilder() + ..key(const Key('subject_email_input')) + ..cursorColor(AppColor.colorTextButton) + ..maxLines(responsiveUtils.isMobile(context) ? null : 1) + ..addFocusNode(controller.subjectEmailInputFocusNode) + ..onChange((value) => controller.setSubjectEmail(value)) + ..textStyle(const TextStyle(color: Colors.black, fontSize: 15, fontWeight: FontWeight.normal)) + ..textDecoration(const InputDecoration(contentPadding: EdgeInsets.zero, border: InputBorder.none)) + ..addController(controller.subjectEmailInputController)) + .build()) + ] ); } diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index 46c02fdfa..b51f24009 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -544,28 +544,29 @@ class ComposerView extends GetWidget Widget _buildSubjectEmail(BuildContext context) { return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(right: 8, top: 16), - child: Text( - '${AppLocalizations.of(context).subject_email}:', - style: const TextStyle(fontSize: 15, color: AppColor.colorHintEmailAddressInput))), - Expanded( - child: FocusScope(child: Focus( - onFocusChange: (focus) => controller.onSubjectEmailFocusChange(focus), - child: (TextFieldBuilder() - ..key(const Key('subject_email_input')) - ..cursorColor(AppColor.colorTextButton) - ..addFocusNode(controller.subjectEmailInputFocusNode) - ..onChange((value) => controller.setSubjectEmail(value)) - ..textStyle(const TextStyle(color: Colors.black, fontSize: 15, fontWeight: FontWeight.normal)) - ..textDecoration(const InputDecoration(contentPadding: EdgeInsets.zero, border: InputBorder.none)) - ..addController(controller.subjectEmailInputController)) - .build(), - )) + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(right: 8, top: 16), + child: Text( + '${AppLocalizations.of(context).subject_email}:', + style: const TextStyle( + fontSize: 15, + color: AppColor.colorHintEmailAddressInput + ) ) - ] + ), + Expanded(child: (TextFieldBuilder() + ..key(const Key('subject_email_input')) + ..cursorColor(AppColor.colorTextButton) + ..addFocusNode(controller.subjectEmailInputFocusNode) + ..onChange((value) => controller.setSubjectEmail(value)) + ..textStyle(const TextStyle(color: Colors.black, fontSize: 15, fontWeight: FontWeight.normal)) + ..textDecoration(const InputDecoration(contentPadding: EdgeInsets.zero, border: InputBorder.none)) + ..addController(controller.subjectEmailInputController)) + .build() + ) + ] ); }