TF-1626 Remove id of email when call Email/set method

(cherry picked from commit ce1d27d893fd406aa812d4e4ea9debe1ec265ddb)
This commit is contained in:
dab246
2023-03-21 18:27:48 +07:00
committed by Dat Vu
parent 61a9414fe1
commit 0d77789c5f
19 changed files with 120 additions and 106 deletions
@@ -638,11 +638,9 @@ class ComposerController extends BaseController {
mapKeywords[KeyWordIdentifier.emailSeen] = true; mapKeywords[KeyWordIdentifier.emailSeen] = true;
} }
final generateEmailId = EmailId(Id(_uuid.v1()));
final generatePartId = PartId(_uuid.v1()); final generatePartId = PartId(_uuid.v1());
return Email( return Email(
generateEmailId,
mailboxIds: mailboxIds.isNotEmpty ? mailboxIds : null, mailboxIds: mailboxIds.isNotEmpty ? mailboxIds : null,
from: listFromEmailAddress, from: listFromEmailAddress,
to: listToEmailAddress.toSet(), to: listToEmailAddress.toSet(),
@@ -988,12 +986,16 @@ class ComposerController extends BaseController {
draftMailboxId: draftMailboxId); draftMailboxId: draftMailboxId);
final oldEmail = arguments.presentationEmail; final oldEmail = arguments.presentationEmail;
if (arguments.emailActionType == EmailActionType.edit && oldEmail != null) { if (arguments.emailActionType == EmailActionType.edit && oldEmail != null && oldEmail.id != null) {
mailboxDashBoardController.consumeState( mailboxDashBoardController.consumeState(
_updateEmailDraftsInteractor.execute(accountId, newEmail, oldEmail.id)); _updateEmailDraftsInteractor.execute(
accountId,
newEmail,
oldEmail.id!
)
);
} else { } else {
mailboxDashBoardController.consumeState( mailboxDashBoardController.consumeState(_saveEmailAsDraftsInteractor.execute(accountId, newEmail));
_saveEmailAsDraftsInteractor.execute(accountId, newEmail));
} }
uploadController.clearInlineFileUploaded(); uploadController.clearInlineFileUploaded();
+18 -16
View File
@@ -41,6 +41,7 @@ import 'package:model/email/mark_star_action.dart';
import 'package:model/email/read_actions.dart'; import 'package:model/email/read_actions.dart';
import 'package:model/extensions/email_extension.dart'; import 'package:model/extensions/email_extension.dart';
import 'package:model/extensions/keyword_identifier_extension.dart'; import 'package:model/extensions/keyword_identifier_extension.dart';
import 'package:model/extensions/list_email_extension.dart';
import 'package:model/extensions/list_email_id_extension.dart'; import 'package:model/extensions/list_email_id_extension.dart';
import 'package:model/extensions/mailbox_id_extension.dart'; import 'package:model/extensions/mailbox_id_extension.dart';
import 'package:model/extensions/session_extension.dart'; import 'package:model/extensions/session_extension.dart';
@@ -54,14 +55,16 @@ import 'package:tmail_ui_user/features/email/domain/state/download_attachment_fo
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart';
import 'package:uuid/uuid.dart';
class EmailAPI with HandleSetErrorMixin { class EmailAPI with HandleSetErrorMixin {
final HttpClient _httpClient; final HttpClient _httpClient;
final DownloadManager _downloadManager; final DownloadManager _downloadManager;
final DioClient _dioClient; final DioClient _dioClient;
final Uuid _uuid;
EmailAPI(this._httpClient, this._downloadManager, this._dioClient); EmailAPI(this._httpClient, this._downloadManager, this._dioClient, this._uuid);
Future<Email> getEmailContent(AccountId accountId, EmailId emailId) async { Future<Email> getEmailContent(AccountId accountId, EmailId emailId) async {
final processingInvocation = ProcessingInvocation(); final processingInvocation = ProcessingInvocation();
@@ -129,8 +132,9 @@ class EmailAPI with HandleSetErrorMixin {
emailNeedsToBeCreated = emailRequest.email; emailNeedsToBeCreated = emailRequest.email;
} }
final idCreateMethod = Id(_uuid.v1());
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addCreate(emailNeedsToBeCreated.id.id, emailNeedsToBeCreated); ..addCreate(idCreateMethod, emailNeedsToBeCreated);
if (emailRequest.emailIdDestroyed != null) { if (emailRequest.emailIdDestroyed != null) {
setEmailMethod.addDestroy({emailRequest.emailIdDestroyed!.id}); setEmailMethod.addDestroy({emailRequest.emailIdDestroyed!.id});
@@ -142,7 +146,7 @@ class EmailAPI with HandleSetErrorMixin {
emailRequest.submissionCreateId, emailRequest.submissionCreateId,
EmailSubmission( EmailSubmission(
identityId: emailRequest.identity?.id?.id, identityId: emailRequest.identity?.id?.id,
emailId: EmailId(ReferenceId(ReferencePrefix.defaultPrefix, emailNeedsToBeCreated.id.id)), emailId: EmailId(ReferenceId(ReferencePrefix.defaultPrefix, idCreateMethod)),
envelope: Envelope( envelope: Envelope(
Address(emailNeedsToBeCreated.from?.first.email ?? ''), Address(emailNeedsToBeCreated.from?.first.email ?? ''),
emailNeedsToBeCreated.getRecipientEmailAddressList().map((emailAddress) => Address(emailAddress)).toSet() emailNeedsToBeCreated.getRecipientEmailAddressList().map((emailAddress) => Address(emailAddress)).toSet()
@@ -173,7 +177,7 @@ class EmailAPI with HandleSetErrorMixin {
SetEmailSubmissionResponse.deserialize, SetEmailSubmissionResponse.deserialize,
methodName: setEmailInvocation.methodName); methodName: setEmailInvocation.methodName);
final emailCreated = setEmailResponse?.created?[emailNeedsToBeCreated.id.id]; final emailCreated = setEmailResponse?.created?[idCreateMethod];
final listEntriesErrors = _handleSetEmailResponse( final listEntriesErrors = _handleSetEmailResponse(
response: setEmailResponse, response: setEmailResponse,
submissionResponse: setEmailSubmissionResponse submissionResponse: setEmailSubmissionResponse
@@ -218,13 +222,11 @@ class EmailAPI with HandleSetErrorMixin {
} }
Future<List<Email>> markAsRead(AccountId accountId, List<Email> emails, ReadActions readActions) async { Future<List<Email>> markAsRead(AccountId accountId, List<Email> emails, ReadActions readActions) async {
final emailIds = emails.map((email) => email.id).toList();
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addUpdates(emailIds.generateMapUpdateObjectMarkAsRead(readActions)); ..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsRead(readActions));
final getEmailMethod = GetEmailMethod(accountId) final getEmailMethod = GetEmailMethod(accountId)
..addIds(emailIds.toIds().toSet()) ..addIds(emails.listEmailIds.toIds().toSet())
..addProperties(Properties({'keywords'})); ..addProperties(Properties({'keywords'}));
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
@@ -406,13 +408,11 @@ class EmailAPI with HandleSetErrorMixin {
Future<List<Email>> markAsStar(AccountId accountId, List<Email> emails, MarkStarAction markStarAction) async { Future<List<Email>> markAsStar(AccountId accountId, List<Email> emails, MarkStarAction markStarAction) async {
final emailIds = emails.map((email) => email.id).toList();
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addUpdates(emailIds.generateMapUpdateObjectMarkAsStar(markStarAction)); ..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsStar(markStarAction));
final getEmailMethod = GetEmailMethod(accountId) final getEmailMethod = GetEmailMethod(accountId)
..addIds(emailIds.toIds().toSet()) ..addIds(emails.listEmailIds.toIds().toSet())
..addProperties(Properties({'keywords'})); ..addProperties(Properties({'keywords'}));
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
@@ -438,8 +438,9 @@ class EmailAPI with HandleSetErrorMixin {
} }
Future<Email> saveEmailAsDrafts(AccountId accountId, Email email) async { Future<Email> saveEmailAsDrafts(AccountId accountId, Email email) async {
final idCreateMethod = Id(_uuid.v1());
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addCreate(email.id.id, email); ..addCreate(idCreateMethod, email);
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
@@ -455,7 +456,7 @@ class EmailAPI with HandleSetErrorMixin {
SetEmailResponse.deserialize SetEmailResponse.deserialize
); );
final emailCreated = setEmailResponse?.created?[email.id.id]; final emailCreated = setEmailResponse?.created?[idCreateMethod];
final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse); final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse);
final mapErrors = Map.fromEntries(listEntriesErrors); final mapErrors = Map.fromEntries(listEntriesErrors);
@@ -491,8 +492,9 @@ class EmailAPI with HandleSetErrorMixin {
} }
Future<Email> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) async { Future<Email> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId) async {
final idCreateMethod = Id(_uuid.v1());
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addCreate(newEmail.id.id, newEmail) ..addCreate(idCreateMethod, newEmail)
..addDestroy({oldEmailId.id}); ..addDestroy({oldEmailId.id});
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
@@ -509,7 +511,7 @@ class EmailAPI with HandleSetErrorMixin {
SetEmailResponse.deserialize SetEmailResponse.deserialize
); );
final emailUpdated = setEmailResponse?.created?[newEmail.id.id]; final emailUpdated = setEmailResponse?.created?[idCreateMethod];
final isEmailDestroyedSuccess = setEmailResponse?.destroyed?.contains(oldEmailId.id) ?? false; final isEmailDestroyedSuccess = setEmailResponse?.destroyed?.contains(oldEmailId.id) ?? false;
final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse); final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse);
final mapErrors = Map.fromEntries(listEntriesErrors); final mapErrors = Map.fromEntries(listEntriesErrors);
@@ -170,9 +170,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
_resetToOriginalValue(); _resetToOriginalValue();
if (isListEmailContainSelectedEmail(selectedEmail)) { if (isListEmailContainSelectedEmail(selectedEmail)) {
_createMultipleEmailViewAsPageView(selectedEmail.id); _createMultipleEmailViewAsPageView(selectedEmail.id!);
} else { } else {
_createSingleEmailView(selectedEmail.id); _createSingleEmailView(selectedEmail.id!);
} }
if (!selectedEmail.hasRead) { if (!selectedEmail.hasRead) {
@@ -663,21 +663,21 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
) { ) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
_moveToTrashAction(context, accountId, MoveToMailboxRequest( _moveToTrashAction(context, accountId, MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id]}, {currentMailbox.id: [emailSelected.id!]},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
EmailActionType.moveToTrash)); EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) { } else if (destinationMailbox.isSpam) {
_moveToSpamAction(context, accountId, MoveToMailboxRequest( _moveToSpamAction(context, accountId, MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id]}, {currentMailbox.id: [emailSelected.id!]},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
EmailActionType.moveToSpam)); EmailActionType.moveToSpam));
} else { } else {
_moveToMailbox(context, accountId, MoveToMailboxRequest( _moveToMailbox(context, accountId, MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id]}, {currentMailbox.id: [emailSelected.id!]},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
@@ -729,7 +729,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if (accountId != null && currentMailbox != null && trashMailboxId != null) { if (accountId != null && currentMailbox != null && trashMailboxId != null) {
_moveToTrashAction(context, accountId, MoveToMailboxRequest( _moveToTrashAction(context, accountId, MoveToMailboxRequest(
{currentMailbox.id: [email.id]}, {currentMailbox.id: [email.id!]},
trashMailboxId, trashMailboxId,
MoveAction.moving, MoveAction.moving,
mailboxDashBoardController.sessionCurrent!, mailboxDashBoardController.sessionCurrent!,
@@ -750,7 +750,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if (accountId != null && currentMailbox != null && spamMailboxId != null) { if (accountId != null && currentMailbox != null && spamMailboxId != null) {
_moveToSpamAction(context, accountId, MoveToMailboxRequest( _moveToSpamAction(context, accountId, MoveToMailboxRequest(
{currentMailbox.id: [email.id]}, {currentMailbox.id: [email.id!]},
spamMailboxId, spamMailboxId,
MoveAction.moving, MoveAction.moving,
mailboxDashBoardController.sessionCurrent!, mailboxDashBoardController.sessionCurrent!,
@@ -766,7 +766,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if (accountId != null && spamMailboxId != null && inboxMailboxId != null) { if (accountId != null && spamMailboxId != null && inboxMailboxId != null) {
_moveToSpamAction(context, accountId, MoveToMailboxRequest( _moveToSpamAction(context, accountId, MoveToMailboxRequest(
{spamMailboxId: [email.id]}, {spamMailboxId: [email.id!]},
inboxMailboxId, inboxMailboxId,
MoveAction.moving, MoveAction.moving,
mailboxDashBoardController.sessionCurrent!, mailboxDashBoardController.sessionCurrent!,
@@ -235,7 +235,7 @@ class MailboxDashBoardController extends ReloadableController {
final ComposerArguments composerArguments = ComposerArguments( final ComposerArguments composerArguments = ComposerArguments(
emailActionType: EmailActionType.edit, emailActionType: EmailActionType.edit,
presentationEmail: PresentationEmail( presentationEmail: PresentationEmail(
success.composerCache.id, id: success.composerCache.id,
subject: success.composerCache.subject, subject: success.composerCache.subject,
from: success.composerCache.from, from: success.composerCache.from,
to: success.composerCache.to, to: success.composerCache.to,
@@ -519,7 +519,7 @@ class MailboxDashBoardController extends ReloadableController {
dispatchRoute(DashboardRoutes.emailDetailed); dispatchRoute(DashboardRoutes.emailDetailed);
if (BuildUtils.isWeb && presentationEmail.routeWeb != null) { if (BuildUtils.isWeb && presentationEmail.routeWeb != null) {
RouteUtils.updateRouteOnBrowser( RouteUtils.updateRouteOnBrowser(
'Email-${presentationEmail.id.id.value}', 'Email-${presentationEmail.id?.id.value ?? ''}',
presentationEmail.routeWeb! presentationEmail.routeWeb!
); );
} }
@@ -628,15 +628,15 @@ class MailboxDashBoardController extends ReloadableController {
void _discardEmail(Email email) { void _discardEmail(Email email) {
final currentAccountId = accountId.value; final currentAccountId = accountId.value;
if (currentAccountId != null) { if (currentAccountId != null && email.id != null) {
consumeState(_removeEmailDraftsInteractor.execute(currentAccountId, email.id)); consumeState(_removeEmailDraftsInteractor.execute(currentAccountId, email.id!));
} }
} }
void deleteEmailPermanently(PresentationEmail email) { void deleteEmailPermanently(PresentationEmail email) {
final currentAccountId = accountId.value; final currentAccountId = accountId.value;
if (currentAccountId != null) { if (currentAccountId != null && email.id != null) {
consumeState(_deleteEmailPermanentlyInteractor.execute(currentAccountId, email.id)); consumeState(_deleteEmailPermanentlyInteractor.execute(currentAccountId, email.id!));
} }
} }
@@ -825,22 +825,21 @@ class MailboxDashBoardController extends ReloadableController {
List<PresentationEmail> listEmails, List<PresentationEmail> listEmails,
PresentationMailbox destinationMailbox, PresentationMailbox destinationMailbox,
) { ) {
if(searchController.isSearchEmailRunning){ if (searchController.isSearchEmailRunning){
final Map<MailboxId,List<EmailId>> mapListEmailSelectedByMailBoxId = {}; final Map<MailboxId,List<EmailId>> mapListEmailSelectedByMailBoxId = {};
for (var element in listEmails) { for (var element in listEmails) {
final mailbox = element.findMailboxContain(mapMailboxById); final mailbox = element.findMailboxContain(mapMailboxById);
if(mailbox != null) { if (mailbox != null && element.id != null) {
if(mapListEmailSelectedByMailBoxId.containsKey(mailbox.id)) { if (mapListEmailSelectedByMailBoxId.containsKey(mailbox.id)) {
mapListEmailSelectedByMailBoxId[mailbox.id]?.add(element.id); mapListEmailSelectedByMailBoxId[mailbox.id]?.add(element.id!);
} else { } else {
mapListEmailSelectedByMailBoxId.addAll({mailbox.id: [element.id]}); mapListEmailSelectedByMailBoxId.addAll({mailbox.id: [element.id!]});
} }
} }
} }
_handleDragSelectedMultipleEmailToMailboxAction(mapListEmailSelectedByMailBoxId, destinationMailbox); _handleDragSelectedMultipleEmailToMailboxAction(mapListEmailSelectedByMailBoxId, destinationMailbox);
} else { } else {
if(selectedMailbox.value != null) { if (selectedMailbox.value != null) {
_handleDragSelectedMultipleEmailToMailboxAction({selectedMailbox.value!.id: listEmails.listEmailIds}, destinationMailbox); _handleDragSelectedMultipleEmailToMailboxAction({selectedMailbox.value!.id: listEmails.listEmailIds}, destinationMailbox);
} }
} }
@@ -136,7 +136,7 @@ class EmailChangeListener extends ChangeListener {
final notificationPayload = NotificationPayload(emailId: presentationEmail.id); final notificationPayload = NotificationPayload(emailId: presentationEmail.id);
log('EmailChangeListener::_showLocalNotification():notificationPayload: $notificationPayload'); log('EmailChangeListener::_showLocalNotification():notificationPayload: $notificationPayload');
LocalNotificationManager.instance.showPushNotification( LocalNotificationManager.instance.showPushNotification(
id: presentationEmail.id.id.value, id: presentationEmail.id?.id.value ?? '',
title: presentationEmail.subject ?? '', title: presentationEmail.subject ?? '',
message: presentationEmail.preview, message: presentationEmail.preview,
emailAddress: presentationEmail.from?.first, emailAddress: presentationEmail.from?.first,
@@ -13,7 +13,7 @@ import 'package:tmail_ui_user/features/thread/data/extensions/email_address_hive
extension EmailCacheExtension on EmailCache { extension EmailCacheExtension on EmailCache {
Email toEmail() { Email toEmail() {
return Email( return Email(
EmailId(Id(id)), id: EmailId(Id(id)),
keywords: keywords != null keywords: keywords != null
? Map.fromIterables(keywords!.keys.map((value) => KeyWordIdentifier(value)), keywords!.values) ? Map.fromIterables(keywords!.keys.map((value) => KeyWordIdentifier(value)), keywords!.values)
: null, : null,
@@ -8,7 +8,7 @@ extension EmailExtension on Email {
EmailCache toEmailCache() { EmailCache toEmailCache() {
return EmailCache( return EmailCache(
id.id.value, id!.id.value,
keywords: keywords?.toMapString(), keywords: keywords?.toMapString(),
size: size?.value.round(), size: size?.value.round(),
receivedAt: receivedAt?.value, receivedAt: receivedAt?.value,
@@ -11,6 +11,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart'
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/email/email_property.dart'; import 'package:model/email/email_property.dart';
import 'package:model/extensions/list_email_extension.dart';
import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
import 'package:tmail_ui_user/features/thread/data/model/empty_trash_folder_arguments.dart'; import 'package:tmail_ui_user/features/thread/data/model/empty_trash_folder_arguments.dart';
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
@@ -68,11 +69,9 @@ class ThreadIsolateWorker {
if (newEmailList.isNotEmpty) { if (newEmailList.isNotEmpty) {
lastEmail = newEmailList.last; lastEmail = newEmailList.last;
hasEmails = true; hasEmails = true;
final emailIds = newEmailList.map((email) => email.id).toList(); final listEmailIdDeleted = await args.emailAPI.deleteMultipleEmailsPermanently(args.accountId, newEmailList.listEmailIds);
final listEmailIdDeleted = await args.emailAPI.deleteMultipleEmailsPermanently(args.accountId, emailIds); if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == newEmailList.listEmailIds.length) {
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == emailIds.length) {
sendPort.send(listEmailIdDeleted); sendPort.send(listEmailIdDeleted);
} }
emailListCompleted.addAll(listEmailIdDeleted); emailListCompleted.addAll(listEmailIdDeleted);
@@ -117,11 +116,9 @@ class ThreadIsolateWorker {
if (newEmailList.isNotEmpty) { if (newEmailList.isNotEmpty) {
lastEmail = newEmailList.last; lastEmail = newEmailList.last;
hasEmails = true; hasEmails = true;
final emailIds = newEmailList.map((email) => email.id).toList(); final listEmailIdDeleted = await _emailAPI.deleteMultipleEmailsPermanently(accountId, newEmailList.listEmailIds);
final listEmailIdDeleted = await _emailAPI.deleteMultipleEmailsPermanently(accountId, emailIds); if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == newEmailList.listEmailIds.length) {
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == emailIds.length) {
await updateDestroyedEmailCache(listEmailIdDeleted); await updateDestroyedEmailCache(listEmailIdDeleted);
} }
emailListCompleted.addAll(listEmailIdDeleted); emailListCompleted.addAll(listEmailIdDeleted);
@@ -157,7 +157,9 @@ class ThreadRepositoryImpl extends ThreadRepository {
} }
dartz.Tuple2<Email, Email?> _combineUpdatedWithEmailInCache(Email updatedEmail, List<Email>? emailCacheList) { dartz.Tuple2<Email, Email?> _combineUpdatedWithEmailInCache(Email updatedEmail, List<Email>? emailCacheList) {
final emailOld = emailCacheList?.findEmailById(updatedEmail.id); final emailOld = updatedEmail.id != null
? emailCacheList?.findEmailById(updatedEmail.id!)
: null;
if (emailOld != null) { if (emailOld != null) {
log('ThreadRepositoryImpl::_combineUpdatedWithEmailInCache(): cache hit'); log('ThreadRepositoryImpl::_combineUpdatedWithEmailInCache(): cache hit');
return dartz.Tuple2(updatedEmail, emailOld); return dartz.Tuple2(updatedEmail, emailOld);
@@ -56,7 +56,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
if (mailboxContain != null && accountId != null && trashMailboxId != null) { if (mailboxContain != null && accountId != null && trashMailboxId != null) {
_moveToTrashAction(accountId, MoveToMailboxRequest( _moveToTrashAction(accountId, MoveToMailboxRequest(
{mailboxContain.id: [email.id]}, {mailboxContain.id: email.id != null ? [email.id!] : []},
trashMailboxId, trashMailboxId,
MoveAction.moving, MoveAction.moving,
mailboxDashBoardController.sessionCurrent!, mailboxDashBoardController.sessionCurrent!,
@@ -75,7 +75,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
if (mailboxContain != null && accountId != null && spamMailboxId != null) { if (mailboxContain != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(accountId, MoveToMailboxRequest( moveToSpamAction(accountId, MoveToMailboxRequest(
{mailboxContain.id: [email.id]}, {mailboxContain.id: email.id != null ? [email.id!] : []},
spamMailboxId, spamMailboxId,
MoveAction.moving, MoveAction.moving,
mailboxDashBoardController.sessionCurrent!, mailboxDashBoardController.sessionCurrent!,
@@ -91,7 +91,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
if (inboxMailboxId != null && accountId != null && spamMailboxId != null) { if (inboxMailboxId != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(accountId, MoveToMailboxRequest( moveToSpamAction(accountId, MoveToMailboxRequest(
{spamMailboxId: [email.id]}, {spamMailboxId: email.id != null ? [email.id!] : []},
inboxMailboxId, inboxMailboxId,
MoveAction.moving, MoveAction.moving,
mailboxDashBoardController.sessionCurrent!, mailboxDashBoardController.sessionCurrent!,
@@ -161,21 +161,21 @@ mixin EmailActionController on ViewAsDialogActionMixin {
) { ) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
moveToSpamAction(accountId, MoveToMailboxRequest( moveToSpamAction(accountId, MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id]}, {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
EmailActionType.moveToTrash)); EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) { } else if (destinationMailbox.isSpam) {
moveToSpamAction(accountId, MoveToMailboxRequest( moveToSpamAction(accountId, MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id]}, {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
EmailActionType.moveToSpam)); EmailActionType.moveToSpam));
} else { } else {
_moveToMailboxAction(accountId, MoveToMailboxRequest( _moveToMailboxAction(accountId, MoveToMailboxRequest(
{currentMailbox.id: [emailSelected.id]}, {currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id, destinationMailbox.id,
MoveAction.moving, MoveAction.moving,
session, session,
@@ -887,8 +887,8 @@ class ThreadController extends BaseController with EmailActionController {
} }
void calculateDragValue(PresentationEmail? currentPresentationEmail) { void calculateDragValue(PresentationEmail? currentPresentationEmail) {
if(currentPresentationEmail != null) { if (currentPresentationEmail != null) {
if(mailboxDashBoardController.listEmailSelected.findEmail(currentPresentationEmail.id) != null){ if (currentPresentationEmail.id != null && mailboxDashBoardController.listEmailSelected.findEmail(currentPresentationEmail.id!) != null){
listEmailDrag.clear(); listEmailDrag.clear();
listEmailDrag.addAll(mailboxDashBoardController.listEmailSelected); listEmailDrag.addAll(mailboxDashBoardController.listEmailSelected);
} else { } else {
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/quotas/data/network/quotas_api.dart';
import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; import 'package:tmail_ui_user/features/session/data/network/session_api.dart';
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
import 'package:uuid/uuid.dart';
class NetworkBindings extends Bindings { class NetworkBindings extends Bindings {
@@ -82,7 +83,9 @@ class NetworkBindings extends Bindings {
Get.put(EmailAPI( Get.put(EmailAPI(
Get.find<HttpClient>(), Get.find<HttpClient>(),
Get.find<DownloadManager>(), Get.find<DownloadManager>(),
Get.find<DioClient>())); Get.find<DioClient>(),
Get.find<Uuid>(),
));
Get.put(RuleFilterAPI(Get.find<HttpClient>())); Get.put(RuleFilterAPI(Get.find<HttpClient>()));
Get.put(VacationAPI(Get.find<HttpClient>())); Get.put(VacationAPI(Get.find<HttpClient>()));
Get.put(ContactAPI(Get.find<HttpClient>())); Get.put(ContactAPI(Get.find<HttpClient>()));
@@ -12,6 +12,7 @@ import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_work
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart';
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart'; import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
import 'package:uuid/uuid.dart';
import 'package:worker_manager/worker_manager.dart'; import 'package:worker_manager/worker_manager.dart';
class NetworkIsolateBindings extends Bindings { class NetworkIsolateBindings extends Bindings {
@@ -51,7 +52,9 @@ class NetworkIsolateBindings extends Bindings {
Get.put(EmailAPI( Get.put(EmailAPI(
httpClient, httpClient,
Get.find<DownloadManager>(tag: BindingTag.isolateTag), Get.find<DownloadManager>(tag: BindingTag.isolateTag),
Get.find<DioClient>(tag: BindingTag.isolateTag)), tag: BindingTag.isolateTag); Get.find<DioClient>(tag: BindingTag.isolateTag),
Get.find<Uuid>()
), tag: BindingTag.isolateTag);
} }
void _bindingIsolateWorker() { void _bindingIsolateWorker() {
+20 -22
View File
@@ -13,7 +13,7 @@ import 'package:model/mailbox/select_mode.dart';
class PresentationEmail with EquatableMixin { class PresentationEmail with EquatableMixin {
final EmailId id; final EmailId? id;
final Map<KeyWordIdentifier, bool>? keywords; final Map<KeyWordIdentifier, bool>? keywords;
final UnsignedInt? size; final UnsignedInt? size;
final UTCDate? receivedAt; final UTCDate? receivedAt;
@@ -32,28 +32,26 @@ class PresentationEmail with EquatableMixin {
final Uri? routeWeb; final Uri? routeWeb;
final PresentationMailbox? mailboxContain; final PresentationMailbox? mailboxContain;
PresentationEmail( PresentationEmail({
this.id, this.id,
{ this.keywords,
this.keywords, this.size,
this.size, this.receivedAt,
this.receivedAt, this.hasAttachment,
this.hasAttachment, this.preview,
this.preview, this.subject,
this.subject, this.sentAt,
this.sentAt, this.from,
this.from, this.to,
this.to, this.cc,
this.cc, this.bcc,
this.bcc, this.replyTo,
this.replyTo, this.mailboxIds,
this.mailboxIds, this.mailboxNames,
this.mailboxNames, this.selectMode = SelectMode.INACTIVE,
this.selectMode = SelectMode.INACTIVE, this.routeWeb,
this.routeWeb, this.mailboxContain
this.mailboxContain });
}
);
String getSenderName() { String getSenderName() {
if (from?.isNotEmpty == true) { if (from?.isNotEmpty == true) {
+3 -3
View File
@@ -34,7 +34,7 @@ extension EmailExtension on Email {
Email updatedEmail({Map<KeyWordIdentifier, bool>? newKeywords, Map<MailboxId, bool>? newMailboxIds}) { Email updatedEmail({Map<KeyWordIdentifier, bool>? newKeywords, Map<MailboxId, bool>? newMailboxIds}) {
return Email( return Email(
id, id: id,
keywords: newKeywords ?? keywords, keywords: newKeywords ?? keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
@@ -57,7 +57,7 @@ extension EmailExtension on Email {
PresentationEmail toPresentationEmail({SelectMode selectMode = SelectMode.INACTIVE}) { PresentationEmail toPresentationEmail({SelectMode selectMode = SelectMode.INACTIVE}) {
return PresentationEmail( return PresentationEmail(
id, id: id,
keywords: keywords, keywords: keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
@@ -77,7 +77,7 @@ extension EmailExtension on Email {
Email combineEmail(Email newEmail, Properties updatedProperties) { Email combineEmail(Email newEmail, Properties updatedProperties) {
return Email( return Email(
newEmail.id, id: newEmail.id,
keywords: updatedProperties.contain(EmailProperty.keywords) ? newEmail.keywords : keywords, keywords: updatedProperties.contain(EmailProperty.keywords) ? newEmail.keywords : keywords,
size: updatedProperties.contain(EmailProperty.size) ? newEmail.size : size, size: updatedProperties.contain(EmailProperty.size) ? newEmail.size : size,
receivedAt: updatedProperties.contain(EmailProperty.receivedAt) ? newEmail.receivedAt : receivedAt, receivedAt: updatedProperties.contain(EmailProperty.receivedAt) ? newEmail.receivedAt : receivedAt,
@@ -1,4 +1,5 @@
import 'package:collection/collection.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
@@ -8,6 +9,8 @@ import 'package:jmap_dart_client/jmap/core/extensions/unsigned_int_extension.dar
extension ListEmailExtension on List<Email> { extension ListEmailExtension on List<Email> {
List<EmailId> get listEmailIds => map((email) => email.id).whereNotNull().toList();
Email? findEmailById(EmailId emailId) { Email? findEmailById(EmailId emailId) {
try { try {
return firstWhere((email) => email.id == emailId); return firstWhere((email) => email.id == emailId);
@@ -1,4 +1,5 @@
import 'package:collection/collection.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
@@ -18,7 +19,7 @@ extension ListPresentationEmailExtension on List<PresentationEmail> {
return where((email) => email.selectMode == SelectMode.ACTIVE).toList(); return where((email) => email.selectMode == SelectMode.ACTIVE).toList();
} }
List<EmailId> get listEmailIds => map((email) => email.id).toList(); List<EmailId> get listEmailIds => map((email) => email.id).whereNotNull().toList();
bool isAllCanDeletePermanently(Map<MailboxId, PresentationMailbox> mapMailbox) { bool isAllCanDeletePermanently(Map<MailboxId, PresentationMailbox> mapMailbox) {
final listMailboxContain = map((email) => email.findMailboxContain(mapMailbox)) final listMailboxContain = map((email) => email.findMailboxContain(mapMailbox))
@@ -88,9 +89,13 @@ extension ListPresentationEmailExtension on List<PresentationEmail> {
List<PresentationEmail> combine(List<PresentationEmail> listEmailBefore) { List<PresentationEmail> combine(List<PresentationEmail> listEmailBefore) {
return map((presentationEmail) { return map((presentationEmail) {
final emailBefore = listEmailBefore.findEmail(presentationEmail.id); if (presentationEmail.id != null) {
if (emailBefore != null) { final emailBefore = listEmailBefore.findEmail(presentationEmail.id!);
return presentationEmail.toSelectedEmail(selectMode: emailBefore.selectMode); if (emailBefore != null) {
return presentationEmail.toSelectedEmail(selectMode: emailBefore.selectMode);
} else {
return presentationEmail;
}
} else { } else {
return presentationEmail; return presentationEmail;
} }
@@ -35,7 +35,7 @@ extension PresentationEmailExtension on PresentationEmail {
PresentationEmail toggleSelect() { PresentationEmail toggleSelect() {
return PresentationEmail( return PresentationEmail(
this.id, id: this.id,
keywords: keywords, keywords: keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
@@ -58,7 +58,7 @@ extension PresentationEmailExtension on PresentationEmail {
PresentationEmail toSelectedEmail({required SelectMode selectMode}) { PresentationEmail toSelectedEmail({required SelectMode selectMode}) {
return PresentationEmail( return PresentationEmail(
this.id, id: this.id,
keywords: keywords, keywords: keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
@@ -81,7 +81,7 @@ extension PresentationEmailExtension on PresentationEmail {
Email toEmail() { Email toEmail() {
return Email( return Email(
this.id, id: this.id,
keywords: keywords, keywords: keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
@@ -141,7 +141,7 @@ extension PresentationEmailExtension on PresentationEmail {
.toList(); .toList();
return PresentationEmail( return PresentationEmail(
this.id, id: this.id,
keywords: keywords, keywords: keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
@@ -177,7 +177,7 @@ extension PresentationEmailExtension on PresentationEmail {
PresentationEmail withRouteWeb(Uri routeWeb) { PresentationEmail withRouteWeb(Uri routeWeb) {
return PresentationEmail( return PresentationEmail(
this.id, id: this.id,
keywords: keywords, keywords: keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
@@ -200,7 +200,7 @@ extension PresentationEmailExtension on PresentationEmail {
PresentationEmail updateKeywords(Map<KeyWordIdentifier, bool>? newKeywords) { PresentationEmail updateKeywords(Map<KeyWordIdentifier, bool>? newKeywords) {
return PresentationEmail( return PresentationEmail(
this.id, id: this.id,
keywords: newKeywords, keywords: newKeywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
@@ -223,7 +223,7 @@ extension PresentationEmailExtension on PresentationEmail {
PresentationEmail syncPresentationEmail({PresentationMailbox? mailboxContain, Uri? routeWeb}) { PresentationEmail syncPresentationEmail({PresentationMailbox? mailboxContain, Uri? routeWeb}) {
return PresentationEmail( return PresentationEmail(
this.id, id: this.id,
keywords: keywords, keywords: keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
+5 -5
View File
@@ -8,7 +8,7 @@ import 'mailbox_fixtures.dart';
class EmailFixtures { class EmailFixtures {
static final email1 = Email( static final email1 = Email(
EmailId(Id("382312d0-fa5c-11eb-b647-2fef1ee78d9e")), id: EmailId(Id("382312d0-fa5c-11eb-b647-2fef1ee78d9e")),
preview: "Dear QA,I attached image here", preview: "Dear QA,I attached image here",
hasAttachment: false, hasAttachment: false,
subject: "test inline image", subject: "test inline image",
@@ -21,7 +21,7 @@ class EmailFixtures {
); );
static final email2 = Email( static final email2 = Email(
EmailId(Id("bc8a5320-fa58-11eb-b647-2fef1ee78d9e")), id: EmailId(Id("bc8a5320-fa58-11eb-b647-2fef1ee78d9e")),
preview: "This event is about to begin Noti check TimeFriday 23 October 2020 12:00 - 12:30 Europe/Paris (See in Calendar)Location1 thai ha (See in Map)Attendees - User A <usera@qa.open-paas.org> (Organizer) - Lê Nguyễn <userb@qa.open-paas.org> - User C <userc@qa.ope", preview: "This event is about to begin Noti check TimeFriday 23 October 2020 12:00 - 12:30 Europe/Paris (See in Calendar)Location1 thai ha (See in Map)Attendees - User A <usera@qa.open-paas.org> (Organizer) - Lê Nguyễn <userb@qa.open-paas.org> - User C <userc@qa.ope",
hasAttachment: false, hasAttachment: false,
subject: "Notification: Noti check", subject: "Notification: Noti check",
@@ -33,7 +33,7 @@ class EmailFixtures {
); );
static final email3 = Email( static final email3 = Email(
EmailId(Id("ba7e0860-fa58-11eb-b647-2fef1ee78d9e")), id: EmailId(Id("ba7e0860-fa58-11eb-b647-2fef1ee78d9e")),
preview: "This event is about to begin Recurrencr TimeWednesday 26 August 2020 05:30 - 06:30 Europe/Paris (See in Calendar)Location1 thai ha (See in Map)Attendees - userb@qa.open-paas.org <userb@qa.open-paas.org> (Organizer) - User A <usera@qa.open-paas.org> Resourc", preview: "This event is about to begin Recurrencr TimeWednesday 26 August 2020 05:30 - 06:30 Europe/Paris (See in Calendar)Location1 thai ha (See in Map)Attendees - userb@qa.open-paas.org <userb@qa.open-paas.org> (Organizer) - User A <usera@qa.open-paas.org> Resourc",
hasAttachment: false, hasAttachment: false,
subject: "Notification: Recurrencr", subject: "Notification: Recurrencr",
@@ -46,7 +46,7 @@ class EmailFixtures {
); );
static final email4 = Email( static final email4 = Email(
EmailId(Id("d9b3b880-fa6f-11eb-b647-2fef1ee78d9e")), id: EmailId(Id("d9b3b880-fa6f-11eb-b647-2fef1ee78d9e")),
preview: "alo -- desktop signature", preview: "alo -- desktop signature",
hasAttachment: true, hasAttachment: true,
subject: "test attachment", subject: "test attachment",
@@ -59,7 +59,7 @@ class EmailFixtures {
); );
static final email5 = Email( static final email5 = Email(
EmailId(Id("637f1ef0-fa5d-11eb-b647-2fef1ee78d9e")), id: EmailId(Id("637f1ef0-fa5d-11eb-b647-2fef1ee78d9e")),
preview: "Dear, test inline Thanks and BRs-- desktop signature", preview: "Dear, test inline Thanks and BRs-- desktop signature",
hasAttachment: false, hasAttachment: false,
subject: "test inline image", subject: "test inline image",