Handle the behaviour of Reply/ReplyToList/ReplyAll button

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-02-18 11:50:27 +07:00
committed by Dat H. Pham
parent b8b70d26d4
commit bcad1e0cd9
9 changed files with 601 additions and 227 deletions
@@ -2,7 +2,6 @@
import 'dart:async';
import 'dart:math';
import 'package:collection/collection.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
@@ -230,7 +229,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
return RecipientSuggestionItemWidget(
imagePaths: widget.imagePaths,
suggestionState: suggestionEmailAddress.state,
emailAddress: MailAddress.validateAddress(suggestionEmailAddress.emailAddress.emailAddress).asEmailAddress(),
emailAddress: _subAddressingValidatedEmailAddress(suggestionEmailAddress.emailAddress),
suggestionValid: suggestionValid,
highlight: highlight,
onSelectedAction: (emailAddress) {
@@ -321,7 +320,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
return RecipientSuggestionItemWidget(
imagePaths: widget.imagePaths,
suggestionState: suggestionEmailAddress.state,
emailAddress: MailAddress.validateAddress(suggestionEmailAddress.emailAddress.emailAddress).asEmailAddress(),
emailAddress: _subAddressingValidatedEmailAddress(suggestionEmailAddress.emailAddress),
suggestionValid: suggestionValid,
highlight: highlight,
onSelectedAction: (emailAddress) {
@@ -466,13 +465,10 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
}
bool _isDuplicatedRecipient(String inputEmail) {
if (inputEmail.isEmpty) {
return false;
}
if (inputEmail.trim().isEmpty) return false;
return _currentListEmailAddress
.map((emailAddress) => emailAddress.email)
.whereNotNull()
.contains(inputEmail);
.any((emailAddress) => emailAddress.email?.trim() == inputEmail.trim());
}
SuggestionEmailAddress _toSuggestionEmailAddress(EmailAddress item, List<EmailAddress> addedEmailAddresses) {
@@ -524,13 +520,10 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
void _handleSelectOptionAction(
SuggestionEmailAddress suggestionEmailAddress,
StateSetter stateSetter
) {
MailAddress mailAddress = MailAddress.validateAddress(suggestionEmailAddress.emailAddress.emailAddress);
if (!_isDuplicatedRecipient(mailAddress.asEncodedString())) {
stateSetter(() => _currentListEmailAddress.add(mailAddress.asEmailAddress()));
_updateListEmailAddressAction();
}
}
) => _onEmailAddressReceived(
suggestionEmailAddress.emailAddress.emailAddress,
stateSetter,
);
void _handleSubmitTagAction(
String value,
@@ -539,11 +532,9 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
void _createMailTag(String value, StateSetter stateSetter) {
final listString = StringConvert.extractStrings(value.trim()).toSet();
MailAddress mailAddress = MailAddress.validateAddress(value.trim());
if (listString.isEmpty && !_isDuplicatedRecipient(mailAddress.asEncodedString())) {
stateSetter(() => _currentListEmailAddress.add(mailAddress.asEmailAddress()));
_updateListEmailAddressAction();
if (listString.isEmpty && !_isDuplicatedRecipient(value)) {
_onEmailAddressReceived(value, stateSetter);
} else if (listString.isNotEmpty) {
final listStringNotExist = listString
.where((text) => !_isDuplicatedRecipient(text))
@@ -564,11 +555,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
String value,
StateSetter stateSetter
) {
MailAddress mailAddress = MailAddress.validateAddress(value.trim());
if (!_isDuplicatedRecipient(mailAddress.asEncodedString())) {
stateSetter(() => _currentListEmailAddress.add(mailAddress.asEmailAddress()));
_updateListEmailAddressAction();
}
_onEmailAddressReceived(value, stateSetter);
_gapBetweenTagChangedAndFindSuggestion = Timer(
const Duration(seconds: 1),
_handleGapBetweenTagChangedAndFindSuggestion
@@ -608,4 +595,30 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
return null;
}
}
void _onEmailAddressReceived(String input, StateSetter stateSetter) {
final emailAddressRecord = _generateEmailAddressFromString(input);
if (!_isDuplicatedRecipient(emailAddressRecord.$1)) {
stateSetter(() => _currentListEmailAddress.add(emailAddressRecord.$2));
_updateListEmailAddressAction();
}
}
EmailAddress _subAddressingValidatedEmailAddress(EmailAddress emailAddress) {
try {
final mailAddress = MailAddress.validateAddress(emailAddress.emailAddress);
return mailAddress.asEmailAddress();
} catch (e) {
return emailAddress;
}
}
(String email, EmailAddress emailAddress) _generateEmailAddressFromString(String input) {
try {
final mailAddress = MailAddress.validateAddress(input);
return (mailAddress.asEncodedString(), mailAddress.asEmailAddress());
} catch (e) {
return (input, EmailAddress(null, input));
}
}
}