TF-3294 Fix BLUE-BAR mail to attendees duplicated recipients
This commit is contained in:
@@ -92,6 +92,8 @@ import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action
|
|||||||
import 'package:tmail_ui_user/features/email/presentation/bindings/calendar_event_interactor_bindings.dart';
|
import 'package:tmail_ui_user/features/email/presentation/bindings/calendar_event_interactor_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart';
|
import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/extensions/attachment_extension.dart';
|
import 'package:tmail_ui_user/features/email/presentation/extensions/attachment_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_attendee_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_organizer_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/blob_calendar_event.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/blob_calendar_event.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
|
||||||
@@ -2184,22 +2186,20 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void handleMailToAttendees(CalendarOrganizer? organizer, List<CalendarAttendee>? attendees) {
|
void handleMailToAttendees(CalendarOrganizer? organizer, List<CalendarAttendee>? attendees) {
|
||||||
final listEmailAddressAttendees = attendees
|
List<EmailAddress> listEmailAddressAttendees = [];
|
||||||
?.map((attendee) => EmailAddress(attendee.name?.name, attendee.mailto?.mailAddress.value))
|
|
||||||
.toList() ?? [];
|
|
||||||
|
|
||||||
if (organizer != null) {
|
if (organizer != null) {
|
||||||
listEmailAddressAttendees.add(EmailAddress(organizer.name, organizer.mailto?.value));
|
listEmailAddressAttendees.add(organizer.toEmailAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
final listEmailAddressMailTo = listEmailAddressAttendees
|
final listEmailAddress = attendees
|
||||||
.where((emailAddress) {
|
?.map((attendee) => attendee.toEmailAddress())
|
||||||
return emailAddress.emailAddress.isNotEmpty &&
|
.toList() ?? [];
|
||||||
emailAddress.emailAddress != session?.username.value;
|
|
||||||
})
|
|
||||||
.toSet()
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
|
listEmailAddressAttendees.addAll(listEmailAddress);
|
||||||
|
|
||||||
|
final username = mailboxDashBoardController.sessionCurrent?.username.value ?? '';
|
||||||
|
final listEmailAddressMailTo = listEmailAddressAttendees.removeInvalidEmails(username);
|
||||||
log('SingleEmailController::handleMailToAttendees: listEmailAddressMailTo = $listEmailAddressMailTo');
|
log('SingleEmailController::handleMailToAttendees: listEmailAddressMailTo = $listEmailAddressMailTo');
|
||||||
mailboxDashBoardController.goToComposer(
|
mailboxDashBoardController.goToComposer(
|
||||||
ComposerArguments.fromMailtoUri(listEmailAddress: listEmailAddressMailTo)
|
ComposerArguments.fromMailtoUri(listEmailAddress: listEmailAddressMailTo)
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||||
|
|
||||||
|
extension CalendarAttendeeExtension on CalendarAttendee {
|
||||||
|
EmailAddress toEmailAddress() {
|
||||||
|
return EmailAddress(
|
||||||
|
name?.name,
|
||||||
|
mailto?.mailAddress.value,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||||
|
|
||||||
|
extension CalendarOrganizerExtension on CalendarOrganizer {
|
||||||
|
EmailAddress toEmailAddress() {
|
||||||
|
return EmailAddress(
|
||||||
|
name,
|
||||||
|
mailto?.value,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -69,6 +69,15 @@ extension SetEmailAddressExtension on Set<EmailAddress>? {
|
|||||||
extension ListEmailAddressExtension on List<EmailAddress> {
|
extension ListEmailAddressExtension on List<EmailAddress> {
|
||||||
Set<String> asSetAddress() => map((emailAddress) => emailAddress.emailAddress).toSet();
|
Set<String> asSetAddress() => map((emailAddress) => emailAddress.emailAddress).toSet();
|
||||||
|
|
||||||
|
List<EmailAddress> removeInvalidEmails(String username) {
|
||||||
|
final Set<String> seenEmails = {};
|
||||||
|
return where((email) {
|
||||||
|
if (email.emailAddress.isEmpty) return false;
|
||||||
|
if (email.emailAddress == username) return false;
|
||||||
|
return seenEmails.add(email.emailAddress);
|
||||||
|
}).toList();
|
||||||
|
}
|
||||||
|
|
||||||
List<EmailAddress> withoutMe(String? userName) {
|
List<EmailAddress> withoutMe(String? userName) {
|
||||||
if (userName == null) return this;
|
if (userName == null) return this;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.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/extensions/list_email_address_extension.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
@@ -43,4 +44,69 @@ void main() {
|
|||||||
expect(result, 'John Doe <john@example.com>, Jane Smith <jane@example.com>');
|
expect(result, 'John Doe <john@example.com>, Jane Smith <jane@example.com>');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
group('ListEmailAddressExtension::removeInvalidEmails::test', () {
|
||||||
|
test('SHOULD remove email addresses that are empty', () {
|
||||||
|
final emails = [
|
||||||
|
EmailAddress('Alice', 'alice@example.com'),
|
||||||
|
EmailAddress('Bob', ''),
|
||||||
|
EmailAddress('Charlie', 'charlie@example.com'),
|
||||||
|
];
|
||||||
|
|
||||||
|
final validEmails = emails.removeInvalidEmails('bob@example.com');
|
||||||
|
|
||||||
|
expect(validEmails.length, 2);
|
||||||
|
expect(validEmails[0].emailAddress, 'alice@example.com');
|
||||||
|
expect(validEmails[1].emailAddress, 'charlie@example.com');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('SHOULD remove email addresses that match the provided username', () {
|
||||||
|
final emails = [
|
||||||
|
EmailAddress('Alice', 'alice@example.com'),
|
||||||
|
EmailAddress('Bob', 'bob@example.com'),
|
||||||
|
EmailAddress('Charlie', 'charlie@example.com'),
|
||||||
|
];
|
||||||
|
|
||||||
|
final validEmails = emails.removeInvalidEmails('bob@example.com');
|
||||||
|
|
||||||
|
expect(validEmails.length, 2);
|
||||||
|
expect(validEmails[0].emailAddress, 'alice@example.com');
|
||||||
|
expect(validEmails[1].emailAddress, 'charlie@example.com');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('SHOULD remove duplicate email addresses, keeping only the first occurrence', () {
|
||||||
|
final emails = [
|
||||||
|
EmailAddress('Alice', 'alice@example.com'),
|
||||||
|
EmailAddress('Bob', 'bob@example.com'),
|
||||||
|
EmailAddress('Charlie', 'alice@example.com'),
|
||||||
|
EmailAddress('David', 'david@example.com'),
|
||||||
|
];
|
||||||
|
|
||||||
|
final validEmails = emails.removeInvalidEmails('bob@example.com');
|
||||||
|
|
||||||
|
expect(validEmails.length, 2);
|
||||||
|
expect(validEmails[0].emailAddress, 'alice@example.com');
|
||||||
|
expect(validEmails[1].emailAddress, 'david@example.com');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('SHOULD return an empty list if all email addresses are invalid', () {
|
||||||
|
final emails = [
|
||||||
|
EmailAddress('Alice', ''),
|
||||||
|
EmailAddress('Bob', 'bob@example.com'),
|
||||||
|
EmailAddress('Charlie', 'bob@example.com'),
|
||||||
|
];
|
||||||
|
|
||||||
|
final validEmails = emails.removeInvalidEmails('bob@example.com');
|
||||||
|
|
||||||
|
expect(validEmails.isEmpty, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('SHOULD return an empty list for an empty input list', () {
|
||||||
|
final emails = <EmailAddress>[];
|
||||||
|
|
||||||
|
final validEmails = emails.removeInvalidEmails('bob@example.com');
|
||||||
|
|
||||||
|
expect(validEmails.isEmpty, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user