Auto create email address tag for input field

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-07-11 11:14:38 +07:00
committed by Dat H. Pham
parent 3457601d14
commit bfea3406cf
4 changed files with 74 additions and 10 deletions
@@ -21,6 +21,7 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/get_all_autocomp
import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart';
import 'package:tmail_ui_user/features/email_recovery/presentation/controller/input_field_focus_manager.dart';
import 'package:tmail_ui_user/features/email_recovery/presentation/extension/handle_auto_create_email_address_tag_extension.dart';
import 'package:tmail_ui_user/features/email_recovery/presentation/model/email_recovery_arguments.dart';
import 'package:tmail_ui_user/features/email_recovery/presentation/model/session_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
@@ -147,6 +148,9 @@ class EmailRecoveryController extends BaseController with DateRangePickerMixin {
recipientsExpandMode.value = ExpandMode.EXPAND;
senderExpandMode.value = ExpandMode.COLLAPSE;
_closeSuggestionBox();
} else {
recipientsExpandMode.value = ExpandMode.COLLAPSE;
autoCreateTagForFilterField(FilterField.recipients);
}
}
@@ -155,6 +159,9 @@ class EmailRecoveryController extends BaseController with DateRangePickerMixin {
senderExpandMode.value = ExpandMode.EXPAND;
recipientsExpandMode.value = ExpandMode.COLLAPSE;
_closeSuggestionBox();
} else {
senderExpandMode.value = ExpandMode.COLLAPSE;
autoCreateTagForFilterField(FilterField.sender);
}
}
@@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/list_email_address_extension.dart';
import 'package:super_tag_editor/tag_editor.dart';
import 'package:tmail_ui_user/features/base/model/filter_filter.dart';
import 'package:tmail_ui_user/features/email_recovery/presentation/email_recovery_controller.dart';
extension AutoCreateEmailAddressTagExtension on EmailRecoveryController {
void autoCreateTagForFilterField(FilterField field) {
final currentText = _getCurrentTextInInputField(field);
if (currentText.isEmpty) return;
switch (field) {
case FilterField.recipients:
if (!listRecipients.isDuplicatedEmail(currentText)) {
_synchronizeListEmailAddressInInputField(
inputEmail: currentText,
listEmailAddress: listRecipients,
tagEditorFieldKey: recipientsFieldKey,
);
}
break;
case FilterField.sender:
if (!listSenders.isDuplicatedEmail(currentText)) {
_synchronizeListEmailAddressInInputField(
inputEmail: currentText,
listEmailAddress: listSenders,
tagEditorFieldKey: senderFieldKey,
);
}
break;
default:
}
}
void _synchronizeListEmailAddressInInputField({
required String inputEmail,
required GlobalKey<TagsEditorState> tagEditorFieldKey,
required List<EmailAddress> listEmailAddress,
}) {
final emailAddress = EmailAddress(null, inputEmail);
listEmailAddress.add(emailAddress);
tagEditorFieldKey.currentState?.resetTextField();
Future.delayed(
const Duration(milliseconds: 300),
tagEditorFieldKey.currentState?.closeSuggestionBox,
);
}
String _getCurrentTextInInputField(FilterField field) {
switch (field) {
case FilterField.recipients:
return recipientsFieldInputController.text;
case FilterField.sender:
return senderFieldInputController.text;
default:
return '';
}
}
}
@@ -1,4 +1,3 @@
import 'package:collection/collection.dart';
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter/material.dart';
@@ -398,20 +397,13 @@ class AdvancedFilterController extends BaseController {
}
}
bool _isDuplicatedEmailAddress(String inputEmail, List<EmailAddress> listEmailAddress) {
return listEmailAddress
.map((emailAddress) => emailAddress.email)
.whereNotNull()
.contains(inputEmail);
}
void _autoCreateTagFromField() {
final inputEmail = fromEmailAddressController.text;
if (inputEmail.isEmpty) {
return;
}
if (!_isDuplicatedEmailAddress(inputEmail, listFromEmailAddress)) {
if (!listFromEmailAddress.isDuplicatedEmail(inputEmail)) {
final emailAddress = EmailAddress(null, inputEmail);
listFromEmailAddress.add(emailAddress);
_updateMemorySearchFilter(fromOption: Some(listFromEmailAddress.asSetAddress()));
@@ -428,7 +420,7 @@ class AdvancedFilterController extends BaseController {
return;
}
if (!_isDuplicatedEmailAddress(inputEmail, listToEmailAddress)) {
if (!listToEmailAddress.isDuplicatedEmail(inputEmail)) {
listToEmailAddress.add(EmailAddress(null, inputEmail));
_updateMemorySearchFilter(toOption: Some(listToEmailAddress.asSetAddress()));
keyToEmailTagEditor.currentState?.resetTextField();