diff --git a/lib/features/base/widget/default_field/default_autocomplete_input_field_widget.dart b/lib/features/base/widget/default_field/default_autocomplete_input_field_widget.dart index ce094b352..25b31c10f 100644 --- a/lib/features/base/widget/default_field/default_autocomplete_input_field_widget.dart +++ b/lib/features/base/widget/default_field/default_autocomplete_input_field_widget.dart @@ -1,5 +1,5 @@ import 'dart:async'; -import 'dart:math'; +import 'dart:math' as math; import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; @@ -11,6 +11,7 @@ import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/extensions/email_address_extension.dart'; +import 'package:model/extensions/list_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/base/widget/default_field/default_autocomplete_tag_item_widget.dart'; @@ -193,7 +194,9 @@ class _DefaultAutocompleteInputFieldWidgetState suggestionValid: suggestionValid, highlight: highlight, onSelectedAction: (emailAddress) { - _setStateSafety(() => _currentListEmailAddress.add(emailAddress)); + if (!_isDuplicated(emailAddress.emailAddress)) { + _setStateSafety(() => _currentListEmailAddress.add(emailAddress)); + } _updateListEmailAddressAction(); tagEditorState.resetTextField(); tagEditorState.closeSuggestionBox(); @@ -268,19 +271,12 @@ class _DefaultAutocompleteInputFieldWidgetState processedQuery, limit: limit, ); - final listSuggestionEmailAddress = - listEmailAddress.map((emailAddress) => _toSuggestionEmailAddress( - emailAddress, - _currentListEmailAddress, - )); + final listSuggestionEmailAddress = listEmailAddress + .map(_toSuggestionEmailAddress); + displayedSuggestion.addAll(listSuggestionEmailAddress); } - displayedSuggestion.addAll(_matchedSuggestionEmailAddress( - processedQuery, - _currentListEmailAddress, - )); - final currentTextOnTextField = widget.controller?.text ?? ''; if (currentTextOnTextField.isEmpty) { return []; @@ -293,17 +289,11 @@ class _DefaultAutocompleteInputFieldWidgetState if (inputEmail.isEmpty) { return false; } - return _currentListEmailAddress - .map((emailAddress) => emailAddress.email) - .nonNulls - .contains(inputEmail); + return _currentListEmailAddress.isDuplicatedEmail(inputEmail.trim()); } - SuggestionEmailAddress _toSuggestionEmailAddress( - EmailAddress item, - List addedEmailAddresses, - ) { - if (addedEmailAddresses.contains(item)) { + SuggestionEmailAddress _toSuggestionEmailAddress(EmailAddress item) { + if (_currentListEmailAddress.isDuplicatedEmail(item.emailAddress)) { return SuggestionEmailAddress( item, state: SuggestionEmailState.duplicated, @@ -313,18 +303,6 @@ class _DefaultAutocompleteInputFieldWidgetState } } - Iterable _matchedSuggestionEmailAddress( - String query, - List addedEmailAddress, - ) { - return addedEmailAddress - .where((addedMail) => addedMail.emailAddress.contains(query)) - .map((emailAddress) => SuggestionEmailAddress( - emailAddress, - state: SuggestionEmailState.duplicated, - )); - } - void _updateListEmailAddressAction() { widget.onUpdateListEmailAddressAction?.call( widget.field, @@ -396,7 +374,7 @@ class _DefaultAutocompleteInputFieldWidgetState double? _getSuggestionBoxWidth(double maxWidth) { if (maxWidth < ResponsiveUtils.minTabletWidth) { - final newWidth = min(maxWidth, 300.0); + final newWidth = math.min(maxWidth, 300.0); return newWidth; } else { return null; @@ -405,8 +383,7 @@ class _DefaultAutocompleteInputFieldWidgetState void _onAcceptWithDetails(DraggableEmailAddress draggableEmailAddress) { if (draggableEmailAddress.filterField != widget.field) { - if (!_currentListEmailAddress - .contains(draggableEmailAddress.emailAddress)) { + if (!_isDuplicated(draggableEmailAddress.emailAddress.emailAddress)) { _setStateSafety(() { _currentListEmailAddress.add(draggableEmailAddress.emailAddress); _isDragging = false; diff --git a/lib/features/composer/presentation/widgets/recipient_composer_widget.dart b/lib/features/composer/presentation/widgets/recipient_composer_widget.dart index 36fbe86fb..c81c017b8 100644 --- a/lib/features/composer/presentation/widgets/recipient_composer_widget.dart +++ b/lib/features/composer/presentation/widgets/recipient_composer_widget.dart @@ -16,6 +16,7 @@ import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/email/prefix_email_address.dart'; import 'package:model/extensions/email_address_extension.dart'; +import 'package:model/extensions/list_email_address_extension.dart'; import 'package:super_tag_editor/tag_editor.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'; @@ -270,7 +271,9 @@ class _RecipientComposerWidgetState extends State { suggestionValid: suggestionValid, highlight: highlight, onSelectedAction: (emailAddress) { - stateSetter(() => _currentListEmailAddress.add(emailAddress)); + if (!_isDuplicatedRecipient(emailAddress.emailAddress)) { + stateSetter(() => _currentListEmailAddress.add(emailAddress)); + } _updateListEmailAddressAction(); tagEditorState.resetTextField(); tagEditorState.closeSuggestionBox(); @@ -434,14 +437,11 @@ class _RecipientComposerWidgetState extends State { limit: limit, ); final listSuggestionEmailAddress = listEmailAddress - .map((emailAddress) => _toSuggestionEmailAddress( - emailAddress, - _currentListEmailAddress)); + .map(_toSuggestionEmailAddress); + tmailSuggestion.addAll(listSuggestionEmailAddress); } - tmailSuggestion.addAll(_matchedSuggestionEmailAddress(processedQuery, _currentListEmailAddress)); - final currentTextOnTextField = widget.controller?.text ?? ''; if (currentTextOnTextField.isEmpty) { return []; @@ -453,27 +453,17 @@ class _RecipientComposerWidgetState extends State { bool _isDuplicatedRecipient(String inputEmail) { if (inputEmail.trim().isEmpty) return false; - return _currentListEmailAddress - .any((emailAddress) => emailAddress.email?.trim() == inputEmail.trim()); + return _currentListEmailAddress.isDuplicatedEmail(inputEmail.trim()); } - SuggestionEmailAddress _toSuggestionEmailAddress(EmailAddress item, List addedEmailAddresses) { - if (addedEmailAddresses.contains(item)) { + SuggestionEmailAddress _toSuggestionEmailAddress(EmailAddress item) { + if (_currentListEmailAddress.isDuplicatedEmail(item.emailAddress)) { return SuggestionEmailAddress(item, state: SuggestionEmailState.duplicated); } else { return SuggestionEmailAddress(item); } } - Iterable _matchedSuggestionEmailAddress(String query, List addedEmailAddress) { - return addedEmailAddress - .where((addedMail) => addedMail.emailAddress.contains(query)) - .map((emailAddress) => SuggestionEmailAddress( - emailAddress, - state: SuggestionEmailState.duplicated - )); - } - void _handleGapBetweenTagChangedAndFindSuggestion() { log('_RecipientComposerWidgetState::_handleGapBetweenTagChangedAndFindSuggestion:Timeout'); } @@ -571,7 +561,7 @@ class _RecipientComposerWidgetState extends State { log('_RecipientComposerWidgetState::_handleAcceptDraggableEmailAddressAction: $draggableEmailAddress'); if (draggableEmailAddress.composerId == widget.composerId) { if (draggableEmailAddress.filterField != widget.prefix.filterField) { - if (!_currentListEmailAddress.contains(draggableEmailAddress.emailAddress)) { + if (!_isDuplicatedRecipient(draggableEmailAddress.emailAddress.emailAddress)) { stateSetter(() { _currentListEmailAddress.add(draggableEmailAddress.emailAddress); _isDragging = false; @@ -589,7 +579,7 @@ class _RecipientComposerWidgetState extends State { } } } else { - if (!_currentListEmailAddress.contains(draggableEmailAddress.emailAddress)) { + if (!_isDuplicatedRecipient(draggableEmailAddress.emailAddress.emailAddress)) { stateSetter(() { _currentListEmailAddress.add(draggableEmailAddress.emailAddress); _isDragging = false;