TF-3864 Support pasting multiple address with multiple format mixed

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-08-04 02:24:32 +07:00
committed by Dat H. Pham
parent f1ae5b58b2
commit aeeb47a6f8
11 changed files with 616 additions and 100 deletions
@@ -18,7 +18,8 @@ import 'package:model/email/prefix_email_address.dart';
import 'package:model/extensions/email_address_extension.dart';
import 'package:model/mailbox/expand_mode.dart';
import 'package:super_tag_editor/tag_editor.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/named_address_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_address_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_named_address_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_email_address_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/mail_address_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
@@ -558,34 +559,33 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
) => _createMailTag(value, stateSetter);
void _createMailTag(String value, StateSetter stateSetter) {
final namedAddress = StringConvert.parseNamedAddress(value.trim());
if (namedAddress != null) {
if (!_isDuplicatedRecipient(namedAddress.address)) {
final valueTrimmed = value.trim();
final namedAddresses = StringConvert.extractNamedAddresses(valueTrimmed);
if (namedAddresses.isNotEmpty) {
final emailAddressListFromNamed = namedAddresses
.toFilteredEmailAddressList(_currentListEmailAddress);
log('$runtimeType::_createMailTag: Create email tag from named address list with length ${emailAddressListFromNamed.length}');
if (emailAddressListFromNamed.isNotEmpty) {
stateSetter(
() => _currentListEmailAddress.add(namedAddress.toEmailAddress()),
() => _currentListEmailAddress.addAll(emailAddressListFromNamed),
);
_updateListEmailAddressAction();
}
return;
}
final listString = StringConvert.extractEmailAddress(value.trim()).toSet();
List<String> addresses = StringConvert.extractEmailAddress(valueTrimmed);
final emailAddressListFromAddress =
addresses.toFilteredEmailAddressList(_currentListEmailAddress);
log('$runtimeType::_createMailTag: Create email tag from address list with length ${emailAddressListFromAddress.length}');
if (listString.isEmpty && !_isDuplicatedRecipient(value)) {
if (emailAddressListFromAddress.isNotEmpty) {
stateSetter(
() => _currentListEmailAddress.addAll(emailAddressListFromAddress),
);
_updateListEmailAddressAction();
} else if (!_isDuplicatedRecipient(valueTrimmed)) {
_onEmailAddressReceived(value, stateSetter);
} else if (listString.isNotEmpty) {
final listStringNotExist = listString
.where((text) => !_isDuplicatedRecipient(text))
.toList();
if (listStringNotExist.isNotEmpty) {
final listAddress = listStringNotExist
.map((text) => EmailAddress(null, text))
.toList();
stateSetter(() => _currentListEmailAddress.addAll(listAddress));
_updateListEmailAddressAction();
}
}
}