From 8bc0a9dcca910b1deb633bb8cae82bccb91d0c00 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 1 Aug 2025 09:29:17 +0700 Subject: [PATCH] TF-3889 Fix cannot see input when typing email body with attachments on mobile Signed-off-by: dab246 --- .../composer/presentation/composer_view.dart | 281 +++++++++--------- 1 file changed, 144 insertions(+), 137 deletions(-) diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index 1a625b132..084e0084d 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -102,121 +102,43 @@ class ComposerView extends GetWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Obx(() { - if (controller.fromRecipientState.value == PrefixRecipientState.enabled) { - return FromComposerMobileWidget( - selectedIdentity: controller.identitySelected.value, - imagePaths: controller.imagePaths, - responsiveUtils: controller.responsiveUtils, - margin: ComposerStyle.mobileRecipientMargin, - padding: ComposerStyle.mobileRecipientPadding, - onTap: () => controller.openSelectIdentityBottomSheet(context) - ); - } else { - return const SizedBox.shrink(); - } - }), - Obx(() => RecipientComposerWidget( - prefix: PrefixEmailAddress.to, - listEmailAddress: controller.listToEmailAddress, - imagePaths: controller.imagePaths, - maxWidth: constraints.maxWidth, - minInputLengthAutocomplete: controller.minInputLengthAutocomplete, - fromState: controller.fromRecipientState.value, - ccState: controller.ccRecipientState.value, - bccState: controller.bccRecipientState.value, - replyToState: controller.replyToRecipientState.value, - expandMode: controller.toAddressExpandMode.value, - controller: controller.toEmailAddressController, - focusNode: controller.toAddressFocusNode, - keyTagEditor: controller.keyToEmailTagEditor, - isInitial: controller.isInitialRecipient.value, - padding: ComposerStyle.mobileRecipientPadding, - margin: ComposerStyle.mobileRecipientMargin, - nextFocusNode: controller.getNextFocusOfToEmailAddress(), - onFocusEmailAddressChangeAction: controller.onEmailAddressFocusChange, - onShowFullListEmailAddressAction: controller.showFullEmailAddress, - onAddEmailAddressTypeAction: controller.addEmailAddressType, - onUpdateListEmailAddressAction: controller.updateListEmailAddress, - onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, - onFocusNextAddressAction: controller.handleFocusNextAddressAction, - onEnableAllRecipientsInputAction: controller.handleEnableRecipientsInputAction, - onEditRecipientAction: controller.onEditRecipient, - onClearFocusAction: controller.onClearFocusAction, - )), - Obx(() { - if (controller.ccRecipientState.value == PrefixRecipientState.enabled) { - return RecipientComposerWidget( - prefix: PrefixEmailAddress.cc, - listEmailAddress: controller.listCcEmailAddress, + Column( + key: controller.headerEditorMobileWidgetKey, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Obx(() { + if (controller.fromRecipientState.value == PrefixRecipientState.enabled) { + return FromComposerMobileWidget( + selectedIdentity: controller.identitySelected.value, + imagePaths: controller.imagePaths, + responsiveUtils: controller.responsiveUtils, + margin: ComposerStyle.mobileRecipientMargin, + padding: ComposerStyle.mobileRecipientPadding, + onTap: () => controller.openSelectIdentityBottomSheet(context) + ); + } else { + return const SizedBox.shrink(); + } + }), + Obx(() => RecipientComposerWidget( + prefix: PrefixEmailAddress.to, + listEmailAddress: controller.listToEmailAddress, imagePaths: controller.imagePaths, maxWidth: constraints.maxWidth, minInputLengthAutocomplete: controller.minInputLengthAutocomplete, - expandMode: controller.ccAddressExpandMode.value, - controller: controller.ccEmailAddressController, - focusNode: controller.ccAddressFocusNode, - keyTagEditor: controller.keyCcEmailTagEditor, - isInitial: controller.isInitialRecipient.value, - nextFocusNode: controller.getNextFocusOfCcEmailAddress(), - padding: ComposerStyle.mobileRecipientPadding, - margin: ComposerStyle.mobileRecipientMargin, - onFocusEmailAddressChangeAction: controller.onEmailAddressFocusChange, - onShowFullListEmailAddressAction: controller.showFullEmailAddress, - onDeleteEmailAddressTypeAction: controller.deleteEmailAddressType, - onUpdateListEmailAddressAction: controller.updateListEmailAddress, - onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, - onFocusNextAddressAction: controller.handleFocusNextAddressAction, - onEditRecipientAction: controller.onEditRecipient, - onClearFocusAction: controller.onClearFocusAction, - ); - } else { - return const SizedBox.shrink(); - } - }), - Obx(() { - if (controller.bccRecipientState.value == PrefixRecipientState.enabled) { - return RecipientComposerWidget( - prefix: PrefixEmailAddress.bcc, - listEmailAddress: controller.listBccEmailAddress, - imagePaths: controller.imagePaths, - maxWidth: constraints.maxWidth, - minInputLengthAutocomplete: controller.minInputLengthAutocomplete, - expandMode: controller.bccAddressExpandMode.value, - controller: controller.bccEmailAddressController, - focusNode: controller.bccAddressFocusNode, - keyTagEditor: controller.keyBccEmailTagEditor, + fromState: controller.fromRecipientState.value, + ccState: controller.ccRecipientState.value, + bccState: controller.bccRecipientState.value, + replyToState: controller.replyToRecipientState.value, + expandMode: controller.toAddressExpandMode.value, + controller: controller.toEmailAddressController, + focusNode: controller.toAddressFocusNode, + keyTagEditor: controller.keyToEmailTagEditor, isInitial: controller.isInitialRecipient.value, padding: ComposerStyle.mobileRecipientPadding, margin: ComposerStyle.mobileRecipientMargin, - nextFocusNode: controller.getNextFocusOfBccEmailAddress(), - onFocusEmailAddressChangeAction: controller.onEmailAddressFocusChange, - onShowFullListEmailAddressAction: controller.showFullEmailAddress, - onDeleteEmailAddressTypeAction: controller.deleteEmailAddressType, - onUpdateListEmailAddressAction: controller.updateListEmailAddress, - onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, - onFocusNextAddressAction: controller.handleFocusNextAddressAction, - onEditRecipientAction: controller.onEditRecipient, - onClearFocusAction: controller.onClearFocusAction, - ); - } else { - return const SizedBox.shrink(); - } - }), - Obx(() { - if (controller.replyToRecipientState.value == PrefixRecipientState.enabled) { - return RecipientComposerWidget( - prefix: PrefixEmailAddress.replyTo, - listEmailAddress: controller.listReplyToEmailAddress, - imagePaths: controller.imagePaths, - maxWidth: constraints.maxWidth, - expandMode: controller.replyToAddressExpandMode.value, - controller: controller.replyToEmailAddressController, - focusNode: controller.replyToAddressFocusNode, - keyTagEditor: controller.keyReplyToEmailTagEditor, - isInitial: controller.isInitialRecipient.value, - padding: ComposerStyle.mobileRecipientPadding, - margin: ComposerStyle.mobileRecipientMargin, - nextFocusNode: controller.subjectEmailInputFocusNode, + nextFocusNode: controller.getNextFocusOfToEmailAddress(), onFocusEmailAddressChangeAction: controller.onEmailAddressFocusChange, onShowFullListEmailAddressAction: controller.showFullEmailAddress, onAddEmailAddressTypeAction: controller.addEmailAddressType, @@ -226,35 +148,120 @@ class ComposerView extends GetWidget { onEnableAllRecipientsInputAction: controller.handleEnableRecipientsInputAction, onEditRecipientAction: controller.onEditRecipient, onClearFocusAction: controller.onClearFocusAction, - ); - } else { - return const SizedBox.shrink(); - } - }), - SubjectComposerWidget( - focusNode: controller.subjectEmailInputFocusNode, - textController: controller.subjectEmailInputController, - onTextChange: controller.setSubjectEmail, - padding: ComposerStyle.mobileSubjectPadding, - margin: ComposerStyle.mobileSubjectMargin, + )), + Obx(() { + if (controller.ccRecipientState.value == PrefixRecipientState.enabled) { + return RecipientComposerWidget( + prefix: PrefixEmailAddress.cc, + listEmailAddress: controller.listCcEmailAddress, + imagePaths: controller.imagePaths, + maxWidth: constraints.maxWidth, + minInputLengthAutocomplete: controller.minInputLengthAutocomplete, + expandMode: controller.ccAddressExpandMode.value, + controller: controller.ccEmailAddressController, + focusNode: controller.ccAddressFocusNode, + keyTagEditor: controller.keyCcEmailTagEditor, + isInitial: controller.isInitialRecipient.value, + nextFocusNode: controller.getNextFocusOfCcEmailAddress(), + padding: ComposerStyle.mobileRecipientPadding, + margin: ComposerStyle.mobileRecipientMargin, + onFocusEmailAddressChangeAction: controller.onEmailAddressFocusChange, + onShowFullListEmailAddressAction: controller.showFullEmailAddress, + onDeleteEmailAddressTypeAction: controller.deleteEmailAddressType, + onUpdateListEmailAddressAction: controller.updateListEmailAddress, + onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, + onFocusNextAddressAction: controller.handleFocusNextAddressAction, + onEditRecipientAction: controller.onEditRecipient, + onClearFocusAction: controller.onClearFocusAction, + ); + } else { + return const SizedBox.shrink(); + } + }), + Obx(() { + if (controller.bccRecipientState.value == PrefixRecipientState.enabled) { + return RecipientComposerWidget( + prefix: PrefixEmailAddress.bcc, + listEmailAddress: controller.listBccEmailAddress, + imagePaths: controller.imagePaths, + maxWidth: constraints.maxWidth, + minInputLengthAutocomplete: controller.minInputLengthAutocomplete, + expandMode: controller.bccAddressExpandMode.value, + controller: controller.bccEmailAddressController, + focusNode: controller.bccAddressFocusNode, + keyTagEditor: controller.keyBccEmailTagEditor, + isInitial: controller.isInitialRecipient.value, + padding: ComposerStyle.mobileRecipientPadding, + margin: ComposerStyle.mobileRecipientMargin, + nextFocusNode: controller.getNextFocusOfBccEmailAddress(), + onFocusEmailAddressChangeAction: controller.onEmailAddressFocusChange, + onShowFullListEmailAddressAction: controller.showFullEmailAddress, + onDeleteEmailAddressTypeAction: controller.deleteEmailAddressType, + onUpdateListEmailAddressAction: controller.updateListEmailAddress, + onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, + onFocusNextAddressAction: controller.handleFocusNextAddressAction, + onEditRecipientAction: controller.onEditRecipient, + onClearFocusAction: controller.onClearFocusAction, + ); + } else { + return const SizedBox.shrink(); + } + }), + Obx(() { + if (controller.replyToRecipientState.value == PrefixRecipientState.enabled) { + return RecipientComposerWidget( + prefix: PrefixEmailAddress.replyTo, + listEmailAddress: controller.listReplyToEmailAddress, + imagePaths: controller.imagePaths, + maxWidth: constraints.maxWidth, + expandMode: controller.replyToAddressExpandMode.value, + controller: controller.replyToEmailAddressController, + focusNode: controller.replyToAddressFocusNode, + keyTagEditor: controller.keyReplyToEmailTagEditor, + isInitial: controller.isInitialRecipient.value, + padding: ComposerStyle.mobileRecipientPadding, + margin: ComposerStyle.mobileRecipientMargin, + nextFocusNode: controller.subjectEmailInputFocusNode, + onFocusEmailAddressChangeAction: controller.onEmailAddressFocusChange, + onShowFullListEmailAddressAction: controller.showFullEmailAddress, + onAddEmailAddressTypeAction: controller.addEmailAddressType, + onUpdateListEmailAddressAction: controller.updateListEmailAddress, + onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, + onFocusNextAddressAction: controller.handleFocusNextAddressAction, + onEnableAllRecipientsInputAction: controller.handleEnableRecipientsInputAction, + onEditRecipientAction: controller.onEditRecipient, + onClearFocusAction: controller.onClearFocusAction, + ); + } else { + return const SizedBox.shrink(); + } + }), + SubjectComposerWidget( + focusNode: controller.subjectEmailInputFocusNode, + textController: controller.subjectEmailInputController, + onTextChange: controller.setSubjectEmail, + padding: ComposerStyle.mobileSubjectPadding, + margin: ComposerStyle.mobileSubjectMargin, + ), + Obx(() { + if (controller.uploadController.listUploadAttachments.isNotEmpty) { + return MobileAttachmentComposerWidget( + listFileUploaded: controller.uploadController.listUploadAttachments, + onDeleteAttachmentAction: controller.deleteAttachmentUploaded, + ); + } else { + return const SizedBox.shrink(); + } + }), + Obx(() => Center( + child: InsertImageLoadingBarWidget( + uploadInlineViewState: controller.uploadController.uploadInlineViewState.value, + viewState: controller.viewState.value, + margin: ComposerStyle.insertImageLoadingBarMargin, + ), + )) + ], ), - Obx(() { - if (controller.uploadController.listUploadAttachments.isNotEmpty) { - return MobileAttachmentComposerWidget( - listFileUploaded: controller.uploadController.listUploadAttachments, - onDeleteAttachmentAction: controller.deleteAttachmentUploaded, - ); - } else { - return const SizedBox.shrink(); - } - }), - Obx(() => Center( - child: InsertImageLoadingBarWidget( - uploadInlineViewState: controller.uploadController.uploadInlineViewState.value, - viewState: controller.viewState.value, - margin: ComposerStyle.insertImageLoadingBarMargin, - ), - )), Obx(() => Padding( padding: ComposerStyle.mobileEditorPadding, child: MobileEditorView(