TF-3385 Update move emails
This commit is contained in:
@@ -14,6 +14,8 @@ class MoveToMailboxSuccess extends UIState {
|
|||||||
final MoveAction moveAction;
|
final MoveAction moveAction;
|
||||||
final EmailActionType emailActionType;
|
final EmailActionType emailActionType;
|
||||||
final String? destinationPath;
|
final String? destinationPath;
|
||||||
|
final Map<MailboxId,List<EmailId>> originalMailboxIdsWithEmailIds;
|
||||||
|
final Map<EmailId, bool> emailIdsWithReadStatus;
|
||||||
|
|
||||||
MoveToMailboxSuccess(
|
MoveToMailboxSuccess(
|
||||||
this.emailId,
|
this.emailId,
|
||||||
@@ -23,6 +25,8 @@ class MoveToMailboxSuccess extends UIState {
|
|||||||
this.emailActionType,
|
this.emailActionType,
|
||||||
{
|
{
|
||||||
this.destinationPath,
|
this.destinationPath,
|
||||||
|
required this.originalMailboxIdsWithEmailIds,
|
||||||
|
required this.emailIdsWithReadStatus,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -34,6 +38,8 @@ class MoveToMailboxSuccess extends UIState {
|
|||||||
moveAction,
|
moveAction,
|
||||||
emailActionType,
|
emailActionType,
|
||||||
destinationPath,
|
destinationPath,
|
||||||
|
originalMailboxIdsWithEmailIds,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:core/presentation/state/success.dart';
|
|||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
||||||
@@ -12,7 +13,12 @@ class MoveToMailboxInteractor {
|
|||||||
|
|
||||||
MoveToMailboxInteractor(this._emailRepository);
|
MoveToMailboxInteractor(this._emailRepository);
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) async* {
|
Stream<Either<Failure, Success>> execute(
|
||||||
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) async* {
|
||||||
try {
|
try {
|
||||||
yield Right(LoadingMoveToMailbox());
|
yield Right(LoadingMoveToMailbox());
|
||||||
final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest);
|
final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest);
|
||||||
@@ -24,6 +30,8 @@ class MoveToMailboxInteractor {
|
|||||||
moveRequest.moveAction,
|
moveRequest.moveAction,
|
||||||
moveRequest.emailActionType,
|
moveRequest.emailActionType,
|
||||||
destinationPath: moveRequest.destinationPath,
|
destinationPath: moveRequest.destinationPath,
|
||||||
|
originalMailboxIdsWithEmailIds: moveRequest.currentMailboxes,
|
||||||
|
emailIdsWithReadStatus: emailIdsWithReadStatus,
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
yield Left(MoveToMailboxFailure(moveRequest.emailActionType));
|
yield Left(MoveToMailboxFailure(moveRequest.emailActionType));
|
||||||
|
|||||||
@@ -942,7 +942,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
{currentMailbox.id: [emailSelected.id!]},
|
{currentMailbox.id: [emailSelected.id!]},
|
||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToTrash));
|
EmailActionType.moveToTrash),
|
||||||
|
{emailSelected.id!: emailSelected.hasRead});
|
||||||
} else if (destinationMailbox.isSpam) {
|
} else if (destinationMailbox.isSpam) {
|
||||||
_moveToSpamAction(
|
_moveToSpamAction(
|
||||||
context,
|
context,
|
||||||
@@ -952,7 +953,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
{currentMailbox.id: [emailSelected.id!]},
|
{currentMailbox.id: [emailSelected.id!]},
|
||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToSpam));
|
EmailActionType.moveToSpam),
|
||||||
|
{emailSelected.id!: emailSelected.hasRead});
|
||||||
} else {
|
} else {
|
||||||
_moveToMailbox(
|
_moveToMailbox(
|
||||||
context,
|
context,
|
||||||
@@ -963,13 +965,25 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToMailbox,
|
EmailActionType.moveToMailbox,
|
||||||
destinationPath: destinationMailbox.mailboxPath));
|
destinationPath: destinationMailbox.mailboxPath),
|
||||||
|
{emailSelected.id!: emailSelected.hasRead});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _moveToMailbox(BuildContext context, Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
|
void _moveToMailbox(
|
||||||
|
BuildContext context,
|
||||||
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) {
|
||||||
closeEmailView(context: context);
|
closeEmailView(context: context);
|
||||||
consumeState(_moveToMailboxInteractor.execute(session, accountId, moveRequest));
|
consumeState(_moveToMailboxInteractor.execute(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
moveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
|
void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
|
||||||
@@ -981,10 +995,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
actionName: AppLocalizations.of(currentContext!).undo,
|
actionName: AppLocalizations.of(currentContext!).undo,
|
||||||
onActionClick: () {
|
onActionClick: () {
|
||||||
_revertedToOriginalMailbox(MoveToMailboxRequest(
|
_revertedToOriginalMailbox(MoveToMailboxRequest(
|
||||||
{success.destinationMailboxId: [success.emailId]},
|
{success.destinationMailboxId: [success.emailId]},
|
||||||
success.currentMailboxId,
|
success.currentMailboxId,
|
||||||
MoveAction.undo,
|
MoveAction.undo,
|
||||||
success.emailActionType));
|
success.emailActionType),
|
||||||
|
success.emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
},
|
},
|
||||||
leadingSVGIcon: imagePaths.icFolderMailbox,
|
leadingSVGIcon: imagePaths.icFolderMailbox,
|
||||||
leadingSVGIconColor: Colors.white,
|
leadingSVGIconColor: Colors.white,
|
||||||
@@ -995,9 +1011,18 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) {
|
void _revertedToOriginalMailbox(
|
||||||
|
MoveToMailboxRequest newMoveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) {
|
||||||
if (accountId != null && session != null) {
|
if (accountId != null && session != null) {
|
||||||
_moveToMailbox(currentContext!, session!, accountId!, newMoveRequest);
|
_moveToMailbox(
|
||||||
|
currentContext!,
|
||||||
|
session!,
|
||||||
|
accountId!,
|
||||||
|
newMoveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1014,7 +1039,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
{currentMailbox.id: [email.id!]},
|
{currentMailbox.id: [email.id!]},
|
||||||
trashMailboxId,
|
trashMailboxId,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToTrash)
|
EmailActionType.moveToTrash),
|
||||||
|
{email.id!: email.hasRead},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1023,10 +1049,16 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
BuildContext context,
|
BuildContext context,
|
||||||
Session session,
|
Session session,
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
MoveToMailboxRequest moveRequest
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
) {
|
) {
|
||||||
closeEmailView(context: context);
|
closeEmailView(context: context);
|
||||||
mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
|
mailboxDashBoardController.moveToMailbox(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
moveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveToSpam(BuildContext context, PresentationEmail email) {
|
void moveToSpam(BuildContext context, PresentationEmail email) {
|
||||||
@@ -1042,7 +1074,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
{currentMailbox.id: [email.id!]},
|
{currentMailbox.id: [email.id!]},
|
||||||
spamMailboxId,
|
spamMailboxId,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToSpam)
|
EmailActionType.moveToSpam),
|
||||||
|
{email.id!: email.hasRead},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1060,7 +1093,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
{spamMailboxId: [email.id!]},
|
{spamMailboxId: [email.id!]},
|
||||||
inboxMailboxId,
|
inboxMailboxId,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.unSpam)
|
EmailActionType.unSpam),
|
||||||
|
{email.id!: email.hasRead},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1069,10 +1103,16 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
BuildContext context,
|
BuildContext context,
|
||||||
Session session,
|
Session session,
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
MoveToMailboxRequest moveRequest
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
) {
|
) {
|
||||||
closeEmailView(context: context);
|
closeEmailView(context: context);
|
||||||
mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
|
mailboxDashBoardController.moveToMailbox(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
moveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void markAsStarEmail(
|
void markAsStarEmail(
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanent
|
|||||||
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.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/home/data/exceptions/session_exceptions.dart';
|
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
||||||
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
|
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
|
||||||
@@ -80,6 +81,7 @@ import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
|
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
|
||||||
@@ -351,6 +353,24 @@ class MailboxController extends BaseMailboxController
|
|||||||
affectedMailboxId: reactionState.mailboxId,
|
affectedMailboxId: reactionState.mailboxId,
|
||||||
totalEmailsChanged: -reactionState.emailIds.length,
|
totalEmailsChanged: -reactionState.emailIds.length,
|
||||||
);
|
);
|
||||||
|
} else if (reactionState is MoveToMailboxSuccess) {
|
||||||
|
_handleMoveEmailsToMailbox(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
emailIdsWithReadStatus: reactionState.emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MoveMultipleEmailToMailboxAllSuccess) {
|
||||||
|
_handleMoveEmailsToMailbox(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
emailIdsWithReadStatus: reactionState.emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
||||||
|
_handleMoveEmailsToMailbox(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithMoveSucceededEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
emailIdsWithReadStatus: reactionState.moveSucceededEmailIdsWithReadStatus,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -400,6 +420,47 @@ class MailboxController extends BaseMailboxController
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _handleMoveEmailsToMailbox({
|
||||||
|
required Map<MailboxId, List<EmailId>> originalMailboxIdsWithEmailIds,
|
||||||
|
required MailboxId destinationMailboxId,
|
||||||
|
required Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
}) {
|
||||||
|
// Update changes in original mailboxes
|
||||||
|
for (var originalMailboxIdWithEmailIds in originalMailboxIdsWithEmailIds.entries) {
|
||||||
|
final originalMailboxId = originalMailboxIdWithEmailIds.key;
|
||||||
|
final emailsMovedCount = originalMailboxIdWithEmailIds.value.length;
|
||||||
|
final unreadEmailMovedCount = originalMailboxIdWithEmailIds.value
|
||||||
|
.where((emailId) => emailIdsWithReadStatus[emailId] == false)
|
||||||
|
.length;
|
||||||
|
updateMailboxTotalEmailsCountById(
|
||||||
|
originalMailboxId,
|
||||||
|
-emailsMovedCount,
|
||||||
|
);
|
||||||
|
updateUnreadCountOfMailboxById(
|
||||||
|
originalMailboxId,
|
||||||
|
unreadChanges: -unreadEmailMovedCount,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update changes in destination mailbox
|
||||||
|
updateMailboxTotalEmailsCountById(
|
||||||
|
destinationMailboxId,
|
||||||
|
originalMailboxIdsWithEmailIds.entries.fold(
|
||||||
|
0,
|
||||||
|
(sum, entry) => sum + entry.value.length,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
updateUnreadCountOfMailboxById(
|
||||||
|
destinationMailboxId,
|
||||||
|
unreadChanges: originalMailboxIdsWithEmailIds
|
||||||
|
.values
|
||||||
|
.fold(
|
||||||
|
0,
|
||||||
|
(sum, emails) => sum + emails.where((emailId) => emailIdsWithReadStatus[emailId] == false).length
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
void _initWebSocketQueueHandler() {
|
void _initWebSocketQueueHandler() {
|
||||||
_webSocketQueueHandler = WebSocketQueueHandler(
|
_webSocketQueueHandler = WebSocketQueueHandler(
|
||||||
processMessageCallback: _handleWebSocketMessage,
|
processMessageCallback: _handleWebSocketMessage,
|
||||||
|
|||||||
+94
-24
@@ -820,8 +820,18 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
|
void moveToMailbox(
|
||||||
consumeState(_moveToMailboxInteractor.execute(session, accountId, moveRequest));
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) {
|
||||||
|
consumeState(_moveToMailboxInteractor.execute(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
moveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
|
void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
|
||||||
@@ -836,7 +846,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
success.currentMailboxId,
|
success.currentMailboxId,
|
||||||
MoveAction.undo,
|
MoveAction.undo,
|
||||||
success.emailActionType
|
success.emailActionType
|
||||||
));
|
), success.emailIdsWithReadStatus);
|
||||||
},
|
},
|
||||||
leadingSVGIcon: imagePaths.icFolderMailbox,
|
leadingSVGIcon: imagePaths.icFolderMailbox,
|
||||||
leadingSVGIconColor: Colors.white,
|
leadingSVGIconColor: Colors.white,
|
||||||
@@ -846,11 +856,19 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) {
|
void _revertedToOriginalMailbox(
|
||||||
|
MoveToMailboxRequest newMoveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) {
|
||||||
final currentAccountId = accountId.value;
|
final currentAccountId = accountId.value;
|
||||||
final session = sessionCurrent;
|
final session = sessionCurrent;
|
||||||
if (currentAccountId != null && session != null) {
|
if (currentAccountId != null && session != null) {
|
||||||
consumeState(_moveToMailboxInteractor.execute(session, currentAccountId, newMoveRequest));
|
consumeState(_moveToMailboxInteractor.execute(
|
||||||
|
session,
|
||||||
|
currentAccountId,
|
||||||
|
newMoveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1048,7 +1066,12 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
sessionCurrent!,
|
sessionCurrent!,
|
||||||
listEmails.listEmailIds,
|
listEmails.listEmailIds,
|
||||||
currentMailbox,
|
currentMailbox,
|
||||||
destinationMailbox
|
destinationMailbox,
|
||||||
|
Map.fromEntries(
|
||||||
|
listEmails
|
||||||
|
.where((email) => email.id != null)
|
||||||
|
.map((email) => MapEntry(email.id!, email.hasRead)),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1059,7 +1082,8 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
Session session,
|
Session session,
|
||||||
List<EmailId> listEmailIds,
|
List<EmailId> listEmailIds,
|
||||||
PresentationMailbox currentMailbox,
|
PresentationMailbox currentMailbox,
|
||||||
PresentationMailbox destinationMailbox
|
PresentationMailbox destinationMailbox,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
) {
|
) {
|
||||||
if (destinationMailbox.isTrash) {
|
if (destinationMailbox.isTrash) {
|
||||||
_moveSelectedEmailMultipleToMailboxAction(
|
_moveSelectedEmailMultipleToMailboxAction(
|
||||||
@@ -1069,7 +1093,8 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
{currentMailbox.id: listEmailIds},
|
{currentMailbox.id: listEmailIds},
|
||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToTrash));
|
EmailActionType.moveToTrash),
|
||||||
|
emailIdsWithReadStatus);
|
||||||
} else if (destinationMailbox.isSpam) {
|
} else if (destinationMailbox.isSpam) {
|
||||||
_moveSelectedEmailMultipleToMailboxAction(
|
_moveSelectedEmailMultipleToMailboxAction(
|
||||||
session,
|
session,
|
||||||
@@ -1078,7 +1103,8 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
{currentMailbox.id: listEmailIds},
|
{currentMailbox.id: listEmailIds},
|
||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToSpam));
|
EmailActionType.moveToSpam),
|
||||||
|
emailIdsWithReadStatus);
|
||||||
} else {
|
} else {
|
||||||
_moveSelectedEmailMultipleToMailboxAction(
|
_moveSelectedEmailMultipleToMailboxAction(
|
||||||
session,
|
session,
|
||||||
@@ -1088,7 +1114,8 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToMailbox,
|
EmailActionType.moveToMailbox,
|
||||||
destinationPath: destinationMailbox.mailboxPath));
|
destinationPath: destinationMailbox.mailboxPath),
|
||||||
|
emailIdsWithReadStatus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1096,6 +1123,10 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
List<PresentationEmail> listEmails,
|
List<PresentationEmail> listEmails,
|
||||||
PresentationMailbox destinationMailbox,
|
PresentationMailbox destinationMailbox,
|
||||||
) {
|
) {
|
||||||
|
final emailIdsWithReadStatus = Map.fromEntries(listEmails
|
||||||
|
.where((email) => email.id != null)
|
||||||
|
.map((e) => MapEntry(e.id!, e.hasRead))
|
||||||
|
);
|
||||||
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) {
|
||||||
@@ -1108,11 +1139,17 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_handleDragSelectedMultipleEmailToMailboxAction(mapListEmailSelectedByMailBoxId, destinationMailbox);
|
_handleDragSelectedMultipleEmailToMailboxAction(
|
||||||
} else {
|
mapListEmailSelectedByMailBoxId,
|
||||||
if (selectedMailbox.value != null) {
|
destinationMailbox,
|
||||||
_handleDragSelectedMultipleEmailToMailboxAction({selectedMailbox.value!.id: listEmails.listEmailIds}, destinationMailbox);
|
emailIdsWithReadStatus,
|
||||||
}
|
);
|
||||||
|
} else if (selectedMailbox.value != null) {
|
||||||
|
_handleDragSelectedMultipleEmailToMailboxAction(
|
||||||
|
{selectedMailbox.value!.id: listEmails.listEmailIds},
|
||||||
|
destinationMailbox,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1120,6 +1157,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
void _handleDragSelectedMultipleEmailToMailboxAction(
|
void _handleDragSelectedMultipleEmailToMailboxAction(
|
||||||
Map<MailboxId, List<EmailId>> mapListEmails,
|
Map<MailboxId, List<EmailId>> mapListEmails,
|
||||||
PresentationMailbox destinationMailbox,
|
PresentationMailbox destinationMailbox,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
) async {
|
) async {
|
||||||
if (accountId.value != null && sessionCurrent != null) {
|
if (accountId.value != null && sessionCurrent != null) {
|
||||||
if (destinationMailbox.isTrash) {
|
if (destinationMailbox.isTrash) {
|
||||||
@@ -1132,6 +1170,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToTrash,
|
EmailActionType.moveToTrash,
|
||||||
),
|
),
|
||||||
|
emailIdsWithReadStatus,
|
||||||
);
|
);
|
||||||
} else if (destinationMailbox.isSpam) {
|
} else if (destinationMailbox.isSpam) {
|
||||||
moveToMailbox(
|
moveToMailbox(
|
||||||
@@ -1143,6 +1182,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToSpam,
|
EmailActionType.moveToSpam,
|
||||||
),
|
),
|
||||||
|
emailIdsWithReadStatus,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
moveToMailbox(
|
moveToMailbox(
|
||||||
@@ -1155,6 +1195,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
EmailActionType.moveToMailbox,
|
EmailActionType.moveToMailbox,
|
||||||
destinationPath: destinationMailbox.mailboxPath,
|
destinationPath: destinationMailbox.mailboxPath,
|
||||||
),
|
),
|
||||||
|
emailIdsWithReadStatus,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1164,9 +1205,15 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
void _moveSelectedEmailMultipleToMailboxAction(
|
void _moveSelectedEmailMultipleToMailboxAction(
|
||||||
Session session,
|
Session session,
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
MoveToMailboxRequest moveRequest
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
) {
|
) {
|
||||||
consumeState(_moveMultipleEmailToMailboxInteractor.execute(session, accountId, moveRequest));
|
consumeState(_moveMultipleEmailToMailboxInteractor.execute(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
moveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _moveSelectedMultipleEmailToMailboxSuccess(Success success) {
|
void _moveSelectedMultipleEmailToMailboxSuccess(Success success) {
|
||||||
@@ -1176,6 +1223,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
MailboxId? destinationMailboxId;
|
MailboxId? destinationMailboxId;
|
||||||
MoveAction? moveAction;
|
MoveAction? moveAction;
|
||||||
EmailActionType? emailActionType;
|
EmailActionType? emailActionType;
|
||||||
|
Map<EmailId, bool>? emailIdsWithReadStatus;
|
||||||
|
|
||||||
if (success is MoveMultipleEmailToMailboxAllSuccess) {
|
if (success is MoveMultipleEmailToMailboxAllSuccess) {
|
||||||
destinationPath = success.destinationPath;
|
destinationPath = success.destinationPath;
|
||||||
@@ -1184,6 +1232,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
destinationMailboxId = success.destinationMailboxId;
|
destinationMailboxId = success.destinationMailboxId;
|
||||||
moveAction = success.moveAction;
|
moveAction = success.moveAction;
|
||||||
emailActionType = success.emailActionType;
|
emailActionType = success.emailActionType;
|
||||||
|
emailIdsWithReadStatus = success.emailIdsWithReadStatus;
|
||||||
} else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
} else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
||||||
destinationPath = success.destinationPath;
|
destinationPath = success.destinationPath;
|
||||||
movedEmailIds = success.movedListEmailId;
|
movedEmailIds = success.movedListEmailId;
|
||||||
@@ -1191,6 +1240,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
destinationMailboxId = success.destinationMailboxId;
|
destinationMailboxId = success.destinationMailboxId;
|
||||||
moveAction = success.moveAction;
|
moveAction = success.moveAction;
|
||||||
emailActionType = success.emailActionType;
|
emailActionType = success.emailActionType;
|
||||||
|
emailIdsWithReadStatus = success.moveSucceededEmailIdsWithReadStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentContext != null &&
|
if (currentContext != null &&
|
||||||
@@ -1213,7 +1263,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
MoveAction.undo,
|
MoveAction.undo,
|
||||||
emailActionType!,
|
emailActionType!,
|
||||||
destinationPath: destinationPath
|
destinationPath: destinationPath
|
||||||
));
|
), emailIdsWithReadStatus ?? {});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
leadingSVGIconColor: Colors.white,
|
leadingSVGIconColor: Colors.white,
|
||||||
@@ -1225,12 +1275,16 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _revertedSelectionEmailToOriginalMailbox(MoveToMailboxRequest newMoveRequest) {
|
void _revertedSelectionEmailToOriginalMailbox(
|
||||||
|
MoveToMailboxRequest newMoveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) {
|
||||||
if (accountId.value != null && sessionCurrent != null) {
|
if (accountId.value != null && sessionCurrent != null) {
|
||||||
consumeState(_moveMultipleEmailToMailboxInteractor.execute(
|
consumeState(_moveMultipleEmailToMailboxInteractor.execute(
|
||||||
sessionCurrent!,
|
sessionCurrent!,
|
||||||
accountId.value!,
|
accountId.value!,
|
||||||
newMoveRequest));
|
newMoveRequest,
|
||||||
|
emailIdsWithReadStatus));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1244,7 +1298,12 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
{mailboxCurrent.id: listEmails.listEmailIds},
|
{mailboxCurrent.id: listEmails.listEmailIds},
|
||||||
trashMailboxId,
|
trashMailboxId,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToTrash)
|
EmailActionType.moveToTrash),
|
||||||
|
Map.fromIterable(
|
||||||
|
listEmails
|
||||||
|
.where((email) => email.id != null)
|
||||||
|
.map((email) => MapEntry(email.id!, email.hasRead)),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1279,7 +1338,12 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
{mailboxCurrent.id: listEmail.listEmailIds},
|
{mailboxCurrent.id: listEmail.listEmailIds},
|
||||||
spamMailboxId!,
|
spamMailboxId!,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToSpam)
|
EmailActionType.moveToSpam),
|
||||||
|
Map.fromIterable(
|
||||||
|
listEmail
|
||||||
|
.where((email) => email.id != null)
|
||||||
|
.map((email) => MapEntry(email.id!, email.hasRead)),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1325,7 +1389,12 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
{spamMailboxId!: listEmail.listEmailIds},
|
{spamMailboxId!: listEmail.listEmailIds},
|
||||||
inboxMailboxId,
|
inboxMailboxId,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.unSpam)
|
EmailActionType.unSpam),
|
||||||
|
Map.fromIterable(
|
||||||
|
listEmail
|
||||||
|
.where((email) => email.id != null)
|
||||||
|
.map((email) => MapEntry(email.id!, email.hasRead)),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2793,7 +2862,8 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
moveToMailbox(
|
moveToMailbox(
|
||||||
sessionCurrent!,
|
sessionCurrent!,
|
||||||
accountId.value!,
|
accountId.value!,
|
||||||
moveToArchiveMailboxRequest
|
moveToArchiveMailboxRequest,
|
||||||
|
{email.id!: email.hasRead}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/email/presentation_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
|
|
||||||
|
extension MoveEmailsToMailboxExtension on MailboxDashBoardController {
|
||||||
|
void handleMoveEmailsToMailbox({
|
||||||
|
required Map<MailboxId,List<EmailId>> originalMailboxIdsWithEmailIds,
|
||||||
|
required MailboxId destinationMailboxId,
|
||||||
|
}) {
|
||||||
|
if (destinationMailboxId == selectedMailbox.value?.id) return;
|
||||||
|
|
||||||
|
final currentEmails = List<PresentationEmail>.from(
|
||||||
|
emailsInCurrentMailbox,
|
||||||
|
);
|
||||||
|
final movedEmailIds = originalMailboxIdsWithEmailIds.entries.fold(
|
||||||
|
<EmailId>{},
|
||||||
|
(emailIds, entry) {
|
||||||
|
emailIds.addAll(entry.value);
|
||||||
|
return emailIds;
|
||||||
|
},
|
||||||
|
).toList();
|
||||||
|
currentEmails.removeWhere((email) => movedEmailIds.contains(email.id));
|
||||||
|
updateEmailList(currentEmails);
|
||||||
|
}
|
||||||
|
}
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/email/presentation_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
|
|
||||||
|
extension UpdateEmailsWithNewMailboxIdExtension on MailboxDashBoardController {
|
||||||
|
handleUpdateEmailsWithNewMailboxId({
|
||||||
|
required Map<MailboxId,List<EmailId>> originalMailboxIdsWithEmailIds,
|
||||||
|
required MailboxId destinationMailboxId,
|
||||||
|
}) {
|
||||||
|
final currentEmails = List<PresentationEmail>.from(
|
||||||
|
emailsInCurrentMailbox,
|
||||||
|
);
|
||||||
|
final movedEmailIds = originalMailboxIdsWithEmailIds.entries.fold(
|
||||||
|
<EmailId>{},
|
||||||
|
(emailIds, entry) {
|
||||||
|
emailIds.addAll(entry.value);
|
||||||
|
return emailIds;
|
||||||
|
},
|
||||||
|
).toList();
|
||||||
|
for (var email in currentEmails) {
|
||||||
|
if (!movedEmailIds.contains(email.id)) continue;
|
||||||
|
|
||||||
|
email = email.copyWith(
|
||||||
|
mailboxIds: {destinationMailboxId: true},
|
||||||
|
mailboxContain: mapMailboxById[destinationMailboxId],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -37,6 +37,7 @@ import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanent
|
|||||||
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
||||||
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
||||||
@@ -50,6 +51,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_re
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_emails_with_new_mailbox_id_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
||||||
@@ -70,6 +72,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_sta
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
||||||
@@ -328,6 +331,21 @@ class SearchEmailController extends BaseController
|
|||||||
emailIds: reactionState.emailIds,
|
emailIds: reactionState.emailIds,
|
||||||
affectedMailboxId: reactionState.mailboxId,
|
affectedMailboxId: reactionState.mailboxId,
|
||||||
);
|
);
|
||||||
|
} else if (reactionState is MoveToMailboxSuccess) {
|
||||||
|
mailboxDashBoardController.handleUpdateEmailsWithNewMailboxId(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MoveMultipleEmailToMailboxAllSuccess) {
|
||||||
|
mailboxDashBoardController.handleUpdateEmailsWithNewMailboxId(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
||||||
|
mailboxDashBoardController.handleUpdateEmailsWithNewMailboxId(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithMoveSucceededEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
|
|||||||
final MoveAction moveAction;
|
final MoveAction moveAction;
|
||||||
final EmailActionType emailActionType;
|
final EmailActionType emailActionType;
|
||||||
final String? destinationPath;
|
final String? destinationPath;
|
||||||
|
final Map<MailboxId,List<EmailId>> originalMailboxIdsWithEmailIds;
|
||||||
|
final Map<EmailId, bool> emailIdsWithReadStatus;
|
||||||
|
|
||||||
MoveMultipleEmailToMailboxAllSuccess(
|
MoveMultipleEmailToMailboxAllSuccess(
|
||||||
this.movedListEmailId,
|
this.movedListEmailId,
|
||||||
@@ -23,6 +25,8 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
|
|||||||
this.emailActionType,
|
this.emailActionType,
|
||||||
{
|
{
|
||||||
this.destinationPath,
|
this.destinationPath,
|
||||||
|
required this.originalMailboxIdsWithEmailIds,
|
||||||
|
required this.emailIdsWithReadStatus,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -34,6 +38,8 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
|
|||||||
moveAction,
|
moveAction,
|
||||||
emailActionType,
|
emailActionType,
|
||||||
destinationPath,
|
destinationPath,
|
||||||
|
originalMailboxIdsWithEmailIds,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,6 +60,8 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
|
|||||||
final MoveAction moveAction;
|
final MoveAction moveAction;
|
||||||
final EmailActionType emailActionType;
|
final EmailActionType emailActionType;
|
||||||
final String? destinationPath;
|
final String? destinationPath;
|
||||||
|
final Map<MailboxId,List<EmailId>> originalMailboxIdsWithMoveSucceededEmailIds;
|
||||||
|
final Map<EmailId, bool> moveSucceededEmailIdsWithReadStatus;
|
||||||
|
|
||||||
MoveMultipleEmailToMailboxHasSomeEmailFailure(
|
MoveMultipleEmailToMailboxHasSomeEmailFailure(
|
||||||
this.movedListEmailId,
|
this.movedListEmailId,
|
||||||
@@ -63,6 +71,8 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
|
|||||||
this.emailActionType,
|
this.emailActionType,
|
||||||
{
|
{
|
||||||
this.destinationPath,
|
this.destinationPath,
|
||||||
|
required this.originalMailboxIdsWithMoveSucceededEmailIds,
|
||||||
|
required this.moveSucceededEmailIdsWithReadStatus,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -74,6 +84,8 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
|
|||||||
moveAction,
|
moveAction,
|
||||||
emailActionType,
|
emailActionType,
|
||||||
destinationPath,
|
destinationPath,
|
||||||
|
originalMailboxIdsWithMoveSucceededEmailIds,
|
||||||
|
moveSucceededEmailIdsWithReadStatus,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:core/presentation/extensions/map_extensions.dart';
|
||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
||||||
@@ -17,7 +20,8 @@ class MoveMultipleEmailToMailboxInteractor {
|
|||||||
Stream<Either<Failure, Success>> execute(
|
Stream<Either<Failure, Success>> execute(
|
||||||
Session session,
|
Session session,
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
MoveToMailboxRequest moveRequest
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
) async* {
|
) async* {
|
||||||
try {
|
try {
|
||||||
yield Right(LoadingMoveMultipleEmailToMailboxAll());
|
yield Right(LoadingMoveMultipleEmailToMailboxAll());
|
||||||
@@ -30,10 +34,22 @@ class MoveMultipleEmailToMailboxInteractor {
|
|||||||
moveRequest.moveAction,
|
moveRequest.moveAction,
|
||||||
moveRequest.emailActionType,
|
moveRequest.emailActionType,
|
||||||
destinationPath: moveRequest.destinationPath,
|
destinationPath: moveRequest.destinationPath,
|
||||||
|
originalMailboxIdsWithEmailIds: moveRequest.currentMailboxes,
|
||||||
|
emailIdsWithReadStatus: emailIdsWithReadStatus,
|
||||||
));
|
));
|
||||||
} else if (result.emailIdsSuccess.isEmpty) {
|
} else if (result.emailIdsSuccess.isEmpty) {
|
||||||
yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction, moveRequest.emailActionType));
|
yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction, moveRequest.emailActionType));
|
||||||
} else {
|
} else {
|
||||||
|
final originalMailboxIdsWithEmailIds = Map<MailboxId, List<EmailId>>.from(
|
||||||
|
moveRequest.currentMailboxes,
|
||||||
|
);
|
||||||
|
final originalMailboxIdsWithMoveSucceededEmailIds = originalMailboxIdsWithEmailIds
|
||||||
|
.map((key, value) => MapEntry(
|
||||||
|
key,
|
||||||
|
value.where(result.emailIdsSuccess.contains).toList()
|
||||||
|
));
|
||||||
|
final moveSucceededEmailIdsWithReadStatus = emailIdsWithReadStatus
|
||||||
|
.where((emailId, _) => result.emailIdsSuccess.contains(emailId));
|
||||||
yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure(
|
yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure(
|
||||||
result.emailIdsSuccess,
|
result.emailIdsSuccess,
|
||||||
moveRequest.currentMailboxes.keys.first,
|
moveRequest.currentMailboxes.keys.first,
|
||||||
@@ -41,6 +57,8 @@ class MoveMultipleEmailToMailboxInteractor {
|
|||||||
moveRequest.moveAction,
|
moveRequest.moveAction,
|
||||||
moveRequest.emailActionType,
|
moveRequest.emailActionType,
|
||||||
destinationPath: moveRequest.destinationPath,
|
destinationPath: moveRequest.destinationPath,
|
||||||
|
originalMailboxIdsWithMoveSucceededEmailIds: originalMailboxIdsWithMoveSucceededEmailIds,
|
||||||
|
moveSucceededEmailIdsWithReadStatus: moveSucceededEmailIdsWithReadStatus,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import 'package:flutter_svg/flutter_svg.dart';
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/email/email_action_type.dart';
|
import 'package:model/email/email_action_type.dart';
|
||||||
import 'package:model/email/mark_star_action.dart';
|
import 'package:model/email/mark_star_action.dart';
|
||||||
import 'package:model/email/presentation_email.dart';
|
import 'package:model/email/presentation_email.dart';
|
||||||
@@ -60,13 +61,24 @@ mixin EmailActionController {
|
|||||||
{mailboxContain.id: email.id != null ? [email.id!] : []},
|
{mailboxContain.id: email.id != null ? [email.id!] : []},
|
||||||
trashMailboxId,
|
trashMailboxId,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToTrash)
|
EmailActionType.moveToTrash),
|
||||||
|
email.id != null ? {email.id! : email.hasRead} : {},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _moveToTrashAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
|
void _moveToTrashAction(
|
||||||
mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) {
|
||||||
|
mailboxDashBoardController.moveToMailbox(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
moveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveToSpam(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
|
void moveToSpam(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
|
||||||
@@ -82,7 +94,8 @@ mixin EmailActionController {
|
|||||||
{mailboxContain.id: email.id != null ? [email.id!] : []},
|
{mailboxContain.id: email.id != null ? [email.id!] : []},
|
||||||
spamMailboxId,
|
spamMailboxId,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToSpam)
|
EmailActionType.moveToSpam),
|
||||||
|
email.id != null ? {email.id! : email.hasRead} : {},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,13 +114,24 @@ mixin EmailActionController {
|
|||||||
{spamMailboxId: email.id != null ? [email.id!] : []},
|
{spamMailboxId: email.id != null ? [email.id!] : []},
|
||||||
inboxMailboxId,
|
inboxMailboxId,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.unSpam)
|
EmailActionType.unSpam),
|
||||||
|
email.id != null ? {email.id! : email.hasRead} : {},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveToSpamAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
|
void moveToSpamAction(
|
||||||
mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) {
|
||||||
|
mailboxDashBoardController.moveToMailbox(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
moveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveToMailbox(
|
void moveToMailbox(
|
||||||
@@ -157,7 +181,8 @@ mixin EmailActionController {
|
|||||||
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
|
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
|
||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToTrash));
|
EmailActionType.moveToTrash),
|
||||||
|
emailSelected.id != null ? {emailSelected.id! : emailSelected.hasRead} : {});
|
||||||
} else if (destinationMailbox.isSpam) {
|
} else if (destinationMailbox.isSpam) {
|
||||||
moveToSpamAction(
|
moveToSpamAction(
|
||||||
session,
|
session,
|
||||||
@@ -166,7 +191,8 @@ mixin EmailActionController {
|
|||||||
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
|
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
|
||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToSpam));
|
EmailActionType.moveToSpam),
|
||||||
|
emailSelected.id != null ? {emailSelected.id! : emailSelected.hasRead} : {});
|
||||||
} else {
|
} else {
|
||||||
_moveToMailboxAction(
|
_moveToMailboxAction(
|
||||||
session,
|
session,
|
||||||
@@ -176,12 +202,23 @@ mixin EmailActionController {
|
|||||||
destinationMailbox.id,
|
destinationMailbox.id,
|
||||||
MoveAction.moving,
|
MoveAction.moving,
|
||||||
EmailActionType.moveToMailbox,
|
EmailActionType.moveToMailbox,
|
||||||
destinationPath: destinationMailbox.mailboxPath));
|
destinationPath: destinationMailbox.mailboxPath),
|
||||||
|
emailSelected.id != null ? {emailSelected.id! : emailSelected.hasRead} : {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _moveToMailboxAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
|
void _moveToMailboxAction(
|
||||||
mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
|
MoveToMailboxRequest moveRequest,
|
||||||
|
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||||
|
) {
|
||||||
|
mailboxDashBoardController.moveToMailbox(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
moveRequest,
|
||||||
|
emailIdsWithReadStatus,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void deleteEmailPermanently(BuildContext context, PresentationEmail email) {
|
void deleteEmailPermanently(BuildContext context, PresentationEmail email) {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanent
|
|||||||
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
||||||
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
||||||
@@ -31,6 +32,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search;
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search;
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
||||||
@@ -56,6 +58,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/get_email_by_id_state
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/refresh_all_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/refresh_all_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
@@ -407,6 +410,21 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
emailIds: reactionState.emailIds,
|
emailIds: reactionState.emailIds,
|
||||||
affectedMailboxId: reactionState.mailboxId,
|
affectedMailboxId: reactionState.mailboxId,
|
||||||
);
|
);
|
||||||
|
} else if (reactionState is MoveToMailboxSuccess) {
|
||||||
|
mailboxDashBoardController.handleMoveEmailsToMailbox(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MoveMultipleEmailToMailboxAllSuccess) {
|
||||||
|
mailboxDashBoardController.handleMoveEmailsToMailbox(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
||||||
|
mailboxDashBoardController.handleMoveEmailsToMailbox(
|
||||||
|
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithMoveSucceededEmailIds,
|
||||||
|
destinationMailboxId: reactionState.destinationMailboxId,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,4 +176,54 @@ class PresentationEmail with EquatableMixin, SearchSnippetMixin {
|
|||||||
searchSnippetSubject,
|
searchSnippetSubject,
|
||||||
searchSnippetPreview,
|
searchSnippetPreview,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
PresentationEmail copyWith({
|
||||||
|
EmailId? id,
|
||||||
|
Id? blobId,
|
||||||
|
Map<KeyWordIdentifier, bool>? keywords,
|
||||||
|
UnsignedInt? size,
|
||||||
|
UTCDate? receivedAt,
|
||||||
|
bool? hasAttachment,
|
||||||
|
String? preview,
|
||||||
|
String? subject,
|
||||||
|
UTCDate? sentAt,
|
||||||
|
Set<EmailAddress>? from,
|
||||||
|
Set<EmailAddress>? to,
|
||||||
|
Set<EmailAddress>? cc,
|
||||||
|
Set<EmailAddress>? bcc,
|
||||||
|
Set<EmailAddress>? replyTo,
|
||||||
|
Map<MailboxId, bool>? mailboxIds,
|
||||||
|
SelectMode? selectMode,
|
||||||
|
Uri? routeWeb,
|
||||||
|
PresentationMailbox? mailboxContain,
|
||||||
|
List<EmailHeader>? emailHeader,
|
||||||
|
Set<EmailBodyPart>? htmlBody,
|
||||||
|
Map<PartId, EmailBodyValue>? bodyValues,
|
||||||
|
Map<IndividualHeaderIdentifier, String?>? headerCalendarEvent,
|
||||||
|
}) {
|
||||||
|
return PresentationEmail(
|
||||||
|
id: id ?? this.id,
|
||||||
|
blobId: blobId ?? this.blobId,
|
||||||
|
keywords: keywords ?? this.keywords,
|
||||||
|
size: size ?? this.size,
|
||||||
|
receivedAt: receivedAt ?? this.receivedAt,
|
||||||
|
hasAttachment: hasAttachment ?? this.hasAttachment,
|
||||||
|
preview: preview ?? this.preview,
|
||||||
|
subject: subject ?? this.subject,
|
||||||
|
sentAt: sentAt ?? this.sentAt,
|
||||||
|
from: from ?? this.from,
|
||||||
|
to: to ?? this.to,
|
||||||
|
cc: cc ?? this.cc,
|
||||||
|
bcc: bcc ?? this.bcc,
|
||||||
|
replyTo: replyTo ?? this.replyTo,
|
||||||
|
mailboxIds: mailboxIds ?? this.mailboxIds,
|
||||||
|
selectMode: selectMode ?? this.selectMode,
|
||||||
|
routeWeb: routeWeb ?? this.routeWeb,
|
||||||
|
mailboxContain: mailboxContain ?? this.mailboxContain,
|
||||||
|
emailHeader: emailHeader ?? this.emailHeader,
|
||||||
|
htmlBody: htmlBody ?? this.htmlBody,
|
||||||
|
bodyValues: bodyValues ?? this.bodyValues,
|
||||||
|
headerCalendarEvent: headerCalendarEvent ?? this.headerCalendarEvent,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user