diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 3a6a3d3d6..9175ec894 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -68,7 +68,6 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/list_sha import 'package:tmail_ui_user/features/composer/presentation/extensions/update_screen_display_mode_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/mixin/drag_drog_file_mixin.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart'; -import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/saved_email_draft.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/signature_status.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/inline_image.dart'; @@ -2130,33 +2129,7 @@ class ComposerController extends BaseController void setSubjectEmail(String subject) => subjectEmail.value = subject; - void removeDraggableEmailAddress(DraggableEmailAddress draggableEmailAddress) { - log('ComposerController::removeDraggableEmailAddress: $draggableEmailAddress'); - switch(draggableEmailAddress.prefix) { - case PrefixEmailAddress.to: - listToEmailAddress.remove(draggableEmailAddress.emailAddress); - toAddressExpandMode.value = ExpandMode.EXPAND; - break; - case PrefixEmailAddress.cc: - listCcEmailAddress.remove(draggableEmailAddress.emailAddress); - ccAddressExpandMode.value = ExpandMode.EXPAND; - break; - case PrefixEmailAddress.bcc: - listBccEmailAddress.remove(draggableEmailAddress.emailAddress); - bccAddressExpandMode.value = ExpandMode.EXPAND; - break; - case PrefixEmailAddress.replyTo: - listReplyToEmailAddress.remove(draggableEmailAddress.emailAddress); - replyToAddressExpandMode.value = ExpandMode.EXPAND; - break; - default: - break; - } - isInitialRecipient.value = true; - isInitialRecipient.refresh(); - updateStatusEmailSendButton(); - } void onAttachmentDropZoneListener(Attachment attachment) { log('ComposerController::onAttachmentDropZoneListener: attachment = $attachment'); diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index f5ad46d9e..3f3d06052 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -7,6 +7,7 @@ import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/composer_print_draft_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/mark_as_important_extension.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/remove_draggable_email_address_between_recipient_fields_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/prefix_recipient_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/composer_style.dart'; import 'package:tmail_ui_user/features/composer/presentation/view/web/desktop_responsive_container_view.dart'; @@ -92,6 +93,7 @@ class ComposerView extends GetWidget { ), ), RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.to, listEmailAddress: controller.listToEmailAddress, imagePaths: controller.imagePaths, @@ -122,6 +124,7 @@ class ComposerView extends GetWidget { ), if (controller.ccRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.cc, listEmailAddress: controller.listCcEmailAddress, imagePaths: controller.imagePaths, @@ -148,6 +151,7 @@ class ComposerView extends GetWidget { ), if (controller.bccRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.bcc, listEmailAddress: controller.listBccEmailAddress, imagePaths: controller.imagePaths, @@ -174,6 +178,7 @@ class ComposerView extends GetWidget { ), if (controller.replyToRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.replyTo, listEmailAddress: controller.listReplyToEmailAddress, imagePaths: controller.imagePaths, @@ -365,6 +370,7 @@ class ComposerView extends GetWidget { onChangeIdentity: controller.onChangeIdentity, ), RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.to, listEmailAddress: controller.listToEmailAddress, imagePaths: controller.imagePaths, @@ -395,6 +401,7 @@ class ComposerView extends GetWidget { ), if (controller.ccRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.cc, listEmailAddress: controller.listCcEmailAddress, imagePaths: controller.imagePaths, @@ -421,6 +428,7 @@ class ComposerView extends GetWidget { ), if (controller.bccRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.bcc, listEmailAddress: controller.listBccEmailAddress, imagePaths: controller.imagePaths, @@ -447,6 +455,7 @@ class ComposerView extends GetWidget { ), if (controller.replyToRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.replyTo, listEmailAddress: controller.listReplyToEmailAddress, imagePaths: controller.imagePaths, @@ -680,6 +689,7 @@ class ComposerView extends GetWidget { onChangeIdentity: controller.onChangeIdentity, ), RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.to, listEmailAddress: controller.listToEmailAddress, imagePaths: controller.imagePaths, @@ -710,6 +720,7 @@ class ComposerView extends GetWidget { ), if (controller.ccRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.cc, listEmailAddress: controller.listCcEmailAddress, imagePaths: controller.imagePaths, @@ -736,6 +747,7 @@ class ComposerView extends GetWidget { ), if (controller.bccRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.bcc, listEmailAddress: controller.listBccEmailAddress, imagePaths: controller.imagePaths, @@ -762,6 +774,7 @@ class ComposerView extends GetWidget { ), if (controller.replyToRecipientState.value == PrefixRecipientState.enabled) RecipientComposerWidget( + composerId: composerId, prefix: PrefixEmailAddress.replyTo, listEmailAddress: controller.listReplyToEmailAddress, imagePaths: controller.imagePaths, diff --git a/lib/features/composer/presentation/extensions/remove_draggable_email_address_between_recipient_fields_extension.dart b/lib/features/composer/presentation/extensions/remove_draggable_email_address_between_recipient_fields_extension.dart new file mode 100644 index 000000000..f0edbae71 --- /dev/null +++ b/lib/features/composer/presentation/extensions/remove_draggable_email_address_between_recipient_fields_extension.dart @@ -0,0 +1,57 @@ + +import 'package:model/email/prefix_email_address.dart'; +import 'package:model/mailbox/expand_mode.dart'; +import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; +import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart'; + +extension RemoveDraggableEmailAddressBetweenRecipientFieldsExtension on ComposerController { + void removeDraggableEmailAddress(DraggableEmailAddress draggableEmailAddress) { + if (composerId == null || composerId == draggableEmailAddress.composerId) { + removeDraggableEmailAddressByComposerController( + controller: this, + draggableEmailAddress: draggableEmailAddress, + ); + } else if (draggableEmailAddress.composerId != null) { + final composerManager = mailboxDashBoardController.composerManager; + if (!composerManager.composers.containsKey(composerId)) return; + + final draggableComposerController = composerManager + .getComposerView(draggableEmailAddress.composerId!) + .controller; + + removeDraggableEmailAddressByComposerController( + controller: draggableComposerController, + draggableEmailAddress: draggableEmailAddress, + ); + } + } + + void removeDraggableEmailAddressByComposerController({ + required ComposerController controller, + required DraggableEmailAddress draggableEmailAddress, + }) { + switch(draggableEmailAddress.prefix) { + case PrefixEmailAddress.to: + controller.listToEmailAddress.remove(draggableEmailAddress.emailAddress); + controller.toAddressExpandMode.value = ExpandMode.EXPAND; + break; + case PrefixEmailAddress.cc: + controller.listCcEmailAddress.remove(draggableEmailAddress.emailAddress); + controller.ccAddressExpandMode.value = ExpandMode.EXPAND; + break; + case PrefixEmailAddress.bcc: + controller.listBccEmailAddress.remove(draggableEmailAddress.emailAddress); + controller.bccAddressExpandMode.value = ExpandMode.EXPAND; + break; + case PrefixEmailAddress.replyTo: + controller.listReplyToEmailAddress.remove(draggableEmailAddress.emailAddress); + controller.replyToAddressExpandMode.value = ExpandMode.EXPAND; + break; + default: + break; + } + controller.isInitialRecipient.value = true; + controller.isInitialRecipient.refresh(); + controller.updateStatusEmailSendButton(); + } +} \ No newline at end of file diff --git a/lib/features/composer/presentation/model/draggable_email_address.dart b/lib/features/composer/presentation/model/draggable_email_address.dart index e5347b365..53f2ffc67 100644 --- a/lib/features/composer/presentation/model/draggable_email_address.dart +++ b/lib/features/composer/presentation/model/draggable_email_address.dart @@ -5,12 +5,14 @@ import 'package:model/email/prefix_email_address.dart'; class DraggableEmailAddress with EquatableMixin { final EmailAddress emailAddress; final PrefixEmailAddress prefix; + final String? composerId; DraggableEmailAddress({ required this.emailAddress, required this.prefix, + this.composerId, }); @override - List get props => [emailAddress, prefix]; + List get props => [emailAddress, prefix, composerId]; } \ No newline at end of file diff --git a/lib/features/composer/presentation/widgets/recipient_composer_widget.dart b/lib/features/composer/presentation/widgets/recipient_composer_widget.dart index 7d0a7581a..17ac7d59b 100644 --- a/lib/features/composer/presentation/widgets/recipient_composer_widget.dart +++ b/lib/features/composer/presentation/widgets/recipient_composer_widget.dart @@ -68,6 +68,7 @@ class RecipientComposerWidget extends StatefulWidget { final OnEnableAllRecipientsInputAction? onEnableAllRecipientsInputAction; final bool isTestingForWeb; final int minInputLengthAutocomplete; + final String? composerId; const RecipientComposerWidget({ super.key, @@ -89,6 +90,7 @@ class RecipientComposerWidget extends StatefulWidget { this.nextFocusNode, this.padding, this.margin, + this.composerId, this.onUpdateListEmailAddressAction, this.onSuggestionEmailAddress, this.onAddEmailAddressTypeAction, @@ -205,6 +207,7 @@ class _RecipientComposerWidgetState extends State { index: index, imagePaths: widget.imagePaths, prefix: widget.prefix, + composerId: widget.composerId, currentEmailAddress: currentEmailAddress, currentListEmailAddress: _currentListEmailAddress, collapsedListEmailAddress: _collapsedListEmailAddress, @@ -296,6 +299,7 @@ class _RecipientComposerWidgetState extends State { index: index, imagePaths: widget.imagePaths, prefix: widget.prefix, + composerId: widget.composerId, currentEmailAddress: currentEmailAddress, currentListEmailAddress: _currentListEmailAddress, collapsedListEmailAddress: _collapsedListEmailAddress, @@ -567,7 +571,26 @@ class _RecipientComposerWidgetState extends State { StateSetter stateSetter ) { log('_RecipientComposerWidgetState::_handleAcceptDraggableEmailAddressAction: $draggableEmailAddress'); - if (draggableEmailAddress.prefix != widget.prefix) { + if (draggableEmailAddress.composerId == widget.composerId) { + if (draggableEmailAddress.prefix != widget.prefix) { + if (!_currentListEmailAddress.contains(draggableEmailAddress.emailAddress)) { + stateSetter(() { + _currentListEmailAddress.add(draggableEmailAddress.emailAddress); + _isDragging = false; + }); + _updateListEmailAddressAction(); + } else { + if (_isDragging) { + stateSetter(() => _isDragging = false); + } + } + widget.onRemoveDraggableEmailAddressAction?.call(draggableEmailAddress); + } else { + if (_isDragging) { + stateSetter(() => _isDragging = false); + } + } + } else { if (!_currentListEmailAddress.contains(draggableEmailAddress.emailAddress)) { stateSetter(() { _currentListEmailAddress.add(draggableEmailAddress.emailAddress); @@ -580,10 +603,6 @@ class _RecipientComposerWidgetState extends State { } } widget.onRemoveDraggableEmailAddressAction?.call(draggableEmailAddress); - } else { - if (_isDragging) { - stateSetter(() => _isDragging = false); - } } } diff --git a/lib/features/composer/presentation/widgets/recipient_tag_item_widget.dart b/lib/features/composer/presentation/widgets/recipient_tag_item_widget.dart index 24324afd8..172d8bcbb 100644 --- a/lib/features/composer/presentation/widgets/recipient_tag_item_widget.dart +++ b/lib/features/composer/presentation/widgets/recipient_tag_item_widget.dart @@ -31,6 +31,7 @@ class RecipientTagItemWidget extends StatelessWidget { final OnShowFullListEmailAddressAction? onShowFullAction; final OnDeleteTagAction? onDeleteTagAction; final bool isTestingForWeb; + final String? composerId; const RecipientTagItemWidget({ super.key, @@ -47,6 +48,7 @@ class RecipientTagItemWidget extends StatelessWidget { this.onShowFullAction, this.onDeleteTagAction, this.maxWidth, + this.composerId, }); @override @@ -89,7 +91,11 @@ class RecipientTagItemWidget extends StatelessWidget { if (PlatformInfo.isWeb || isTestingForWeb) { tagWidget = Draggable( - data: DraggableEmailAddress(emailAddress: currentEmailAddress, prefix: prefix), + data: DraggableEmailAddress( + emailAddress: currentEmailAddress, + prefix: prefix, + composerId: composerId, + ), feedback: DraggableRecipientTagWidget(emailAddress: currentEmailAddress), childWhenDragging: DraggableRecipientTagWidget(emailAddress: currentEmailAddress), child: MouseRegion(