TF-153 Combine moveToMailbox and moveToTrash to moveToMailbox using EmailActionType object

This commit is contained in:
dab246
2022-04-15 15:51:37 +07:00
committed by Dat H. Pham
parent 60aabfb6d1
commit 16c5aed64e
45 changed files with 268 additions and 722 deletions
@@ -25,4 +25,15 @@ extension EmailActionTypeExtension on EmailActionType {
return ''; return '';
} }
} }
String getToastMessageMoveToMailboxSuccess(BuildContext context, {String? destinationPath}) {
switch(this) {
case EmailActionType.moveToMailbox:
return AppLocalizations.of(context).moved_to_mailbox(destinationPath ?? '');
case EmailActionType.moveToTrash:
return AppLocalizations.of(context).moved_to_trash;
default:
return '';
}
}
} }
@@ -3,8 +3,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.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_trash_request.dart';
abstract class EmailDataSource { abstract class EmailDataSource {
Future<Email> getEmailContent(AccountId accountId, EmailId emailId); Future<Email> getEmailContent(AccountId accountId, EmailId emailId);
@@ -35,9 +34,7 @@ abstract class EmailDataSource {
AccountRequest accountRequest, AccountRequest accountRequest,
); );
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest); Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest);
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest);
Future<List<Email>> markAsStar( Future<List<Email>> markAsStar(
AccountId accountId, AccountId accountId,
@@ -5,8 +5,7 @@ import 'package:model/model.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.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/email/domain/model/move_request.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_trash_request.dart';
class EmailDataSourceImpl extends EmailDataSource { class EmailDataSourceImpl extends EmailDataSource {
@@ -71,7 +70,7 @@ class EmailDataSourceImpl extends EmailDataSource {
} }
@override @override
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest) { Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) {
return Future.sync(() async { return Future.sync(() async {
return await emailAPI.moveToMailbox(accountId, moveRequest); return await emailAPI.moveToMailbox(accountId, moveRequest);
}).catchError((error) { }).catchError((error) {
@@ -124,15 +123,6 @@ class EmailDataSourceImpl extends EmailDataSource {
}); });
} }
@override
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) {
return Future.sync(() async {
return await emailAPI.moveToTrash(accountId, moveRequest);
}).catchError((error) {
throw error;
});
}
@override @override
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) { Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) {
return Future.sync(() async { return Future.sync(() async {
+2 -31
View File
@@ -26,8 +26,7 @@ import 'package:jmap_dart_client/jmap/mail/email/submission/set/set_email_submis
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.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_trash_request.dart';
class EmailAPI { class EmailAPI {
@@ -216,7 +215,7 @@ class EmailAPI {
); );
} }
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest) async { Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) async {
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
..addUpdates(moveRequest.emailIds ..addUpdates(moveRequest.emailIds
.generateMapUpdateObjectMoveToMailbox(moveRequest.currentMailboxId, moveRequest.destinationMailboxId)); .generateMapUpdateObjectMoveToMailbox(moveRequest.currentMailboxId, moveRequest.destinationMailboxId));
@@ -354,34 +353,6 @@ class EmailAPI {
}); });
} }
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) async {
final setEmailMethod = SetEmailMethod(accountId)
..addUpdates(moveRequest.emailIds
.generateMapUpdateObjectMoveToMailbox(moveRequest.currentMailboxId, moveRequest.trashMailboxId));
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
final response = await (requestBuilder
..usings(setEmailMethod.requiredCapabilities))
.build()
.execute();
final setEmailResponse = response.parse<SetEmailResponse>(
setEmailInvocation.methodCallId,
SetEmailResponse.deserialize);
return Future.sync(() async {
final mapUpdated = setEmailResponse!.updated!;
return moveRequest.emailIds
.where((emailId) => mapUpdated.containsKey(emailId.id))
.toList();
}).catchError((error) {
throw error;
});
}
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) async { Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) async {
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
final setEmailMethod = SetEmailMethod(accountId) final setEmailMethod = SetEmailMethod(accountId)
@@ -6,8 +6,7 @@ import 'package:model/model.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.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_trash_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';
class EmailRepositoryImpl extends EmailRepository { class EmailRepositoryImpl extends EmailRepository {
@@ -59,7 +58,7 @@ class EmailRepositoryImpl extends EmailRepository {
} }
@override @override
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest) { Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) {
return emailDataSource.moveToMailbox(accountId, moveRequest); return emailDataSource.moveToMailbox(accountId, moveRequest);
} }
@@ -110,11 +109,6 @@ class EmailRepositoryImpl extends EmailRepository {
return emailDataSource.downloadAttachmentForWeb(attachment, accountId, baseDownloadUrl, accountRequest); return emailDataSource.downloadAttachmentForWeb(attachment, accountId, baseDownloadUrl, accountRequest);
} }
@override
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) {
return emailDataSource.moveToTrash(accountId, moveRequest);
}
@override @override
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) { Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) {
return emailDataSource.deleteMultipleEmailsPermanently(accountId, emailIds); return emailDataSource.deleteMultipleEmailsPermanently(accountId, emailIds);
@@ -1,6 +1,5 @@
enum MoveAction { enum MoveAction {
moveTo, moving,
moveToTrash,
undo undo
} }
@@ -3,23 +3,24 @@ import 'package:equatable/equatable.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';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
class MoveRequest with EquatableMixin { class MoveToMailboxRequest with EquatableMixin {
final List<EmailId> emailIds; final List<EmailId> emailIds;
final MailboxId currentMailboxId; final MailboxId currentMailboxId;
final MailboxId destinationMailboxId; final MailboxId destinationMailboxId;
final MoveAction moveAction; final MoveAction moveAction;
final EmailActionType emailActionType;
final String? destinationPath; final String? destinationPath;
MoveRequest( MoveToMailboxRequest(
this.emailIds, this.emailIds,
this.currentMailboxId, this.currentMailboxId,
this.destinationMailboxId, this.destinationMailboxId,
this.moveAction, this.moveAction,
{ this.emailActionType,
this.destinationPath, {this.destinationPath}
}
); );
@override @override
@@ -28,6 +29,7 @@ class MoveRequest with EquatableMixin {
currentMailboxId, currentMailboxId,
destinationMailboxId, destinationMailboxId,
moveAction, moveAction,
emailActionType,
destinationPath, destinationPath,
]; ];
} }
@@ -1,28 +0,0 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
class MoveToTrashRequest with EquatableMixin {
final List<EmailId> emailIds;
final MailboxId currentMailboxId;
final MailboxId trashMailboxId;
final MoveAction moveAction;
MoveToTrashRequest(
this.emailIds,
this.currentMailboxId,
this.trashMailboxId,
this.moveAction,
);
@override
List<Object?> get props => [
emailIds,
currentMailboxId,
trashMailboxId,
moveAction,
];
}
@@ -3,8 +3,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.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_trash_request.dart';
abstract class EmailRepository { abstract class EmailRepository {
Future<Email> getEmailContent(AccountId accountId, EmailId emailId); Future<Email> getEmailContent(AccountId accountId, EmailId emailId);
@@ -35,9 +34,7 @@ abstract class EmailRepository {
AccountRequest accountRequest, AccountRequest accountRequest,
); );
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest); Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest);
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest);
Future<List<Email>> markAsStar( Future<List<Email>> markAsStar(
AccountId accountId, AccountId accountId,
@@ -2,12 +2,14 @@ import 'package:core/core.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';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
class MoveToMailboxSuccess extends UIState { class MoveToMailboxSuccess extends UIState {
final EmailId emailId; final EmailId emailId;
final MailboxId currentMailboxId; final MailboxId currentMailboxId;
final MailboxId destinationMailboxId; final MailboxId destinationMailboxId;
final MoveAction moveAction; final MoveAction moveAction;
final EmailActionType emailActionType;
final String? destinationPath; final String? destinationPath;
MoveToMailboxSuccess( MoveToMailboxSuccess(
@@ -15,7 +17,9 @@ class MoveToMailboxSuccess extends UIState {
this.currentMailboxId, this.currentMailboxId,
this.destinationMailboxId, this.destinationMailboxId,
this.moveAction, this.moveAction,
this.destinationPath); this.emailActionType,
{this.destinationPath}
);
@override @override
List<Object?> get props => [ List<Object?> get props => [
@@ -23,14 +27,17 @@ class MoveToMailboxSuccess extends UIState {
currentMailboxId, currentMailboxId,
destinationMailboxId, destinationMailboxId,
moveAction, moveAction,
destinationPath]; emailActionType,
destinationPath
];
} }
class MoveToMailboxFailure extends FeatureFailure { class MoveToMailboxFailure extends FeatureFailure {
final EmailActionType emailActionType;
final exception; final exception;
MoveToMailboxFailure(this.exception); MoveToMailboxFailure(this.emailActionType, this.exception);
@override @override
List<Object> get props => [exception]; List<Object> get props => [emailActionType, exception];
} }
@@ -1,35 +0,0 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
class MoveToTrashSuccess extends UIState {
final EmailId emailId;
final MailboxId currentMailboxId;
final MailboxId trashMailboxId;
final MoveAction moveAction;
MoveToTrashSuccess(
this.emailId,
this.currentMailboxId,
this.trashMailboxId,
this.moveAction
);
@override
List<Object?> get props => [
emailId,
currentMailboxId,
trashMailboxId,
moveAction
];
}
class MoveToTrashFailure extends FeatureFailure {
final exception;
MoveToTrashFailure(this.exception);
@override
List<Object> get props => [exception];
}
@@ -1,7 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.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:tmail_ui_user/features/email/domain/model/move_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';
@@ -10,7 +10,7 @@ class MoveToMailboxInteractor {
MoveToMailboxInteractor(this.emailRepository); MoveToMailboxInteractor(this.emailRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveRequest moveRequest) async* { Stream<Either<Failure, Success>> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* {
try { try {
final result = await emailRepository.moveToMailbox(accountId, moveRequest); final result = await emailRepository.moveToMailbox(accountId, moveRequest);
if (result.isNotEmpty) { if (result.isNotEmpty) {
@@ -19,12 +19,13 @@ class MoveToMailboxInteractor {
moveRequest.currentMailboxId, moveRequest.currentMailboxId,
moveRequest.destinationMailboxId, moveRequest.destinationMailboxId,
moveRequest.moveAction, moveRequest.moveAction,
moveRequest.destinationPath)); moveRequest.emailActionType,
destinationPath: moveRequest.destinationPath));
} else { } else {
yield Left(MoveToMailboxFailure(null)); yield Left(MoveToMailboxFailure(moveRequest.emailActionType, null));
} }
} catch (e) { } catch (e) {
yield Left(MoveToMailboxFailure(e)); yield Left(MoveToMailboxFailure(moveRequest.emailActionType, e));
} }
} }
} }
@@ -1,29 +0,0 @@
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart';
class MoveToTrashInteractor {
final EmailRepository emailRepository;
MoveToTrashInteractor(this.emailRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveToTrashRequest moveRequest) async* {
try {
final result = await emailRepository.moveToTrash(accountId, moveRequest);
if (result.isNotEmpty) {
yield Right(MoveToTrashSuccess(
result.first,
moveRequest.currentMailboxId,
moveRequest.trashMailboxId,
moveRequest.moveAction));
} else {
yield Left(MoveToTrashFailure(null));
}
} catch (e) {
yield Left(MoveToTrashFailure(e));
}
}
}
@@ -17,7 +17,6 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/email_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/email_controller.dart';
import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart'; import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
@@ -76,7 +75,6 @@ class EmailBindings extends BaseBindings {
Get.find<EmailRepository>(), Get.find<EmailRepository>(),
Get.find<CredentialRepository>(), Get.find<CredentialRepository>(),
)); ));
Get.lazyPut(() => MoveToTrashInteractor(Get.find<EmailRepository>()));
} }
@override @override
@@ -15,8 +15,8 @@ import 'package:permission_handler/permission_handler.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart';
@@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_action.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -91,7 +92,7 @@ class EmailController extends BaseController {
_resetToOriginalValue(); _resetToOriginalValue();
if (presentationEmail != null) { if (presentationEmail != null) {
_getEmailContentAction(presentationEmail.id); _getEmailContentAction(presentationEmail.id);
if (presentationEmail.isUnReadEmail()) { if (!presentationEmail.hasRead) {
markAsEmailRead(presentationEmail, ReadActions.markAsRead); markAsEmailRead(presentationEmail, ReadActions.markAsRead);
} }
} }
@@ -331,7 +332,7 @@ class EmailController extends BaseController {
} }
} }
void moveToMailboxAction(BuildContext context, PresentationEmail email) async { void moveToMailbox(BuildContext context, PresentationEmail email) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value; final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
@@ -343,75 +344,73 @@ class EmailController extends BaseController {
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.role == PresentationMailbox.roleTrash) { if (destinationMailbox.role == PresentationMailbox.roleTrash) {
_moveToTrash(context, accountId, MoveToTrashRequest( _moveToTrashAction(context, accountId, MoveToMailboxRequest(
[email.id], [email.id],
currentMailbox.id, currentMailbox.id,
destinationMailbox.id, destinationMailbox.id,
MoveAction.moveToTrash)); MoveAction.moving,
EmailActionType.moveToTrash));
} else { } else {
_moveToMailbox(accountId, MoveRequest( _moveToMailbox(accountId, MoveToMailboxRequest(
[email.id], [email.id],
currentMailbox.id, currentMailbox.id,
destinationMailbox.id, destinationMailbox.id,
MoveAction.moveTo, MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath)); destinationPath: destinationMailbox.mailboxPath));
} }
} }
} }
} }
void _moveToMailbox(AccountId accountId, MoveRequest moveRequest) { void _moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) {
consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest));
} }
void _moveToMailboxSuccess(Success success) { void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
mailboxDashBoardController.dispatchState(Right(success)); mailboxDashBoardController.dispatchState(Right(success));
if (success is MoveToMailboxSuccess if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) {
&& success.moveAction == MoveAction.moveTo
&& currentContext != null && currentOverlayContext != null) {
_appToast.showToastWithAction( _appToast.showToastWithAction(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).moved_to_mailbox(success.destinationPath ?? ''), success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath),
AppLocalizations.of(currentContext!).undo_action, AppLocalizations.of(currentContext!).undo_action, () {
() { _undoMoveToMailbox(MoveToMailboxRequest(
final newMoveRequest = MoveRequest( [success.emailId],
[success.emailId], success.destinationMailboxId,
success.destinationMailboxId, success.currentMailboxId,
success.currentMailboxId, MoveAction.undo,
MoveAction.undo); success.emailActionType));
_undoMoveToMailbox(newMoveRequest);
} }
); );
} }
} }
void _undoMoveToMailbox(MoveRequest newMoveRequest) { void _undoMoveToMailbox(MoveToMailboxRequest newMoveRequest) {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { if (accountId != null) {
_moveToMailbox(accountId, newMoveRequest); _moveToMailbox(accountId, newMoveRequest);
} }
} }
void moveToTrashAction(BuildContext context, PresentationEmail email) async { void moveToTrash(BuildContext context, PresentationEmail email) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash]; final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash);
if (currentMailbox != null && accountId != null && trashMailboxId != null) { if (accountId != null && currentMailbox != null && trashMailboxId != null) {
_moveToTrash(context, accountId, MoveToTrashRequest( _moveToTrashAction(context, accountId, MoveToMailboxRequest(
[email.id], [email.id],
currentMailbox.id, currentMailbox!.id,
trashMailboxId, trashMailboxId,
MoveAction.moveToTrash) MoveAction.moving,
EmailActionType.moveToTrash)
); );
} }
} }
void _moveToTrash(BuildContext context, AccountId accountId, MoveToTrashRequest moveRequest) { void _moveToTrashAction(BuildContext context, AccountId accountId, MoveToMailboxRequest moveRequest) {
backToThreadView(context); backToThreadView(context);
mailboxDashBoardController.moveToTrash(accountId, moveRequest); mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
} }
void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async { void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async {
@@ -435,17 +434,17 @@ class EmailController extends BaseController {
popBack(); popBack();
markAsEmailRead(presentationEmail, ReadActions.markAsUnread); markAsEmailRead(presentationEmail, ReadActions.markAsUnread);
break; break;
case EmailActionType.markAsStar: case EmailActionType.markAsStarred:
markAsStarEmail(presentationEmail, MarkStarAction.markStar); markAsStarEmail(presentationEmail, MarkStarAction.markStar);
break; break;
case EmailActionType.markAsUnStar: case EmailActionType.unMarkAsStarred:
markAsStarEmail(presentationEmail, MarkStarAction.unMarkStar); markAsStarEmail(presentationEmail, MarkStarAction.unMarkStar);
break; break;
case EmailActionType.move: case EmailActionType.moveToMailbox:
moveToMailboxAction(context, presentationEmail); moveToMailbox(context, presentationEmail);
break; break;
case EmailActionType.moveToTrash: case EmailActionType.moveToTrash:
moveToTrashAction(context, presentationEmail); moveToTrash(context, presentationEmail);
break; break;
case EmailActionType.deletePermanently: case EmailActionType.deletePermanently:
deleteEmailPermanently(context, presentationEmail); deleteEmailPermanently(context, presentationEmail);
@@ -122,23 +122,12 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio
Widget _buildAppBar(BuildContext context) { Widget _buildAppBar(BuildContext context) {
return Obx(() => Padding( return Obx(() => Padding(
padding: EdgeInsets.only(top: 6), padding: EdgeInsets.only(top: 6),
child: (AppBarMailWidgetBuilder( child: (AppBarMailWidgetBuilder(context, imagePaths, responsiveUtils, emailController.currentEmail, emailController.currentMailbox)
context,
imagePaths,
responsiveUtils,
emailController.currentEmail,
emailController.currentMailbox)
..onBackActionClick(() => emailController.backToThreadView(context)) ..onBackActionClick(() => emailController.backToThreadView(context))
..addOnEmailActionClick((email, action) => emailController.handleEmailAction(context, email, action)) ..addOnEmailActionClick((email, action) => emailController.handleEmailAction(context, email, action))
..addOnMoreActionClick((email, position) => responsiveUtils.isMobileDevice(context) ..addOnMoreActionClick((email, position) => responsiveUtils.isMobile(context)
? emailController.openMoreMenuEmailAction( ? emailController.openMoreMenuEmailAction(context, _emailActionMoreActionTile(context, email), cancelButton: _buildCancelButton(context))
context, : emailController.openMoreMenuEmailActionForTablet(context, position, _popupMenuEmailActionTile(context, email))))
_emailActionMoreActionTile(context, email),
cancelButton: _buildCancelButton(context))
: emailController.openMoreMenuEmailActionForTablet(
context,
position,
_popupMenuEmailActionTile(context, email))))
.build())); .build()));
} }
@@ -554,7 +543,7 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio
List<Widget> _emailActionMoreActionTile(BuildContext context, PresentationEmail email) { List<Widget> _emailActionMoreActionTile(BuildContext context, PresentationEmail email) {
return <Widget>[ return <Widget>[
_unreadEmailAction(context, email), _markAsEmailUnreadAction(context, email),
]; ];
} }
@@ -567,9 +556,9 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio
); );
} }
Widget _unreadEmailAction(BuildContext context, PresentationEmail email) { Widget _markAsEmailUnreadAction(BuildContext context, PresentationEmail email) {
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
Key('email_action_unread_action'), Key('mark_as_unread_action'),
SvgPicture.asset(imagePaths.icUnreadEmail, width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton), SvgPicture.asset(imagePaths.icUnreadEmail, width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton),
AppLocalizations.of(context).mark_as_unread, AppLocalizations.of(context).mark_as_unread,
email, email,
@@ -585,7 +574,7 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio
List<PopupMenuEntry> _popupMenuEmailActionTile(BuildContext context, PresentationEmail email) { List<PopupMenuEntry> _popupMenuEmailActionTile(BuildContext context, PresentationEmail email) {
return [ return [
PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _unreadEmailAction(context, email)), PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _markAsEmailUnreadAction(context, email)),
]; ];
} }
} }
@@ -53,10 +53,8 @@ class AppBarMailWidgetBuilder {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
if (_conditionShow(_context)) if (_conditionShow(_context)) _buildBackButton(),
_buildBackButton(), if (_conditionShow(_context)) Expanded(child: _buildMailboxName()),
if (_conditionShow(_context))
Expanded(child: _buildMailboxName()),
if (_presentationEmail != null) _buildListOptionButton(), if (_presentationEmail != null) _buildListOptionButton(),
] ]
) )
@@ -98,21 +96,12 @@ class AppBarMailWidgetBuilder {
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icMoveEmail, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icMoveEmail, fit: BoxFit.fill),
tooltip: AppLocalizations.of(_context).move_message, tooltip: AppLocalizations.of(_context).move_message,
onTap: () { onTap: () => _onEmailActionClick?.call(_presentationEmail!, EmailActionType.moveToMailbox)),
if (_presentationEmail != null) {
_onEmailActionClick?.call(_presentationEmail!, EmailActionType.move);
}
}),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset((_presentationEmail != null && _presentationEmail!.isFlaggedEmail()) ? _imagePaths.icStar : _imagePaths.icUnStar, fit: BoxFit.fill), icon: SvgPicture.asset(_presentationEmail!.hasStarred ? _imagePaths.icStar : _imagePaths.icUnStar, fit: BoxFit.fill),
tooltip: (_presentationEmail != null && _presentationEmail!.isFlaggedEmail()) tooltip: _presentationEmail!.hasStarred ? AppLocalizations.of(_context).not_starred : AppLocalizations.of(_context).mark_as_starred,
? AppLocalizations.of(_context).mark_as_unstar onTap: () => _onEmailActionClick?.call(_presentationEmail!,
: AppLocalizations.of(_context).mark_as_star, _presentationEmail!.hasStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred)),
onTap: () {
if (_presentationEmail != null) {
_onEmailActionClick?.call(_presentationEmail!, _presentationEmail!.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar);
}
}),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDeleteEmail, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icDeleteEmail, fit: BoxFit.fill),
tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash
@@ -21,7 +21,6 @@ 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/move_to_mailbox_state.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_trash_state.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/features/mailbox/domain/model/rename_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
@@ -56,7 +55,6 @@ import 'package:tmail_ui_user/features/thread/domain/model/search_query.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/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_trash_state.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -109,7 +107,6 @@ class MailboxController extends BaseMailboxController {
@override @override
void onInit() { void onInit() {
mailboxDashBoardController.accountId.listen((accountId) { mailboxDashBoardController.accountId.listen((accountId) {
log('MailboxController::onReady(): accountId: $accountId');
if (accountId != null) { if (accountId != null) {
getAllMailboxAction(accountId); getAllMailboxAction(accountId);
} }
@@ -123,16 +120,12 @@ class MailboxController extends BaseMailboxController {
mailboxDashBoardController.viewState.listen((state) { mailboxDashBoardController.viewState.listen((state) {
state.fold( state.fold(
(failure) { (failure) {
log('MailboxController::onReady(): ${failure.runtimeType}');
if (failure is EmptyTrashFolderFailure) { if (failure is EmptyTrashFolderFailure) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
refreshMailboxChanges(); refreshMailboxChanges();
} }
}, },
(success) { (success) {
log('MailboxController::onReady(): ${success.runtimeType}');
if (success is MarkAsMultipleEmailReadAllSuccess if (success is MarkAsMultipleEmailReadAllSuccess
|| success is MarkAsMultipleEmailReadHasSomeEmailFailure) { || success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
@@ -141,10 +134,6 @@ class MailboxController extends BaseMailboxController {
|| success is MoveMultipleEmailToMailboxHasSomeEmailFailure) { || success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
refreshMailboxChanges(); refreshMailboxChanges();
} else if (success is MoveMultipleEmailToTrashAllSuccess
|| success is MoveMultipleEmailToTrashHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess } else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { || success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
@@ -154,7 +143,6 @@ class MailboxController extends BaseMailboxController {
refreshMailboxChanges(); refreshMailboxChanges();
} else if (success is MarkAsEmailReadSuccess } else if (success is MarkAsEmailReadSuccess
|| success is MoveToMailboxSuccess || success is MoveToMailboxSuccess
|| success is MoveToTrashSuccess
|| success is DeleteEmailPermanentlySuccess || success is DeleteEmailPermanentlySuccess
|| success is SaveEmailAsDraftsSuccess || success is SaveEmailAsDraftsSuccess
|| success is RemoveEmailDraftsSuccess || success is RemoveEmailDraftsSuccess
@@ -11,7 +11,6 @@ import 'package:tmail_ui_user/features/email/data/repository/email_repository_im
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/usecases/delete_email_permanently_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart'; import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart';
@@ -33,7 +32,6 @@ class MailboxDashBoardBindings extends BaseBindings {
@override @override
void bindingsController() { void bindingsController() {
Get.put(MailboxDashBoardController( Get.put(MailboxDashBoardController(
Get.find<MoveToTrashInteractor>(),
Get.find<MoveToMailboxInteractor>(), Get.find<MoveToMailboxInteractor>(),
Get.find<DeleteEmailPermanentlyInteractor>(), Get.find<DeleteEmailPermanentlyInteractor>(),
)); ));
@@ -58,7 +56,6 @@ class MailboxDashBoardBindings extends BaseBindings {
void bindingsInteractor() { void bindingsInteractor() {
Get.lazyPut(() => GetUserProfileInteractor(Get.find<CredentialRepository>())); Get.lazyPut(() => GetUserProfileInteractor(Get.find<CredentialRepository>()));
Get.lazyPut(() => RemoveEmailDraftsInteractor(Get.find<EmailRepository>())); Get.lazyPut(() => RemoveEmailDraftsInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MoveToTrashInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>())); Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => DeleteEmailPermanentlyInteractor(Get.find<EmailRepository>())); Get.lazyPut(() => DeleteEmailPermanentlyInteractor(Get.find<EmailRepository>()));
} }
@@ -22,13 +22,13 @@ import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.da
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.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/login/domain/usecases/delete_credential_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart';
@@ -58,7 +58,6 @@ class MailboxDashBoardController extends ReloadableController {
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>(); final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>(); final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>();
final MoveToTrashInteractor _moveToTrashInteractor;
final MoveToMailboxInteractor _moveToMailboxInteractor; final MoveToMailboxInteractor _moveToMailboxInteractor;
final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor; final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor;
@@ -84,7 +83,6 @@ class MailboxDashBoardController extends ReloadableController {
late StreamSubscription _emailReceiveManagerStreamSubscription; late StreamSubscription _emailReceiveManagerStreamSubscription;
MailboxDashBoardController( MailboxDashBoardController(
this._moveToTrashInteractor,
this._moveToMailboxInteractor, this._moveToMailboxInteractor,
this._deleteEmailPermanentlyInteractor, this._deleteEmailPermanentlyInteractor,
); );
@@ -159,8 +157,8 @@ class MailboxDashBoardController extends ReloadableController {
} else if (success is RemoveEmailDraftsSuccess } else if (success is RemoveEmailDraftsSuccess
|| success is UpdateEmailDraftsSuccess) { || success is UpdateEmailDraftsSuccess) {
clearState(); clearState();
} else if (success is MoveToTrashSuccess) { } else if (success is MoveToMailboxSuccess) {
_moveToTrashSuccess(success); _moveToMailboxSuccess(success);
} else if (success is DeleteEmailPermanentlySuccess) { } else if (success is DeleteEmailPermanentlySuccess) {
_deleteEmailPermanentlySuccess(success); _deleteEmailPermanentlySuccess(success);
} }
@@ -220,6 +218,9 @@ class MailboxDashBoardController extends ReloadableController {
appInformation.value = info; appInformation.value = info;
} }
MailboxId? getMailboxIdByRole(Role role) {
return mapDefaultMailboxId[role];
}
void setMapDefaultMailboxId(Map<Role, MailboxId> newMapMailboxId) { void setMapDefaultMailboxId(Map<Role, MailboxId> newMapMailboxId) {
mapDefaultMailboxId = newMapMailboxId; mapDefaultMailboxId = newMapMailboxId;
@@ -308,29 +309,28 @@ class MailboxDashBoardController extends ReloadableController {
} }
} }
void moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { void moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) {
consumeState(_moveToTrashInteractor.execute(accountId, moveRequest)); consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest));
} }
void _moveToTrashSuccess(MoveToTrashSuccess success) { void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
if (success.moveAction == MoveAction.moveToTrash && currentContext != null && currentOverlayContext != null) { if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) {
_appToast.showToastWithAction( _appToast.showToastWithAction(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).moved_to_trash, success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath),
AppLocalizations.of(currentContext!).undo_action, AppLocalizations.of(currentContext!).undo_action, () {
() { _revertedToOriginalMailbox(MoveToMailboxRequest(
final newMoveRequest = MoveRequest(
[success.emailId], [success.emailId],
success.trashMailboxId, success.destinationMailboxId,
success.currentMailboxId, success.currentMailboxId,
MoveAction.undo); MoveAction.undo,
_revertedToOriginalMailbox(newMoveRequest); success.emailActionType));
} }
); );
} }
} }
void _revertedToOriginalMailbox(MoveRequest newMoveRequest) { void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) {
final currentAccountId = accountId.value; final currentAccountId = accountId.value;
if (currentAccountId != null) { if (currentAccountId != null) {
consumeState(_moveToMailboxInteractor.execute(currentAccountId, newMoveRequest)); consumeState(_moveToMailboxInteractor.execute(currentAccountId, newMoveRequest));
@@ -1,13 +1,15 @@
import 'package:core/core.dart'; import 'package:core/core.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/email/email_action_type.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
class MoveMultipleEmailToMailboxAllSuccess extends UIState { class MoveMultipleEmailToMailboxAllSuccess extends UIState {
final List<EmailId> movedListEmailId; final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId; final MailboxId currentMailboxId;
final MailboxId destinationMailboxId; final MailboxId destinationMailboxId;
final MoveAction moveAction; final MoveAction moveAction;
final EmailActionType emailActionType;
final String? destinationPath; final String? destinationPath;
MoveMultipleEmailToMailboxAllSuccess( MoveMultipleEmailToMailboxAllSuccess(
@@ -15,7 +17,9 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
this.currentMailboxId, this.currentMailboxId,
this.destinationMailboxId, this.destinationMailboxId,
this.moveAction, this.moveAction,
this.destinationPath); this.emailActionType,
{this.destinationPath}
);
@override @override
List<Object?> get props => [ List<Object?> get props => [
@@ -23,16 +27,19 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
currentMailboxId, currentMailboxId,
destinationMailboxId, destinationMailboxId,
moveAction, moveAction,
destinationPath]; emailActionType,
destinationPath
];
} }
class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure { class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure {
final MoveAction moveAction; final MoveAction moveAction;
final EmailActionType emailActionType;
MoveMultipleEmailToMailboxAllFailure(this.moveAction); MoveMultipleEmailToMailboxAllFailure(this.moveAction, this.emailActionType);
@override @override
List<Object> get props => [moveAction]; List<Object> get props => [moveAction, emailActionType];
} }
class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
@@ -40,6 +47,7 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
final MailboxId currentMailboxId; final MailboxId currentMailboxId;
final MailboxId destinationMailboxId; final MailboxId destinationMailboxId;
final MoveAction moveAction; final MoveAction moveAction;
final EmailActionType emailActionType;
final String? destinationPath; final String? destinationPath;
MoveMultipleEmailToMailboxHasSomeEmailFailure( MoveMultipleEmailToMailboxHasSomeEmailFailure(
@@ -47,7 +55,9 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
this.currentMailboxId, this.currentMailboxId,
this.destinationMailboxId, this.destinationMailboxId,
this.moveAction, this.moveAction,
this.destinationPath); this.emailActionType,
{this.destinationPath}
);
@override @override
List<Object?> get props => [ List<Object?> get props => [
@@ -55,15 +65,18 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
currentMailboxId, currentMailboxId,
destinationMailboxId, destinationMailboxId,
moveAction, moveAction,
destinationPath]; emailActionType,
destinationPath
];
} }
class MoveMultipleEmailToMailboxFailure extends FeatureFailure { class MoveMultipleEmailToMailboxFailure extends FeatureFailure {
final exception; final exception;
final MoveAction moveAction; final MoveAction moveAction;
final EmailActionType emailActionType;
MoveMultipleEmailToMailboxFailure(this.exception, this.moveAction); MoveMultipleEmailToMailboxFailure(this.exception, this.emailActionType, this.moveAction);
@override @override
List<Object> get props => [exception, moveAction]; List<Object> get props => [exception, emailActionType, moveAction];
} }
@@ -1,67 +0,0 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
class MoveMultipleEmailToTrashAllSuccess extends UIState {
final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId;
final MailboxId trashMailboxId;
final MoveAction moveAction;
MoveMultipleEmailToTrashAllSuccess(
this.movedListEmailId,
this.currentMailboxId,
this.trashMailboxId,
this.moveAction,
);
@override
List<Object?> get props => [
movedListEmailId,
currentMailboxId,
trashMailboxId,
moveAction,
];
}
class MoveMultipleEmailToTrashAllFailure extends FeatureFailure {
final MoveAction moveAction;
MoveMultipleEmailToTrashAllFailure(this.moveAction);
@override
List<Object> get props => [moveAction];
}
class MoveMultipleEmailToTrashHasSomeEmailFailure extends UIState {
final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId;
final MailboxId trashMailboxId;
final MoveAction moveAction;
MoveMultipleEmailToTrashHasSomeEmailFailure(
this.movedListEmailId,
this.currentMailboxId,
this.trashMailboxId,
this.moveAction,
);
@override
List<Object?> get props => [
movedListEmailId,
currentMailboxId,
trashMailboxId,
moveAction,
];
}
class MoveMultipleEmailToTrashFailure extends FeatureFailure {
final exception;
final MoveAction moveAction;
MoveMultipleEmailToTrashFailure(this.exception, this.moveAction);
@override
List<Object> get props => [exception, moveAction];
}
@@ -18,7 +18,7 @@ class MarkAsMultipleEmailReadInteractor {
) async* { ) async* {
try { try {
final listEmailNeedMarkAsRead = emails final listEmailNeedMarkAsRead = emails
.where((email) => readAction == ReadActions.markAsUnread ? email.isReadEmail() : email.isUnReadEmail()) .where((email) => readAction == ReadActions.markAsUnread ? email.hasRead : !email.hasRead)
.toList(); .toList();
final result = await _emailRepository.markAsRead(accountId, listEmailNeedMarkAsRead, readAction); final result = await _emailRepository.markAsRead(accountId, listEmailNeedMarkAsRead, readAction);
@@ -18,7 +18,7 @@ class MarkAsStarMultipleEmailInteractor {
) async* { ) async* {
try { try {
final listEmailNeedMarkStar = emails final listEmailNeedMarkStar = emails
.where((email) => markStarAction == MarkStarAction.unMarkStar ? email.isFlaggedEmail() : !email.isFlaggedEmail()) .where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred)
.toList(); .toList();
final result = await _emailRepository.markAsStar(accountId, listEmailNeedMarkStar, markStarAction); final result = await _emailRepository.markAsStar(accountId, listEmailNeedMarkStar, markStarAction);
@@ -3,7 +3,7 @@ import 'dart:async';
import 'package:core/core.dart'; import 'package:core/core.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:tmail_ui_user/features/email/domain/model/move_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';
@@ -12,7 +12,7 @@ class MoveMultipleEmailToMailboxInteractor {
MoveMultipleEmailToMailboxInteractor(this._emailRepository); MoveMultipleEmailToMailboxInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveRequest moveRequest) async* { Stream<Either<Failure, Success>> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* {
try { try {
final result = await _emailRepository.moveToMailbox(accountId, moveRequest); final result = await _emailRepository.moveToMailbox(accountId, moveRequest);
@@ -22,19 +22,21 @@ class MoveMultipleEmailToMailboxInteractor {
moveRequest.currentMailboxId, moveRequest.currentMailboxId,
moveRequest.destinationMailboxId, moveRequest.destinationMailboxId,
moveRequest.moveAction, moveRequest.moveAction,
moveRequest.destinationPath)); moveRequest.emailActionType,
destinationPath: moveRequest.destinationPath));
} else if (result.isEmpty) { } else if (result.isEmpty) {
yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction)); yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction, moveRequest.emailActionType));
} else { } else {
yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure( yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure(
result, result,
moveRequest.currentMailboxId, moveRequest.currentMailboxId,
moveRequest.destinationMailboxId, moveRequest.destinationMailboxId,
moveRequest.moveAction, moveRequest.moveAction,
moveRequest.destinationPath)); moveRequest.emailActionType,
destinationPath: moveRequest.destinationPath));
} }
} catch (e) { } catch (e) {
yield Left(MoveMultipleEmailToMailboxFailure(e, moveRequest.moveAction)); yield Left(MoveMultipleEmailToMailboxFailure(e, moveRequest.emailActionType, moveRequest.moveAction));
} }
} }
} }
@@ -1,38 +0,0 @@
import 'dart:async';
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.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_trash_state.dart';
class MoveMultipleEmailToTrashInteractor {
final EmailRepository _emailRepository;
MoveMultipleEmailToTrashInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveToTrashRequest moveRequest) async* {
try {
final result = await _emailRepository.moveToTrash(accountId, moveRequest);
if (moveRequest.emailIds.length == result.length) {
yield Right(MoveMultipleEmailToTrashAllSuccess(
result,
moveRequest.currentMailboxId,
moveRequest.trashMailboxId,
moveRequest.moveAction));
} else if (result.isEmpty) {
yield Left(MoveMultipleEmailToTrashAllFailure(moveRequest.moveAction));
} else {
yield Right(MoveMultipleEmailToTrashHasSomeEmailFailure(
result,
moveRequest.currentMailboxId,
moveRequest.trashMailboxId,
moveRequest.moveAction));
}
} catch (e) {
yield Left(MoveMultipleEmailToTrashFailure(e, moveRequest.moveAction));
}
}
}
@@ -29,7 +29,6 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_i
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_trash_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.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';
@@ -56,7 +55,6 @@ class ThreadBindings extends BaseBindings {
Get.find<LoadMoreEmailsInMailboxInteractor>(), Get.find<LoadMoreEmailsInMailboxInteractor>(),
Get.find<SearchEmailInteractor>(), Get.find<SearchEmailInteractor>(),
Get.find<SearchMoreEmailInteractor>(), Get.find<SearchMoreEmailInteractor>(),
Get.find<MoveMultipleEmailToTrashInteractor>(),
Get.find<DeleteMultipleEmailsPermanentlyInteractor>(), Get.find<DeleteMultipleEmailsPermanentlyInteractor>(),
Get.find<EmptyTrashFolderInteractor>(), Get.find<EmptyTrashFolderInteractor>(),
Get.find<MarkAsEmailReadInteractor>(), Get.find<MarkAsEmailReadInteractor>(),
@@ -98,7 +96,6 @@ class ThreadBindings extends BaseBindings {
Get.lazyPut(() => LoadMoreEmailsInMailboxInteractor(Get.find<ThreadRepository>())); Get.lazyPut(() => LoadMoreEmailsInMailboxInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => SearchEmailInteractor(Get.find<ThreadRepository>())); Get.lazyPut(() => SearchEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => SearchMoreEmailInteractor(Get.find<ThreadRepository>())); Get.lazyPut(() => SearchMoreEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => MoveMultipleEmailToTrashInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find<EmailRepository>())); Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => EmptyTrashFolderInteractor(Get.find<ThreadRepository>())); Get.lazyPut(() => EmptyTrashFolderInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find<EmailRepository>())); Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find<EmailRepository>()));
@@ -20,15 +20,15 @@ import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_email_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/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/domain/state/move_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
@@ -46,7 +46,6 @@ import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_stat
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/move_multiple_email_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_trash_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';
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';
@@ -56,7 +55,6 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_i
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_trash_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.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';
@@ -85,7 +83,6 @@ class ThreadController extends BaseController {
final LoadMoreEmailsInMailboxInteractor _loadMoreEmailsInMailboxInteractor; final LoadMoreEmailsInMailboxInteractor _loadMoreEmailsInMailboxInteractor;
final SearchEmailInteractor _searchEmailInteractor; final SearchEmailInteractor _searchEmailInteractor;
final SearchMoreEmailInteractor _searchMoreEmailInteractor; final SearchMoreEmailInteractor _searchMoreEmailInteractor;
final MoveMultipleEmailToTrashInteractor _moveMultipleEmailToTrashInteractor;
final DeleteMultipleEmailsPermanentlyInteractor _deleteMultipleEmailsPermanentlyInteractor; final DeleteMultipleEmailsPermanentlyInteractor _deleteMultipleEmailsPermanentlyInteractor;
final EmptyTrashFolderInteractor _emptyTrashFolderInteractor; final EmptyTrashFolderInteractor _emptyTrashFolderInteractor;
final MarkAsEmailReadInteractor _markAsEmailReadInteractor; final MarkAsEmailReadInteractor _markAsEmailReadInteractor;
@@ -123,7 +120,6 @@ class ThreadController extends BaseController {
this._loadMoreEmailsInMailboxInteractor, this._loadMoreEmailsInMailboxInteractor,
this._searchEmailInteractor, this._searchEmailInteractor,
this._searchMoreEmailInteractor, this._searchMoreEmailInteractor,
this._moveMultipleEmailToTrashInteractor,
this._deleteMultipleEmailsPermanentlyInteractor, this._deleteMultipleEmailsPermanentlyInteractor,
this._emptyTrashFolderInteractor, this._emptyTrashFolderInteractor,
this._markAsEmailReadInteractor, this._markAsEmailReadInteractor,
@@ -150,14 +146,11 @@ class ThreadController extends BaseController {
super.onReady(); super.onReady();
mailboxDashBoardController.viewState.listen((state) { mailboxDashBoardController.viewState.listen((state) {
state.map((success) { state.map((success) {
log('ThreadController::onReady(): ${success.runtimeType}');
if (success is SearchEmailNewQuery){ if (success is SearchEmailNewQuery){
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
_searchEmail(); _searchEmail();
} else if (success is MarkAsEmailReadSuccess } else if (success is MarkAsEmailReadSuccess
|| success is MoveToMailboxSuccess || success is MoveToMailboxSuccess
|| success is MoveToTrashSuccess
|| success is MarkAsStarEmailSuccess || success is MarkAsStarEmailSuccess
|| success is DeleteEmailPermanentlySuccess || success is DeleteEmailPermanentlySuccess
|| success is SaveEmailAsDraftsSuccess || success is SaveEmailAsDraftsSuccess
@@ -240,9 +233,6 @@ class ThreadController extends BaseController {
} else if (success is MarkAsStarMultipleEmailAllSuccess } else if (success is MarkAsStarMultipleEmailAllSuccess
|| success is MarkAsStarMultipleEmailHasSomeEmailFailure) { || success is MarkAsStarMultipleEmailHasSomeEmailFailure) {
_markAsStarMultipleEmailSuccess(success); _markAsStarMultipleEmailSuccess(success);
} else if (success is MoveMultipleEmailToTrashAllSuccess
|| success is MoveMultipleEmailToTrashHasSomeEmailFailure) {
_moveSelectedMultipleEmailToTrashSuccess(success);
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess } else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { || success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
_deleteMultipleEmailsPermanentlySuccess(success); _deleteMultipleEmailsPermanentlySuccess(success);
@@ -572,26 +562,26 @@ class ThreadController extends BaseController {
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.role == PresentationMailbox.roleTrash) { if (destinationMailbox.role == PresentationMailbox.roleTrash) {
_moveSelectedEmailMultipleToTrash(_accountId!, MoveToTrashRequest( _moveSelectedEmailMultipleToTrash(_accountId!, MoveToMailboxRequest(
listEmailIds, listEmailIds,
currentMailbox.id, currentMailbox.id,
destinationMailbox.id, destinationMailbox.id,
MoveAction.moveToTrash)); MoveAction.moving,
EmailActionType.moveToTrash));
} else { } else {
_moveSelectedEmailMultipleToMailbox( _moveSelectedEmailMultipleToMailbox(_accountId!, MoveToMailboxRequest(
_accountId!, listEmailIds,
MoveRequest( currentMailbox.id,
listEmailIds, destinationMailbox.id,
currentMailbox.id, MoveAction.moving,
destinationMailbox.id, EmailActionType.moveToMailbox,
MoveAction.moveTo, destinationPath: destinationMailbox.mailboxPath));
destinationPath: destinationMailbox.mailboxPath));
} }
} }
} }
} }
void _moveSelectedEmailMultipleToMailbox(AccountId accountId, MoveRequest moveRequest) { void _moveSelectedEmailMultipleToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) {
cancelSelectEmail(); cancelSelectEmail();
consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest)); consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest));
} }
@@ -604,6 +594,7 @@ class ThreadController extends BaseController {
MailboxId? currentMailboxId; MailboxId? currentMailboxId;
MailboxId? destinationMailboxId; MailboxId? destinationMailboxId;
MoveAction? moveAction; MoveAction? moveAction;
EmailActionType? emailActionType;
if (success is MoveMultipleEmailToMailboxAllSuccess) { if (success is MoveMultipleEmailToMailboxAllSuccess) {
destinationPath = success.destinationPath; destinationPath = success.destinationPath;
@@ -611,29 +602,31 @@ class ThreadController extends BaseController {
currentMailboxId = success.currentMailboxId; currentMailboxId = success.currentMailboxId;
destinationMailboxId = success.destinationMailboxId; destinationMailboxId = success.destinationMailboxId;
moveAction = success.moveAction; moveAction = success.moveAction;
emailActionType = success.emailActionType;
} else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) { } else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
destinationPath = success.destinationPath; destinationPath = success.destinationPath;
movedEmailIds = success.movedListEmailId; movedEmailIds = success.movedListEmailId;
currentMailboxId = success.currentMailboxId; currentMailboxId = success.currentMailboxId;
destinationMailboxId = success.destinationMailboxId; destinationMailboxId = success.destinationMailboxId;
moveAction = success.moveAction; moveAction = success.moveAction;
emailActionType = success.emailActionType;
} }
if (currentContext != null && currentOverlayContext != null if (currentContext != null && currentOverlayContext != null
&& destinationPath != null && moveAction == MoveAction.moveTo) { && emailActionType != null && moveAction == MoveAction.moving) {
_appToast.showToastWithAction( _appToast.showToastWithAction(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).moved_to_mailbox(destinationPath), emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: destinationPath),
AppLocalizations.of(currentContext!).undo_action, AppLocalizations.of(currentContext!).undo_action, () {
() {
final newCurrentMailboxId = destinationMailboxId; final newCurrentMailboxId = destinationMailboxId;
final newDestinationMailboxId = currentMailboxId; final newDestinationMailboxId = currentMailboxId;
if (newCurrentMailboxId != null && newDestinationMailboxId != null) { if (newCurrentMailboxId != null && newDestinationMailboxId != null) {
_undoMoveSelectedMultipleEmailToMailbox(MoveRequest( _revertedToOriginalMailbox(MoveToMailboxRequest(
movedEmailIds, movedEmailIds,
newCurrentMailboxId, newCurrentMailboxId,
newDestinationMailboxId, newDestinationMailboxId,
MoveAction.undo, MoveAction.undo,
emailActionType!,
destinationPath: destinationPath)); destinationPath: destinationPath));
} }
} }
@@ -643,67 +636,28 @@ class ThreadController extends BaseController {
_refreshEmailChanges(); _refreshEmailChanges();
} }
void _undoMoveSelectedMultipleEmailToMailbox(MoveRequest moveRequest) {
if (_accountId != null) {
_moveSelectedEmailMultipleToMailbox(_accountId!, moveRequest);
}
}
void moveSelectedMultipleEmailToTrashAction(List<PresentationEmail> listEmail) async { void moveSelectedMultipleEmailToTrashAction(List<PresentationEmail> listEmail) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value; final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash]; final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash);
if (currentMailbox != null && _accountId != null && trashMailboxId != null) { if (currentMailbox != null && _accountId != null && trashMailboxId != null) {
final listEmailIds = listEmail.map((email) => email.id).toList(); final listEmailIds = listEmail.map((email) => email.id).toList();
_moveSelectedEmailMultipleToTrash( _moveSelectedEmailMultipleToTrash(_accountId!, MoveToMailboxRequest(
_accountId!, listEmailIds,
MoveToTrashRequest(listEmailIds, currentMailbox.id, trashMailboxId, MoveAction.moveToTrash) currentMailbox.id,
trashMailboxId,
MoveAction.moving,
EmailActionType.moveToTrash)
); );
} }
} }
void _moveSelectedEmailMultipleToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { void _moveSelectedEmailMultipleToTrash(AccountId accountId, MoveToMailboxRequest moveRequest) {
cancelSelectEmail(); cancelSelectEmail();
consumeState(_moveMultipleEmailToTrashInteractor.execute(accountId, moveRequest)); consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest));
} }
void _moveSelectedMultipleEmailToTrashSuccess(Success success) { void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) {
mailboxDashBoardController.dispatchState(Right(success));
List<EmailId> movedEmailIds = [];
MailboxId? currentMailboxId;
MailboxId? trashMailboxId;
MoveAction? moveAction;
if (success is MoveMultipleEmailToTrashAllSuccess) {
movedEmailIds = success.movedListEmailId;
currentMailboxId = success.currentMailboxId;
trashMailboxId = success.trashMailboxId;
moveAction = success.moveAction;
} else if (success is MoveMultipleEmailToTrashHasSomeEmailFailure) {
movedEmailIds = success.movedListEmailId;
currentMailboxId = success.currentMailboxId;
trashMailboxId = success.trashMailboxId;
moveAction = success.moveAction;
}
if (currentContext != null && currentOverlayContext != null && moveAction == MoveAction.moveToTrash) {
_appToast.showToastWithAction(
currentOverlayContext!,
AppLocalizations.of(currentContext!).moved_to_trash,
AppLocalizations.of(currentContext!).undo_action,
() {
if (trashMailboxId != null && currentMailboxId != null) {
_revertedToOriginalMailbox(MoveRequest(movedEmailIds, trashMailboxId, currentMailboxId, MoveAction.undo));
}
}
);
}
_refreshEmailChanges();
}
void _revertedToOriginalMailbox(MoveRequest newMoveRequest) {
if (_accountId != null) { if (_accountId != null) {
consumeState(_moveMultipleEmailToMailboxInteractor.execute(_accountId!, newMoveRequest)); consumeState(_moveMultipleEmailToMailboxInteractor.execute(_accountId!, newMoveRequest));
} }
@@ -841,11 +795,11 @@ class ThreadController extends BaseController {
case EmailActionType.markAsUnread: case EmailActionType.markAsUnread:
markAsReadSelectedMultipleEmail(selectionEmail); markAsReadSelectedMultipleEmail(selectionEmail);
break; break;
case EmailActionType.markAsStar: case EmailActionType.markAsStarred:
case EmailActionType.markAsUnStar: case EmailActionType.unMarkAsStarred:
markAsStarSelectedMultipleEmail(selectionEmail); markAsStarSelectedMultipleEmail(selectionEmail);
break; break;
case EmailActionType.move: case EmailActionType.moveToMailbox:
moveSelectedMultipleEmailToMailboxAction(selectionEmail); moveSelectedMultipleEmailToMailboxAction(selectionEmail);
break; break;
case EmailActionType.moveToTrash: case EmailActionType.moveToTrash:
@@ -877,13 +831,13 @@ class ThreadController extends BaseController {
case EmailActionType.markAsUnread: case EmailActionType.markAsUnread:
markAsEmailRead(selectedEmail, ReadActions.markAsUnread); markAsEmailRead(selectedEmail, ReadActions.markAsUnread);
break; break;
case EmailActionType.markAsStar: case EmailActionType.markAsStarred:
markAsStarEmail(selectedEmail, MarkStarAction.markStar); markAsStarEmail(selectedEmail, MarkStarAction.markStar);
break; break;
case EmailActionType.markAsUnStar: case EmailActionType.unMarkAsStarred:
markAsStarEmail(selectedEmail, MarkStarAction.unMarkStar); markAsStarEmail(selectedEmail, MarkStarAction.unMarkStar);
break; break;
case EmailActionType.move: case EmailActionType.moveToMailbox:
moveToMailboxAction(context, selectedEmail); moveToMailboxAction(context, selectedEmail);
break; break;
case EmailActionType.moveToTrash: case EmailActionType.moveToTrash:
@@ -909,57 +863,58 @@ class ThreadController extends BaseController {
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.role == PresentationMailbox.roleTrash) { if (destinationMailbox.role == PresentationMailbox.roleTrash) {
_moveToTrash(accountId, MoveToTrashRequest( _moveToTrash(accountId, MoveToMailboxRequest(
[email.id], [email.id],
currentMailbox.id, currentMailbox.id,
destinationMailbox.id, destinationMailbox.id,
MoveAction.moveToTrash)); MoveAction.moving,
EmailActionType.moveToTrash));
} else { } else {
_moveToMailbox(accountId, MoveRequest( _moveToMailbox(accountId, MoveToMailboxRequest(
[email.id], [email.id],
currentMailbox.id, currentMailbox.id,
destinationMailbox.id, destinationMailbox.id,
MoveAction.moveTo, MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath)); destinationPath: destinationMailbox.mailboxPath));
} }
} }
} }
} }
void _moveToMailbox(AccountId accountId, MoveRequest moveRequest) { void _moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) {
consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest));
} }
void _moveToMailboxSuccess(Success success) { void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
mailboxDashBoardController.dispatchState(Right(success)); mailboxDashBoardController.dispatchState(Right(success));
if (success is MoveToMailboxSuccess if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) {
&& success.moveAction == MoveAction.moveTo
&& currentContext != null && currentOverlayContext != null) {
_appToast.showToastWithAction( _appToast.showToastWithAction(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).moved_to_mailbox(success.destinationPath ?? ''), AppLocalizations.of(currentContext!).moved_to_mailbox(success.destinationPath ?? ''),
AppLocalizations.of(currentContext!).undo_action, AppLocalizations.of(currentContext!).undo_action,
() { () {
final newMoveRequest = MoveRequest( final newMoveRequest = MoveToMailboxRequest(
[success.emailId], [success.emailId],
success.destinationMailboxId, success.destinationMailboxId,
success.currentMailboxId, success.currentMailboxId,
MoveAction.undo); MoveAction.undo,
success.emailActionType);
_undoMoveToMailbox(newMoveRequest); _undoMoveToMailbox(newMoveRequest);
} }
); );
} }
} }
void _undoMoveToMailbox(MoveRequest newMoveRequest) { void _undoMoveToMailbox(MoveToMailboxRequest newMoveRequest) {
if (_accountId != null) { if (_accountId != null) {
_moveToMailbox(_accountId!, newMoveRequest); _moveToMailbox(_accountId!, newMoveRequest);
} }
} }
void _moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { void _moveToTrash(AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToTrash(accountId, moveRequest); mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
} }
void moveToTrashAction(PresentationEmail email) async { void moveToTrashAction(PresentationEmail email) async {
@@ -968,11 +923,12 @@ class ThreadController extends BaseController {
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash]; final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash];
if (currentMailbox != null && accountId != null && trashMailboxId != null) { if (currentMailbox != null && accountId != null && trashMailboxId != null) {
_moveToTrash(accountId, MoveToTrashRequest( _moveToTrash(accountId, MoveToMailboxRequest(
[email.id], [email.id],
currentMailbox.id, currentMailbox.id,
trashMailboxId, trashMailboxId,
MoveAction.moveToTrash) MoveAction.moving,
EmailActionType.moveToTrash)
); );
} }
} }
@@ -211,12 +211,12 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
tooltip: controller.listEmailSelected.isAllEmailStarred ? AppLocalizations.of(context).not_starred : AppLocalizations.of(context).starred, tooltip: controller.listEmailSelected.isAllEmailStarred ? AppLocalizations.of(context).not_starred : AppLocalizations.of(context).starred,
onTap: () => controller.pressEmailSelectionAction( onTap: () => controller.pressEmailSelectionAction(
context, context,
controller.listEmailSelected.isAllEmailStarred ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, controller.listEmailSelected.isAllEmailStarred ? EmailActionType.markAsStarred : EmailActionType.unMarkAsStarred,
controller.listEmailSelected)), controller.listEmailSelected)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icMove, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icMove, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).move, tooltip: AppLocalizations.of(context).move,
onTap: () => controller.pressEmailSelectionAction(context, EmailActionType.move, controller.listEmailSelected)), onTap: () => controller.pressEmailSelectionAction(context, EmailActionType.moveToMailbox, controller.listEmailSelected)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDelete, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icDelete, fit: BoxFit.fill),
tooltip: controller.mailboxDashBoardController.selectedMailbox.value?.role != PresentationMailbox.roleTrash tooltip: controller.mailboxDashBoardController.selectedMailbox.value?.role != PresentationMailbox.roleTrash
@@ -1,153 +0,0 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnCloseActionClick = void Function();
typedef OnMarkAsEmailReadActionClick = void Function(List<PresentationEmail> listEmail);
typedef OnRemoveEmailActionClick = void Function(List<PresentationEmail> listEmail);
typedef OnOpenContextMenuActionClick = void Function(List<PresentationEmail> listEmail);
typedef OnOpenPopupMenuActionClick = void Function(List<PresentationEmail> listEmail, RelativeRect position);
class AppBarThreadSelectModeActiveBuilder {
OnCloseActionClick? _onCloseActionClick;
OnMarkAsEmailReadActionClick? _onMarkAsEmailReadActionClick;
// OnRemoveEmailActionClick? _onRemoveEmailActionClick;
OnOpenContextMenuActionClick? _onOpenContextMenuActionClick;
OnOpenPopupMenuActionClick? _onOpenPopupMenuActionClick;
final BuildContext _context;
final ImagePaths _imagePaths;
final List<PresentationEmail> _listEmail;
final ResponsiveUtils _responsiveUtils;
AppBarThreadSelectModeActiveBuilder(this._context, this._imagePaths, this._listEmail, this._responsiveUtils);
void addCloseActionClick(OnCloseActionClick onCloseActionClick) {
_onCloseActionClick = onCloseActionClick;
}
void addOnMarkAsEmailReadActionClick(OnMarkAsEmailReadActionClick onMarkAsEmailReadActionClick) {
_onMarkAsEmailReadActionClick = onMarkAsEmailReadActionClick;
}
// void addRemoveEmailActionClick(OnRemoveEmailActionClick onRemoveEmailActionClick) {
// _onRemoveEmailActionClick = onRemoveEmailActionClick;
// }
void addOpenContextMenuActionClick(OnOpenContextMenuActionClick onOpenContextMenuActionClick) {
_onOpenContextMenuActionClick = onOpenContextMenuActionClick;
}
void addOnOpenPopupMenuActionClick(OnOpenPopupMenuActionClick onOpenPopupMenuActionClick) {
_onOpenPopupMenuActionClick = onOpenPopupMenuActionClick;
}
Widget build() {
return Container(
key: Key('app_bar_thread_select_mode_active'),
alignment: Alignment.topCenter,
color: Colors.white,
margin: EdgeInsets.zero,
padding: EdgeInsets.only(left: 10, right: 16, top: 10, bottom: 10),
child: MediaQuery(
data: MediaQueryData(padding: EdgeInsets.zero),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.end,
children: [
_buildBackButton(),
Expanded(child: _buildCountItemSelected()),
_buildListOptionButton(),
]
)
)
);
}
Widget _buildCountItemSelected() {
return Padding(
padding: EdgeInsets.only(left: 12),
child: Text(
AppLocalizations.of(_context).count_email_selected(_listEmail.length),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 18, color: AppColor.nameUserColor, fontWeight: FontWeight.w500)));
}
Widget _buildBackButton() {
return Material(
borderRadius: BorderRadius.circular(12),
color: Colors.transparent,
child: IconButton(
color: AppColor.baseTextColor,
icon: SvgPicture.asset(_imagePaths.icComposerClose, color: AppColor.baseTextColor, fit: BoxFit.fill),
onPressed: () => {
if (_onCloseActionClick != null) {
_onCloseActionClick!()
}
}
));
}
Widget _buildListOptionButton() {
return Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// IconButton(
// key: Key('button_remove_email_selected'),
// color: AppColor.baseTextColor,
// icon: SvgPicture.asset(_imagePaths.icTrash, color: AppColor.baseTextColor, fit: BoxFit.fill),
// onPressed: () => {
// if (_onRemoveEmailActionClick != null) {
// _onRemoveEmailActionClick!(_listEmail)
// }
// }),
Material(
borderRadius: BorderRadius.circular(12),
color: Colors.transparent,
child: IconButton(
key: Key('button_unread_email_selected'),
color: AppColor.baseTextColor,
icon: SvgPicture.asset(_imagePaths.icEyeDisable, color: AppColor.baseTextColor, fit: BoxFit.fill),
onPressed: () => {
if (_onMarkAsEmailReadActionClick != null) {
_onMarkAsEmailReadActionClick!(_listEmail)
}
})),
GestureDetector(
key: Key('button_menu_select_email'),
onTap: () => {
if (_onOpenContextMenuActionClick != null && _responsiveUtils.isMobile(_context)) {
_onOpenContextMenuActionClick!(_listEmail)
}
},
child: Padding(
padding: EdgeInsets.all(8),
child: SvgPicture.asset(
_imagePaths.icComposerMenu,
color: AppColor.baseTextColor,
width: 24,
height: 24,
fit: BoxFit.fill),
),
onTapDown: (detail) {
if (_onOpenPopupMenuActionClick != null && !_responsiveUtils.isMobile(_context)) {
final screenSize = MediaQuery.of(_context).size;
final offset = detail.globalPosition;
final position = RelativeRect.fromLTRB(
offset.dx,
offset.dy,
screenSize.width - offset.dx,
screenSize.height - offset.dy,
);
_onOpenPopupMenuActionClick!(_listEmail, position);
}
})
]
);
}
}
@@ -107,12 +107,12 @@ class AppBarThreadWidgetBuilder {
icon: SvgPicture.asset(_listSelectionEmail.isAllEmailStarred ? _imagePaths.icUnStar : _imagePaths.icStar, fit: BoxFit.fill), icon: SvgPicture.asset(_listSelectionEmail.isAllEmailStarred ? _imagePaths.icUnStar : _imagePaths.icStar, fit: BoxFit.fill),
tooltip: _listSelectionEmail.isAllEmailStarred ? AppLocalizations.of(_context).not_starred : AppLocalizations.of(_context).starred, tooltip: _listSelectionEmail.isAllEmailStarred ? AppLocalizations.of(_context).not_starred : AppLocalizations.of(_context).starred,
onTap: () => _onEmailSelectionAction?.call( onTap: () => _onEmailSelectionAction?.call(
_listSelectionEmail.isAllEmailStarred ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, _listSelectionEmail.isAllEmailStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred,
_listSelectionEmail)), _listSelectionEmail)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icMove, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icMove, fit: BoxFit.fill),
tooltip: AppLocalizations.of(_context).move, tooltip: AppLocalizations.of(_context).move,
onTap: () => _onEmailSelectionAction?.call(EmailActionType.move, _listSelectionEmail)), onTap: () => _onEmailSelectionAction?.call(EmailActionType.moveToMailbox, _listSelectionEmail)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDelete, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icDelete, fit: BoxFit.fill),
tooltip: _presentationMailbox?.role != PresentationMailbox.roleTrash tooltip: _presentationMailbox?.role != PresentationMailbox.roleTrash
@@ -65,10 +65,10 @@ class BottomBarThreadSelectionWidget {
..onPressActionClick(() { ..onPressActionClick(() {
if (_onPressEmailSelectionActionClick != null) { if (_onPressEmailSelectionActionClick != null) {
_onPressEmailSelectionActionClick!( _onPressEmailSelectionActionClick!(
_listSelectionEmail.isAllEmailStarred ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, _listSelectionEmail.isAllEmailStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred,
_listSelectionEmail); _listSelectionEmail);
}}) }})
..text(_listSelectionEmail.isAllEmailStarred ? AppLocalizations.of(_context).mark_as_unstar : AppLocalizations.of(_context).mark_as_star, ..text(_listSelectionEmail.isAllEmailStarred ? AppLocalizations.of(_context).not_starred : AppLocalizations.of(_context).starred,
isVertical: _responsiveUtils.isMobile(_context))) isVertical: _responsiveUtils.isMobile(_context)))
.build()), .build()),
Expanded(child: (ButtonBuilder(_imagePaths.icMove) Expanded(child: (ButtonBuilder(_imagePaths.icMove)
@@ -77,7 +77,7 @@ class BottomBarThreadSelectionWidget {
..textStyle(TextStyle(fontSize: 12, color: AppColor.colorTextButton)) ..textStyle(TextStyle(fontSize: 12, color: AppColor.colorTextButton))
..onPressActionClick(() { ..onPressActionClick(() {
if (_onPressEmailSelectionActionClick != null) { if (_onPressEmailSelectionActionClick != null) {
_onPressEmailSelectionActionClick!(EmailActionType.move, _listSelectionEmail); _onPressEmailSelectionActionClick!(EmailActionType.moveToMailbox, _listSelectionEmail);
}}) }})
..text(AppLocalizations.of(_context).move, isVertical: _responsiveUtils.isMobile(_context))) ..text(AppLocalizations.of(_context).move, isVertical: _responsiveUtils.isMobile(_context)))
.build()), .build()),
@@ -80,7 +80,7 @@ class EmailTileBuilder {
), ),
title: Row( title: Row(
children: [ children: [
if (_presentationEmail.isUnReadEmail()) if (!_presentationEmail.hasRead)
Padding( Padding(
padding: EdgeInsets.only(right: 5), padding: EdgeInsets.only(right: 5),
child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)), child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)),
@@ -155,7 +155,7 @@ class EmailTileBuilder {
style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold), style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold),
) )
), ),
if (_presentationEmail.isFlaggedEmail() ) if (_presentationEmail.hasStarred)
(ButtonBuilder(_imagePaths.icStar) (ButtonBuilder(_imagePaths.icStar)
..paddingIcon(EdgeInsets.zero) ..paddingIcon(EdgeInsets.zero)
..size(15)) ..size(15))
@@ -199,18 +199,18 @@ class EmailTileBuilder {
Container( Container(
padding: EdgeInsets.only(left: 16, right: 16), padding: EdgeInsets.only(left: 16, right: 16),
alignment: Alignment.center, alignment: Alignment.center,
child: _presentationEmail.isUnReadEmail() child: !_presentationEmail.hasRead
? SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill) ? SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)
: SizedBox(width: 9)), : SizedBox(width: 9)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_presentationEmail.isFlaggedEmail() ? _imagePaths.icStar : _imagePaths.icUnStar, _presentationEmail.hasStarred ? _imagePaths.icStar : _imagePaths.icUnStar,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: _presentationEmail.isFlaggedEmail() ? AppLocalizations.of(_context).starred : AppLocalizations.of(_context).not_starred, tooltip: _presentationEmail.hasStarred ? AppLocalizations.of(_context).starred : AppLocalizations.of(_context).not_starred,
onTap: () => _emailActionClick?.call( onTap: () => _emailActionClick?.call(
_presentationEmail.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, _presentationEmail.hasStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred,
_presentationEmail)), _presentationEmail)),
if (_selectModeAll == SelectMode.INACTIVE) SizedBox(width: 8), if (_selectModeAll == SelectMode.INACTIVE) SizedBox(width: 8),
GestureDetector( GestureDetector(
@@ -108,7 +108,7 @@ class EmailTileBuilder {
child: _buildAvatarIcon(), child: _buildAvatarIcon(),
), ),
title: Row(children: [ title: Row(children: [
if (_presentationEmail.isUnReadEmail()) if (!_presentationEmail.hasRead)
Padding( Padding(
padding: EdgeInsets.only(right: 5), padding: EdgeInsets.only(right: 5),
child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)), child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)),
@@ -178,7 +178,7 @@ class EmailTileBuilder {
style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold), style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold),
) )
), ),
if (_presentationEmail.isFlaggedEmail() ) if (_presentationEmail.hasStarred)
(ButtonBuilder(_imagePaths.icStar) (ButtonBuilder(_imagePaths.icStar)
..paddingIcon(EdgeInsets.zero) ..paddingIcon(EdgeInsets.zero)
..size(15)) ..size(15))
@@ -230,7 +230,7 @@ class EmailTileBuilder {
Transform( Transform(
transform: Matrix4.translationValues(0.0, isHoverItem ? -10.0 : 0.0, 0.0), transform: Matrix4.translationValues(0.0, isHoverItem ? -10.0 : 0.0, 0.0),
child: Row(children: [ child: Row(children: [
if (_presentationEmail.isUnReadEmail()) if (!_presentationEmail.hasRead)
Padding( Padding(
padding: EdgeInsets.only(right: 5), padding: EdgeInsets.only(right: 5),
child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)), child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)),
@@ -287,7 +287,7 @@ class EmailTileBuilder {
style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold), style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold),
) )
), ),
if (_presentationEmail.isFlaggedEmail() ) if (_presentationEmail.hasStarred)
(ButtonBuilder(_imagePaths.icStar) (ButtonBuilder(_imagePaths.icStar)
..paddingIcon(EdgeInsets.zero) ..paddingIcon(EdgeInsets.zero)
..size(15)) ..size(15))
@@ -335,18 +335,18 @@ class EmailTileBuilder {
Container( Container(
padding: EdgeInsets.only(left: 16, right: 16), padding: EdgeInsets.only(left: 16, right: 16),
alignment: Alignment.center, alignment: Alignment.center,
child: _presentationEmail.isUnReadEmail() child: !_presentationEmail.hasRead
? SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill) ? SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)
: SizedBox(width: 9)), : SizedBox(width: 9)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_presentationEmail.isFlaggedEmail() ? _imagePaths.icStar : _imagePaths.icUnStar, _presentationEmail.hasStarred ? _imagePaths.icStar : _imagePaths.icUnStar,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: _presentationEmail.isFlaggedEmail() ? AppLocalizations.of(_context).starred : AppLocalizations.of(_context).not_starred, tooltip: _presentationEmail.hasStarred ? AppLocalizations.of(_context).starred : AppLocalizations.of(_context).not_starred,
onTap: () => _emailActionClick?.call( onTap: () => _emailActionClick?.call(
_presentationEmail.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, _presentationEmail.hasStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred,
_presentationEmail)), _presentationEmail)),
if (_selectModeAll == SelectMode.INACTIVE) SizedBox(width: 8), if (_selectModeAll == SelectMode.INACTIVE) SizedBox(width: 8),
GestureDetector( GestureDetector(
@@ -396,15 +396,15 @@ class EmailTileBuilder {
return Row(children: [ return Row(children: [
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_presentationEmail.isReadEmail() ? _imagePaths.icRead : _imagePaths.icUnread, _presentationEmail.hasRead ? _imagePaths.icRead : _imagePaths.icUnread,
color: AppColor.colorActionButtonHover, color: AppColor.colorActionButtonHover,
width: _responsiveUtils.isDesktop(_context) ? 16 : 14, width: _responsiveUtils.isDesktop(_context) ? 16 : 14,
height: _responsiveUtils.isDesktop(_context) ? 16 : 14, height: _responsiveUtils.isDesktop(_context) ? 16 : 14,
fit: BoxFit.fill), fit: BoxFit.fill),
splashRadius: _responsiveUtils.isDesktop(_context) ? 15 : 10, splashRadius: _responsiveUtils.isDesktop(_context) ? 15 : 10,
tooltip: _presentationEmail.isReadEmail() ? AppLocalizations.of(_context).mark_as_unread : AppLocalizations.of(_context).mark_as_read, tooltip: _presentationEmail.hasRead ? AppLocalizations.of(_context).mark_as_unread : AppLocalizations.of(_context).mark_as_read,
onTap: () => _emailActionClick?.call( onTap: () => _emailActionClick?.call(
_presentationEmail.isReadEmail() ? EmailActionType.markAsUnread : EmailActionType.markAsRead, _presentationEmail.hasRead ? EmailActionType.markAsUnread : EmailActionType.markAsRead,
_presentationEmail)), _presentationEmail)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
@@ -415,7 +415,7 @@ class EmailTileBuilder {
fit: BoxFit.fill), fit: BoxFit.fill),
splashRadius: _responsiveUtils.isDesktop(_context) ? 15 : 10, splashRadius: _responsiveUtils.isDesktop(_context) ? 15 : 10,
tooltip: AppLocalizations.of(_context).move, tooltip: AppLocalizations.of(_context).move,
onTap: () => _emailActionClick?.call(EmailActionType.move, _presentationEmail)), onTap: () => _emailActionClick?.call(EmailActionType.moveToMailbox, _presentationEmail)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icDelete, _imagePaths.icDelete,
+3 -9
View File
@@ -1,5 +1,5 @@
{ {
"@@last_modified": "2022-04-14T15:13:36.565629", "@@last_modified": "2022-04-15T15:46:44.683811",
"initializing_data": "Initializing data...", "initializing_data": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",
@@ -214,8 +214,8 @@
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
}, },
"mark_as_star": "Star", "mark_as_starred": "Mark as starred",
"@mark_as_star": { "@mark_as_starred": {
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
@@ -354,12 +354,6 @@
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
}, },
"mark_as_unstar": "Unstar",
"@mark_as_unstar": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"marked_star_multiple_item": "Marked star {count} item", "marked_star_multiple_item": "Marked star {count} item",
"@marked_star_multiple_item": { "@marked_star_multiple_item": {
"type": "text", "type": "text",
+3 -10
View File
@@ -243,10 +243,10 @@ class AppLocalizations {
); );
} }
String get mark_as_star { String get mark_as_starred {
return Intl.message( return Intl.message(
'Star', 'Mark as starred',
name: 'mark_as_star', name: 'mark_as_starred',
); );
} }
@@ -388,13 +388,6 @@ class AppLocalizations {
); );
} }
String get mark_as_unstar {
return Intl.message(
'Unstar',
name: 'mark_as_unstar',
);
}
String marked_star_multiple_item(int count) { String marked_star_multiple_item(int count) {
return Intl.message( return Intl.message(
'Marked star $count item', 'Marked star $count item',
+3 -3
View File
@@ -6,9 +6,9 @@ enum EmailActionType {
compose, compose,
markAsRead, markAsRead,
markAsUnread, markAsUnread,
markAsStar, markAsStarred,
markAsUnStar, unMarkAsStarred,
move, moveToMailbox,
edit, edit,
composeFromEmailAddress, composeFromEmailAddress,
moveToTrash, moveToTrash,
+4 -4
View File
@@ -17,11 +17,11 @@ extension FilterMessageOptionExtension on FilterMessageOption {
case FilterMessageOption.all: case FilterMessageOption.all:
return true; return true;
case FilterMessageOption.unread: case FilterMessageOption.unread:
return email.isUnReadEmail(); return !email.hasRead;
case FilterMessageOption.attachments: case FilterMessageOption.attachments:
return email.withAttachments; return email.withAttachments;
case FilterMessageOption.starred: case FilterMessageOption.starred:
return email.isFlaggedEmail(); return email.hasStarred;
} }
} }
@@ -30,11 +30,11 @@ extension FilterMessageOptionExtension on FilterMessageOption {
case FilterMessageOption.all: case FilterMessageOption.all:
return true; return true;
case FilterMessageOption.unread: case FilterMessageOption.unread:
return email.isUnReadEmail(); return !email.hasRead;
case FilterMessageOption.attachments: case FilterMessageOption.attachments:
return email.withAttachments; return email.withAttachments;
case FilterMessageOption.starred: case FilterMessageOption.starred:
return email.isFlaggedEmail(); return email.hasStarred;
} }
} }
} }
+2 -4
View File
@@ -80,11 +80,9 @@ class PresentationEmail with EquatableMixin {
String getPartialContent() => preview ?? ''; String getPartialContent() => preview ?? '';
bool isUnReadEmail() => !(keywords?.containsKey(KeyWordIdentifier.emailSeen) == true); bool get hasRead => keywords?.containsKey(KeyWordIdentifier.emailSeen) == true;
bool isReadEmail() => keywords?.containsKey(KeyWordIdentifier.emailSeen) == true; bool get hasStarred => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true;
bool isFlaggedEmail() => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true;
bool get withAttachments => hasAttachment == true; bool get withAttachments => hasAttachment == true;
+2 -4
View File
@@ -8,11 +8,9 @@ import 'package:model/model.dart';
extension EmailExtension on Email { extension EmailExtension on Email {
bool isUnReadEmail() => !(keywords?.containsKey(KeyWordIdentifier.emailSeen) == true); bool get hasRead => keywords?.containsKey(KeyWordIdentifier.emailSeen) == true;
bool isReadEmail() => keywords?.containsKey(KeyWordIdentifier.emailSeen) == true; bool get hasStarred => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true;
bool isFlaggedEmail() => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true;
bool get withAttachments => hasAttachment == true; bool get withAttachments => hasAttachment == true;
@@ -32,4 +32,12 @@ extension ListEmailIdExtension on List<EmailId> {
}); });
return maps; return maps;
} }
Map<Id, PatchObject> generateMapUpdateObjectMarkAsSpam(MailboxId spamMailboxId) {
final Map<Id, PatchObject> maps = {};
forEach((emailId) {
maps[emailId.id] = spamMailboxId.generateActionPath();
});
return maps;
}
} }
@@ -3,11 +3,11 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
extension ListPresentationEmailExtension on List<PresentationEmail> { extension ListPresentationEmailExtension on List<PresentationEmail> {
bool get isAllEmailRead => every((email) => email.isReadEmail()); bool get isAllEmailRead => every((email) => email.hasRead);
bool get isAllEmailStarred => every((email) => email.isFlaggedEmail()); bool get isAllEmailStarred => every((email) => email.hasStarred);
List<PresentationEmail> get allEmailUnread => where((email) => email.isUnReadEmail()).toList(); List<PresentationEmail> get allEmailUnread => where((email) => !email.hasRead).toList();
PresentationEmail? findEmail(EmailId emailId) { PresentationEmail? findEmail(EmailId emailId) {
try { try {
@@ -12,4 +12,10 @@ extension MailboxIdExtension on MailboxId {
destinationMailboxId.generatePath(): true destinationMailboxId.generatePath(): true
}); });
} }
PatchObject generateActionPath() {
return PatchObject({
generatePath(): true,
});
}
} }
@@ -11,6 +11,7 @@ class PresentationMailbox with EquatableMixin {
static final roleTemplates = Role('templates'); static final roleTemplates = Role('templates');
static final roleOutbox = Role('outbox'); static final roleOutbox = Role('outbox');
static final roleDrafts = Role('drafts'); static final roleDrafts = Role('drafts');
static final roleSpam = Role('spam');
final MailboxId id; final MailboxId id;
final MailboxName? name; final MailboxName? name;
@@ -56,6 +57,8 @@ class PresentationMailbox with EquatableMixin {
return unreadEmails!.value.value <= 999 ? '${unreadEmails!.value.value}' : '999+'; return unreadEmails!.value.value <= 999 ? '${unreadEmails!.value.value}' : '999+';
} }
bool get isSpam => role == roleSpam;
@override @override
List<Object?> get props => [ List<Object?> get props => [
id, id,
-1
View File
@@ -25,7 +25,6 @@ export 'email/presentation_email_address.dart';
export 'email/email_address_cache.dart'; export 'email/email_address_cache.dart';
export 'email/read_actions.dart'; export 'email/read_actions.dart';
export 'email/attachment.dart'; export 'email/attachment.dart';
export 'email/move_action.dart';
export 'email/mark_star_action.dart'; export 'email/mark_star_action.dart';
export 'email/email_property.dart'; export 'email/email_property.dart';
export 'email/email_filter.dart'; export 'email/email_filter.dart';