TF-3334 Skip getting stored state in interactor when performing actions with email and mailbox

This commit is contained in:
dab246
2024-12-23 16:10:36 +07:00
committed by Dat H. Pham
parent ba93e7b514
commit 01b320ce89
52 changed files with 138 additions and 602 deletions
@@ -1,22 +1,14 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class SaveEmailAsDraftsLoading extends LoadingState {}
class SaveEmailAsDraftsSuccess extends UIActionState {
class SaveEmailAsDraftsSuccess extends UIState {
final EmailId emailId;
SaveEmailAsDraftsSuccess(
this.emailId,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
SaveEmailAsDraftsSuccess(this.emailId);
@override
List<Object?> get props => [emailId, ...super.props];
@@ -2,27 +2,22 @@ import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
class SendEmailLoading extends LoadingState {}
class SendEmailSuccess extends UIActionState {
class SendEmailSuccess extends UIState {
final EmailRequest emailRequest;
SendEmailSuccess({
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
required this.emailRequest,
}) : super(currentEmailState, currentMailboxState);
});
@override
List<Object?> get props => [
...super.props,
emailRequest,
];
}
@@ -1,22 +1,14 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class UpdatingEmailDrafts extends LoadingState {}
class UpdateEmailDraftsSuccess extends UIActionState {
class UpdateEmailDraftsSuccess extends UIState {
final EmailId emailId;
UpdateEmailDraftsSuccess(
this.emailId,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
UpdateEmailDraftsSuccess(this.emailId);
@override
List<Object?> get props => [emailId, ...super.props];
@@ -3,9 +3,6 @@ import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart';
import 'package:dartz/dartz.dart' as dartz;
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/composer/domain/exceptions/compose_email_exception.dart';
import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart';
@@ -15,17 +12,14 @@ import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
class CreateNewAndSaveEmailToDraftsInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
final ComposerRepository _composerRepository;
CreateNewAndSaveEmailToDraftsInteractor(
this._emailRepository,
this._mailboxRepository,
this._composerRepository,
);
@@ -36,11 +30,6 @@ class CreateNewAndSaveEmailToDraftsInteractor {
try {
yield dartz.Right<Failure, Success>(GenerateEmailLoading());
final listCurrentState = await _getStoredCurrentState(
session: createEmailRequest.session,
accountId: createEmailRequest.accountId
);
final emailCreated = await _createEmailObject(createEmailRequest);
if (emailCreated != null) {
@@ -55,11 +44,7 @@ class CreateNewAndSaveEmailToDraftsInteractor {
);
yield dartz.Right<Failure, Success>(
SaveEmailAsDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
SaveEmailAsDraftsSuccess(emailDraftSaved.id!)
);
} else {
yield dartz.Right<Failure, Success>(UpdatingEmailDrafts());
@@ -73,11 +58,7 @@ class CreateNewAndSaveEmailToDraftsInteractor {
);
yield dartz.Right<Failure, Success>(
UpdateEmailDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
UpdateEmailDraftsSuccess(emailDraftSaved.id!)
);
}
} else {
@@ -112,24 +93,4 @@ class CreateNewAndSaveEmailToDraftsInteractor {
return null;
}
}
Future<dartz.Tuple2<State?, State?>?> _getStoredCurrentState({
required Session session,
required AccountId accountId
}) async {
try {
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
]);
final mailboxState = listState.first;
final emailState = listState.last;
return dartz.Tuple2(mailboxState, emailState);
} catch (e) {
logError('CreateNewAndSaveEmailToDraftsInteractor::_getStoredCurrentState: Exception: $e');
return null;
}
}
}
@@ -5,7 +5,6 @@ import 'package:dartz/dartz.dart' as dartz;
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/composer/domain/exceptions/compose_email_exception.dart';
import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart';
@@ -15,18 +14,15 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/create_e
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
class CreateNewAndSendEmailInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
final ComposerRepository _composerRepository;
CreateNewAndSendEmailInteractor(
this._emailRepository,
this._mailboxRepository,
this._composerRepository,
);
@@ -38,11 +34,6 @@ class CreateNewAndSendEmailInteractor {
try {
yield dartz.Right<Failure, Success>(GenerateEmailLoading());
final listCurrentState = await _getStoredCurrentState(
session: createEmailRequest.session,
accountId: createEmailRequest.accountId
);
sendingEmailArguments = await _createEmailObject(createEmailRequest);
if (sendingEmailArguments != null) {
@@ -67,8 +58,6 @@ class CreateNewAndSendEmailInteractor {
yield dartz.Right<Failure, Success>(
SendEmailSuccess(
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2,
emailRequest: sendingEmailArguments.emailRequest
)
);
@@ -108,26 +97,6 @@ class CreateNewAndSendEmailInteractor {
}
}
Future<dartz.Tuple2<State?, State?>?> _getStoredCurrentState({
required Session session,
required AccountId accountId
}) async {
try {
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
]);
final mailboxState = listState.first;
final emailState = listState.last;
return dartz.Tuple2(mailboxState, emailState);
} catch (e) {
logError('CreateNewAndSendEmailInteractor::_getStoredCurrentState: Exception: $e');
return null;
}
}
Future<void> _deleteOldDraftsEmail({
required Session session,
required AccountId accountId,
@@ -7,16 +7,12 @@ import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
class SendEmailInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
SendEmailInteractor(
this._emailRepository,
this._mailboxRepository);
SendEmailInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(
Session session,
@@ -30,14 +26,6 @@ class SendEmailInteractor {
try {
yield Right<Failure, Success>(SendEmailLoading());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
await _emailRepository.sendEmail(
session,
accountId,
@@ -50,11 +38,7 @@ class SendEmailInteractor {
}
yield Right<Failure, Success>(
SendEmailSuccess(
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState,
emailRequest: emailRequest
)
SendEmailSuccess(emailRequest: emailRequest)
);
} catch (e) {
yield Left<Failure, Success>(SendEmailFailure(
@@ -206,12 +206,10 @@ class ComposerBindings extends BaseBindings {
Get.lazyPut(() => GetAlwaysReadReceiptSettingInteractor(Get.find<ServerSettingsRepository>()));
Get.lazyPut(() => CreateNewAndSendEmailInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>(),
Get.find<ComposerRepository>(),
));
Get.lazyPut(() => CreateNewAndSaveEmailToDraftsInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>(),
Get.find<ComposerRepository>(),
));
Get.lazyPut(() => RestoreEmailInlineImagesInteractor(
@@ -21,6 +21,10 @@ class MoveToMailboxRequest with EquatableMixin {
this.destinationPath,
});
int get totalEmails => currentMailboxes
.values
.fold(0, (sum, element) => sum + element.length);
@override
List<Object?> get props => [
currentMailboxes,
@@ -1,17 +1,9 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class StartDeleteEmailPermanently extends UIState {}
class DeleteEmailPermanentlySuccess extends UIActionState {
DeleteEmailPermanentlySuccess({
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}) : super(currentEmailState, currentMailboxState);
}
class DeleteEmailPermanentlySuccess extends UIState {}
class DeleteEmailPermanentlyFailure extends FeatureFailure {
@@ -1,41 +1,27 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class LoadingDeleteMultipleEmailsPermanentlyAll extends UIState {}
class DeleteMultipleEmailsPermanentlyAllSuccess extends UIActionState {
class DeleteMultipleEmailsPermanentlyAllSuccess extends UIState {
List<EmailId> emailIds;
DeleteMultipleEmailsPermanentlyAllSuccess(
this.emailIds,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
DeleteMultipleEmailsPermanentlyAllSuccess(this.emailIds);
@override
List<Object?> get props => [emailIds, ...super.props];
List<Object?> get props => [emailIds];
}
class DeleteMultipleEmailsPermanentlyHasSomeEmailFailure extends UIActionState {
class DeleteMultipleEmailsPermanentlyHasSomeEmailFailure extends UIState {
List<EmailId> emailIds;
DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(
this.emailIds,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(this.emailIds);
@override
List<Object?> get props => [emailIds, ...super.props];
List<Object?> get props => [emailIds];
}
class DeleteMultipleEmailsPermanentlyAllFailure extends FeatureFailure {}
@@ -1,12 +1,10 @@
import 'package:core/presentation/state/failure.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/email/read_actions.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
class MarkAsEmailReadSuccess extends UIActionState {
class MarkAsEmailReadSuccess extends UIState {
final EmailId emailId;
final ReadActions readActions;
final MarkReadAction markReadAction;
@@ -15,14 +13,10 @@ class MarkAsEmailReadSuccess extends UIActionState {
this.emailId,
this.readActions,
this.markReadAction,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [emailId, readActions, markReadAction, ...super.props];
List<Object?> get props => [emailId, readActions, markReadAction];
}
class MarkAsEmailReadFailure extends FeatureFailure {
@@ -1,21 +1,14 @@
import 'package:core/presentation/state/failure.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:core/presentation/state/success.dart';
import 'package:model/email/mark_star_action.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class MarkAsStarEmailSuccess extends UIActionState {
class MarkAsStarEmailSuccess extends UIState {
final MarkStarAction markStarAction;
MarkAsStarEmailSuccess(
this.markStarAction,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
MarkAsStarEmailSuccess(this.markStarAction);
@override
List<Object?> get props => [markStarAction, ...super.props];
List<Object?> get props => [markStarAction];
}
class MarkAsStarEmailFailure extends FeatureFailure {
@@ -1,15 +1,13 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
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';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
class LoadingMoveToMailbox extends UIState {}
class MoveToMailboxSuccess extends UIActionState {
class MoveToMailboxSuccess extends UIState {
final EmailId emailId;
final MailboxId currentMailboxId;
final MailboxId destinationMailboxId;
@@ -25,10 +23,8 @@ class MoveToMailboxSuccess extends UIActionState {
this.emailActionType,
{
this.destinationPath,
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [
@@ -38,7 +34,6 @@ class MoveToMailboxSuccess extends UIActionState {
moveAction,
emailActionType,
destinationPath,
...super.props
];
}
@@ -1,23 +1,16 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class RestoreDeletedMessageLoading extends LoadingState {}
class RestoreDeletedMessageSuccess extends UIActionState {
class RestoreDeletedMessageSuccess extends UIState {
final EmailRecoveryAction emailRecoveryAction;
RestoreDeletedMessageSuccess(
this.emailRecoveryAction,
{
jmap.State? currentMailboxState,
}
) : super(null, currentMailboxState);
RestoreDeletedMessageSuccess(this.emailRecoveryAction);
@override
List<Object?> get props => [emailRecoveryAction, ...super.props];
List<Object?> get props => [emailRecoveryAction];
}
class RestoreDeletedMessageFailure extends FeatureFailure {
@@ -1,27 +1,17 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
class StoreEventAttendanceStatusLoading extends LoadingState {}
class StoreEventAttendanceStatusSuccess extends UIActionState {
class StoreEventAttendanceStatusSuccess extends UIState {
final EventActionType eventActionType;
StoreEventAttendanceStatusSuccess(
this.eventActionType,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
StoreEventAttendanceStatusSuccess(this.eventActionType);
@override
List<Object?> get props => [
eventActionType,
...super.props];
List<Object?> get props => [eventActionType];
}
class StoreEventAttendanceStatusFailure extends FeatureFailure {
@@ -1,18 +1,9 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class UnsubscribeEmailLoading extends LoadingState {}
class UnsubscribeEmailSuccess extends UIActionState {
UnsubscribeEmailSuccess(
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
}
class UnsubscribeEmailSuccess extends UIState {}
class UnsubscribeEmailFailure extends FeatureFailure {
@@ -1,35 +1,23 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
class DeleteEmailPermanentlyInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
DeleteEmailPermanentlyInteractor(this._emailRepository, this._mailboxRepository);
DeleteEmailPermanentlyInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* {
try {
yield Right<Failure, Success>(StartDeleteEmailPermanently());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final result = await _emailRepository.deleteEmailPermanently(session, accountId, emailId);
if (result) {
yield Right<Failure, Success>(DeleteEmailPermanentlySuccess(
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
yield Right<Failure, Success>(DeleteEmailPermanentlySuccess());
} else {
yield Left<Failure, Success>(DeleteEmailPermanentlyFailure(null));
}
@@ -1,41 +1,25 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
class DeleteMultipleEmailsPermanentlyInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
DeleteMultipleEmailsPermanentlyInteractor(this._emailRepository, this._mailboxRepository);
DeleteMultipleEmailsPermanentlyInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, List<EmailId> emailIds) async* {
try {
yield Right<Failure, Success>(LoadingDeleteMultipleEmailsPermanentlyAll());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final listResult = await _emailRepository.deleteMultipleEmailsPermanently(session, accountId, emailIds);
if (listResult.length == emailIds.length) {
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyAllSuccess(
listResult,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyAllSuccess(listResult));
} else if (listResult.isNotEmpty) {
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(
listResult,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(listResult));
} else {
yield Left<Failure, Success>(DeleteMultipleEmailsPermanentlyAllFailure());
}
@@ -8,13 +8,11 @@ import 'package:model/email/read_actions.dart';
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
class MarkAsEmailReadInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
MarkAsEmailReadInteractor(this._emailRepository, this._mailboxRepository);
MarkAsEmailReadInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(
Session session,
@@ -24,14 +22,6 @@ class MarkAsEmailReadInteractor {
MarkReadAction markReadAction,
) async* {
try {
final listState = await Future.wait([
_mailboxRepository.getMailboxState( session,accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final result = await _emailRepository.markAsRead(
session,
accountId,
@@ -43,8 +33,6 @@ class MarkAsEmailReadInteractor {
result.first,
readAction,
markReadAction,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState,
));
} catch (e) {
yield Left(MarkAsEmailReadFailure(readAction, exception: e));
@@ -20,17 +20,13 @@ class MarkAsStarEmailInteractor {
MarkStarAction markStarAction,
) async* {
try {
final currentEmailState = await emailRepository.getEmailState(session, accountId);
await emailRepository.markAsStar(
session,
accountId,
[emailId],
markStarAction,
);
yield Right(MarkAsStarEmailSuccess(
markStarAction,
currentEmailState: currentEmailState,
));
yield Right(MarkAsStarEmailSuccess(markStarAction));
} catch (e) {
yield Left(MarkAsStarEmailFailure(markStarAction, exception: e));
}
@@ -1,30 +1,20 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.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/state/move_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
class MoveToMailboxInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
MoveToMailboxInteractor(this._emailRepository, this._mailboxRepository);
MoveToMailboxInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) async* {
try {
yield Right(LoadingMoveToMailbox());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest);
if (result.isNotEmpty) {
yield Right(MoveToMailboxSuccess(
@@ -34,8 +24,7 @@ class MoveToMailboxInteractor {
moveRequest.moveAction,
moveRequest.emailActionType,
destinationPath: moveRequest.destinationPath,
currentMailboxState: currentMailboxState,
currentEmailState: currentEmailState));
));
} else {
yield Left(MoveToMailboxFailure(moveRequest.emailActionType));
}
@@ -8,13 +8,11 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/restore_deleted_message_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
class RestoredDeletedMessageInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
RestoredDeletedMessageInteractor(this._emailRepository, this._mailboxRepository);
RestoredDeletedMessageInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(
Session session,
@@ -23,9 +21,8 @@ class RestoredDeletedMessageInteractor {
) async* {
try {
yield Right<Failure, Success>(RestoreDeletedMessageLoading());
final currentMailboxState = await _mailboxRepository.getMailboxState(session, accountId);
final emailRecovery = await _emailRepository.restoreDeletedMessage(newRecoveryRequest);
yield Right<Failure, Success>(RestoreDeletedMessageSuccess(emailRecovery, currentMailboxState: currentMailboxState));
yield Right<Failure, Success>(RestoreDeletedMessageSuccess(emailRecovery));
} catch (e) {
yield Left<Failure, Success>(RestoreDeletedMessageFailure(e));
}
@@ -22,17 +22,13 @@ class StoreEventAttendanceStatusInteractor {
try {
yield Right(StoreEventAttendanceStatusLoading());
final currentEmailState = await _emailRepository.getEmailState(session, accountId);
await _emailRepository.storeEventAttendanceStatus(
session,
accountId,
emailId,
eventActionType);
yield Right(StoreEventAttendanceStatusSuccess(
eventActionType,
currentEmailState: currentEmailState));
yield Right(StoreEventAttendanceStatusSuccess(eventActionType));
} catch (e) {
yield Left(StoreEventAttendanceStatusFailure(exception: e));
}
@@ -15,9 +15,8 @@ class UnsubscribeEmailInteractor {
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* {
try {
yield Right(UnsubscribeEmailLoading());
final currentEmailState = await emailRepository.getEmailState(session, accountId);
await emailRepository.unsubscribeMail(session, accountId, emailId);
yield Right(UnsubscribeEmailSuccess(currentEmailState: currentEmailState));
yield Right(UnsubscribeEmailSuccess());
} catch (e) {
yield Left(UnsubscribeEmailFailure(exception: e));
}
@@ -123,9 +123,7 @@ class EmailBindings extends BaseBindings {
@override
void bindingsInteractor() {
Get.lazyPut(() => GetEmailContentInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MarkAsEmailReadInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()));
Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => DownloadAttachmentsInteractor(
Get.find<EmailRepository>(),
Get.find<CredentialRepository>(),
@@ -139,9 +137,7 @@ class EmailBindings extends BaseBindings {
Get.find<AccountRepository>(),
Get.find<AuthenticationOIDCRepository>(),
));
Get.lazyPut(() => MoveToMailboxInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()));
Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MarkAsStarEmailInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => DownloadAttachmentForWebInteractor(
Get.find<EmailRepository>(),
@@ -39,7 +39,7 @@ class MarkAsMailboxReadAllSuccess extends UIActionState {
];
}
class MarkAsMailboxReadHasSomeEmailFailure extends UIActionState {
class MarkAsMailboxReadHasSomeEmailFailure extends UIState {
final String mailboxDisplayName;
final int countEmailsRead;
@@ -47,17 +47,12 @@ class MarkAsMailboxReadHasSomeEmailFailure extends UIActionState {
MarkAsMailboxReadHasSomeEmailFailure(
this.mailboxDisplayName,
this.countEmailsRead,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentMailboxState, currentEmailState);
);
@override
List<Object?> get props => [
mailboxDisplayName,
countEmailsRead,
...super.props
];
}
@@ -1,13 +1,11 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class LoadingMoveMailbox extends UIState {}
class MoveMailboxSuccess extends UIActionState {
class MoveMailboxSuccess extends UIState {
final MailboxId mailboxIdSelected;
final MoveAction moveAction;
@@ -22,10 +20,8 @@ class MoveMailboxSuccess extends UIActionState {
this.parentId,
this.destinationMailboxId,
this.destinationMailboxDisplayName,
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [
@@ -34,7 +30,6 @@ class MoveMailboxSuccess extends UIActionState {
parentId,
destinationMailboxId,
destinationMailboxDisplayName,
...super.props
];
}
@@ -1,17 +1,9 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class LoadingRenameMailbox extends UIState {}
class RenameMailboxSuccess extends UIActionState {
RenameMailboxSuccess({
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}) : super(currentEmailState, currentMailboxState);
}
class RenameMailboxSuccess extends UIState {}
class RenameMailboxFailure extends FeatureFailure {
@@ -1,19 +1,18 @@
import 'dart:async';
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
class MarkAsMailboxReadInteractor {
final MailboxRepository _mailboxRepository;
final EmailRepository _emailRepository;
MarkAsMailboxReadInteractor(this._mailboxRepository, this._emailRepository);
MarkAsMailboxReadInteractor(this._mailboxRepository);
Stream<Either<Failure, Success>> execute(
Session session,
@@ -27,14 +26,6 @@ class MarkAsMailboxReadInteractor {
yield Right<Failure, Success>(MarkAsMailboxReadLoading());
onProgressController.add(Right(MarkAsMailboxReadLoading()));
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final listEmails = await _mailboxRepository.markAsMailboxRead(
session,
accountId,
@@ -43,16 +34,12 @@ class MarkAsMailboxReadInteractor {
onProgressController);
if (totalEmailUnread == listEmails.length) {
yield Right(MarkAsMailboxReadAllSuccess(
mailboxDisplayName,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
yield Right(MarkAsMailboxReadAllSuccess(mailboxDisplayName));
} else if (listEmails.isNotEmpty) {
yield Right(MarkAsMailboxReadHasSomeEmailFailure(
mailboxDisplayName,
listEmails.length,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
));
} else {
yield Left(MarkAsMailboxReadAllFailure(mailboxDisplayName: mailboxDisplayName));
}
@@ -1,4 +1,5 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
@@ -14,8 +15,6 @@ class MoveMailboxInteractor {
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, MoveMailboxRequest request) async* {
try {
yield Right<Failure, Success>(LoadingMoveMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState(session, accountId);
final result = await _mailboxRepository.moveMailbox(session, accountId, request);
if (result) {
yield Right<Failure, Success>(MoveMailboxSuccess(
@@ -24,7 +23,7 @@ class MoveMailboxInteractor {
parentId: request.parentId,
destinationMailboxId: request.destinationMailboxId,
destinationMailboxDisplayName: request.destinationMailboxDisplayName,
currentMailboxState: currentMailboxState));
));
} else {
yield Left<Failure, Success>(MoveMailboxFailure(null));
}
@@ -1,4 +1,5 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
@@ -15,17 +16,13 @@ class RenameMailboxInteractor {
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, RenameMailboxRequest request) async* {
try {
yield Right<Failure, Success>(LoadingRenameMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState(session, accountId);
log('RenameMailboxInteractor::execute:currentMailboxState: $currentMailboxState');
final result = await _mailboxRepository.renameMailbox(session, accountId, request);
if (result) {
yield Right<Failure, Success>(RenameMailboxSuccess(currentMailboxState: currentMailboxState));
yield Right<Failure, Success>(RenameMailboxSuccess());
} else {
yield Left<Failure, Success>(RenameMailboxFailure(null));
}
} catch (e) {
logError('RenameMailboxInteractor::execute(): error: $e');
final exception = SetMailboxNameException.detectMailboxNameException(e, request.mailboxId);
yield Left<Failure, Success>(RenameMailboxFailure(exception));
}
@@ -1,14 +1,7 @@
import 'package:core/presentation/state/failure.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:core/presentation/state/success.dart';
class RemoveEmailDraftsSuccess extends UIActionState {
RemoveEmailDraftsSuccess({
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}) : super(currentEmailState, currentMailboxState);
}
class RemoveEmailDraftsSuccess extends UIState {}
class RemoveEmailDraftsFailure extends FeatureFailure {
@@ -1,33 +1,22 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
class RemoveEmailDraftsInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
RemoveEmailDraftsInteractor(this._emailRepository, this._mailboxRepository);
RemoveEmailDraftsInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* {
try {
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final result = await _emailRepository.removeEmailDrafts(session, accountId, emailId);
if (result) {
yield Right<Failure, Success>(RemoveEmailDraftsSuccess(
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
yield Right<Failure, Success>(RemoveEmailDraftsSuccess());
} else {
yield Left<Failure, Success>(RemoveEmailDraftsFailure(result));
}
@@ -275,53 +275,30 @@ class MailboxDashBoardBindings extends BaseBindings {
@override
void bindingsInteractor() {
Get.lazyPut(() => RemoveEmailDraftsInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()));
Get.lazyPut(() => MoveToMailboxInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()));
Get.lazyPut(() => DeleteEmailPermanentlyInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()));
Get.lazyPut(() => RemoveEmailDraftsInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => DeleteEmailPermanentlyInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => SaveRecentSearchInteractor(Get.find<SearchRepository>()));
Get.lazyPut(() => GetAllRecentSearchLatestInteractor(Get.find<SearchRepository>()));
Get.lazyPut(() => SearchEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => SearchMoreEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => RefreshChangesSearchEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => QuickSearchEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => MarkAsMailboxReadInteractor(
Get.find<MailboxRepository>(),
Get.find<EmailRepository>())
);
Get.lazyPut(() => MarkAsMailboxReadInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => GetComposerCacheOnWebInteractor(Get.find<ComposerCacheRepository>()));
Get.lazyPut(() => RemoveComposerCacheOnWebInteractor(Get.find<ComposerCacheRepository>()));
Get.lazyPut(() => MarkAsEmailReadInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()
));
Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MarkAsStarEmailInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MarkAsMultipleEmailReadInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()
));
Get.lazyPut(() => MarkAsStarMultipleEmailInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MoveMultipleEmailToMailboxInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()
));
Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()));
Get.lazyPut(() => EmptyTrashFolderInteractor(
Get.find<ThreadRepository>(),
Get.find<MailboxRepository>(),
Get.find<EmailRepository>()));
Get.lazyPut(() => EmptySpamFolderInteractor(
Get.find<ThreadRepository>(),
Get.find<MailboxRepository>(),
Get.find<EmailRepository>()
));
Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => EmptyTrashFolderInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => EmptySpamFolderInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => GetAppDashboardConfigurationInteractor(
Get.find<AppConfigLoader>()));
Get.lazyPut(() => GetEmailByIdInteractor(
@@ -336,17 +313,11 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => GetSpamReportStateInteractor(
Get.find<SpamReportRepository>()));
Get.lazyPut(() => GetSpamMailboxCachedInteractor(Get.find<SpamReportRepository>()));
Get.lazyPut(() => SendEmailInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>(),
));
Get.lazyPut(() => SendEmailInteractor(Get.find<EmailRepository>()));
SendingQueueInteractorBindings().dependencies();
Get.lazyPut(() => StoreSessionInteractor(Get.find<SessionRepository>()));
Get.lazyPut(() => UnsubscribeEmailInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => RestoredDeletedMessageInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()
));
Get.lazyPut(() => RestoredDeletedMessageInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => GetRestoredDeletedMessageInterator(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()
@@ -404,7 +404,6 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
} else if (success is UnsubscribeEmailSuccess) {
_handleUnsubscribeMailSuccess();
} else if (success is RestoreDeletedMessageSuccess) {
dispatchMailboxUIAction(RefreshChangeMailboxAction(success.currentMailboxState));
_handleRestoreDeletedMessageSuccess(success.emailRecoveryAction.id!);
} else if (success is GetRestoredDeletedMessageSuccess) {
_handleGetRestoredDeletedMessageSuccess(success);
@@ -96,9 +96,7 @@ class SendEmailInteractorBindings extends InteractorsBindings {
@override
void bindingsInteractor() {
Get.lazyPut(() => SendEmailInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>()));
Get.lazyPut(() => SendEmailInteractor(Get.find<EmailRepository>()));
}
@override
@@ -294,11 +294,6 @@ class SearchEmailController extends BaseController
? UnsignedInt(listResultSearch.length)
: ThreadConstants.defaultLimit;
if (limit.value > ThreadConstants.maximumEmailQueryLimit &&
resultSearchScrollController.hasClients) {
resultSearchScrollController.jumpTo(0);
}
_updateSimpleSearchFilter(
beforeOption: const None(),
positionOption: option(searchEmailFilter.value.sortOrderType.isScrollByPosition(), 0),
@@ -5,7 +5,6 @@ import 'package:model/email/email_property.dart';
class ThreadConstants {
static const maxCountEmails = 20;
static const maximumEmailQueryLimit = 256;
static final defaultLimit = UnsignedInt(maxCountEmails);
static final propertiesDefault = Properties({
EmailProperty.id,
@@ -1,23 +1,17 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class EmptySpamFolderLoading extends LoadingState {}
class EmptySpamFolderSuccess extends UIActionState {
class EmptySpamFolderSuccess extends UIState {
final List<EmailId> emailIds;
EmptySpamFolderSuccess(
this.emailIds, {
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}) : super(currentEmailState, currentMailboxState);
EmptySpamFolderSuccess(this.emailIds);
@override
List<Object?> get props => [emailIds, ...super.props];
List<Object?> get props => [emailIds];
}
class EmptySpamFolderFailure extends FeatureFailure {
@@ -1,23 +1,17 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class EmptyTrashFolderLoading extends LoadingState {}
class EmptyTrashFolderSuccess extends UIActionState {
class EmptyTrashFolderSuccess extends UIState {
final List<EmailId> emailIds;
EmptyTrashFolderSuccess(
this.emailIds, {
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}) : super(currentEmailState, currentMailboxState);
EmptyTrashFolderSuccess(this.emailIds);
@override
List<Object?> get props => [emailIds, ...super.props];
List<Object?> get props => [emailIds];
}
class EmptyTrashFolderFailure extends FeatureFailure {
@@ -1,26 +1,20 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:model/email/read_actions.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class LoadingMarkAsMultipleEmailReadAll extends UIState {}
class MarkAsMultipleEmailReadAllSuccess extends UIActionState {
class MarkAsMultipleEmailReadAllSuccess extends UIState {
final int countMarkAsReadSuccess;
final ReadActions readActions;
MarkAsMultipleEmailReadAllSuccess(
this.countMarkAsReadSuccess,
this.readActions,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [countMarkAsReadSuccess, readActions, ...super.props];
List<Object?> get props => [countMarkAsReadSuccess, readActions];
}
class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
@@ -32,21 +26,17 @@ class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
List<Object> get props => [readActions];
}
class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIActionState {
class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState {
final int countMarkAsReadSuccess;
final ReadActions readActions;
MarkAsMultipleEmailReadHasSomeEmailFailure(
this.countMarkAsReadSuccess,
this.readActions,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [countMarkAsReadSuccess, readActions, ...super.props];
List<Object?> get props => [countMarkAsReadSuccess, readActions];
}
class MarkAsMultipleEmailReadFailure extends FeatureFailure {
@@ -1,26 +1,20 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:model/email/mark_star_action.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class LoadingMarkAsStarMultipleEmailAll extends UIState {}
class MarkAsStarMultipleEmailAllSuccess extends UIActionState {
class MarkAsStarMultipleEmailAllSuccess extends UIState {
final int countMarkStarSuccess;
final MarkStarAction markStarAction;
MarkAsStarMultipleEmailAllSuccess(
this.countMarkStarSuccess,
this.markStarAction,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [countMarkStarSuccess, markStarAction, ...super.props];
List<Object?> get props => [countMarkStarSuccess, markStarAction];
}
class MarkAsStarMultipleEmailAllFailure extends FeatureFailure {
@@ -32,21 +26,17 @@ class MarkAsStarMultipleEmailAllFailure extends FeatureFailure {
List<Object> get props => [markStarAction];
}
class MarkAsStarMultipleEmailHasSomeEmailFailure extends UIActionState {
class MarkAsStarMultipleEmailHasSomeEmailFailure extends UIState {
final int countMarkStarSuccess;
final MarkStarAction markStarAction;
MarkAsStarMultipleEmailHasSomeEmailFailure(
this.countMarkStarSuccess,
this.markStarAction,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [countMarkStarSuccess, markStarAction, ...super.props];
List<Object?> get props => [countMarkStarSuccess, markStarAction];
}
class MarkAsStarMultipleEmailFailure extends FeatureFailure {
@@ -1,15 +1,13 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/email/email_action_type.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
class LoadingMoveMultipleEmailToMailboxAll extends UIState {}
class MoveMultipleEmailToMailboxAllSuccess extends UIActionState {
class MoveMultipleEmailToMailboxAllSuccess extends UIState {
final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId;
final MailboxId destinationMailboxId;
@@ -25,10 +23,8 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIActionState {
this.emailActionType,
{
this.destinationPath,
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [
@@ -38,7 +34,6 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIActionState {
moveAction,
emailActionType,
destinationPath,
...super.props
];
}
@@ -52,7 +47,7 @@ class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure {
List<Object> get props => [moveAction, emailActionType];
}
class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIActionState {
class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId;
final MailboxId destinationMailboxId;
@@ -68,10 +63,8 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIActionState {
this.emailActionType,
{
this.destinationPath,
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
);
@override
List<Object?> get props => [
@@ -81,7 +74,6 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIActionState {
moveAction,
emailActionType,
destinationPath,
...super.props
];
}
@@ -4,40 +4,19 @@ import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
class EmptySpamFolderInteractor {
final ThreadRepository threadRepository;
final MailboxRepository _mailboxRepository;
final EmailRepository _emailRepository;
EmptySpamFolderInteractor(
this.threadRepository,
this._mailboxRepository,
this._emailRepository
);
EmptySpamFolderInteractor(this.threadRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, MailboxId spamMailboxId) async* {
try {
yield Right<Failure, Success>(EmptySpamFolderLoading());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final emailIdDeleted = await threadRepository.emptySpamFolder(session, accountId, spamMailboxId);
yield Right<Failure, Success>(EmptySpamFolderSuccess(
emailIdDeleted,
currentMailboxState: currentMailboxState,
currentEmailState: currentEmailState,
));
yield Right<Failure, Success>(EmptySpamFolderSuccess(emailIdDeleted));
} catch (e) {
yield Left<Failure, Success>(EmptySpamFolderFailure(e));
}
@@ -1,42 +1,22 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
class EmptyTrashFolderInteractor {
final ThreadRepository threadRepository;
final MailboxRepository _mailboxRepository;
final EmailRepository _emailRepository;
EmptyTrashFolderInteractor(
this.threadRepository,
this._mailboxRepository,
this._emailRepository
);
EmptyTrashFolderInteractor(this.threadRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, MailboxId trashMailboxId) async* {
try {
yield Right<Failure, Success>(EmptyTrashFolderLoading());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final emailIdDeleted = await threadRepository.emptyTrashFolder(session, accountId, trashMailboxId);
yield Right<Failure, Success>(EmptyTrashFolderSuccess(
emailIdDeleted,
currentMailboxState: currentMailboxState,
currentEmailState: currentEmailState,
));
yield Right<Failure, Success>(EmptyTrashFolderSuccess(emailIdDeleted,));
} catch (e) {
yield Left<Failure, Success>(EmptyTrashFolderFailure(e));
}
@@ -1,18 +1,17 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
class MarkAsMultipleEmailReadInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
MarkAsMultipleEmailReadInteractor(this._emailRepository, this._mailboxRepository);
MarkAsMultipleEmailReadInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(
Session session,
@@ -23,14 +22,6 @@ class MarkAsMultipleEmailReadInteractor {
try {
yield Right(LoadingMarkAsMultipleEmailReadAll());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final result = await _emailRepository.markAsRead(
session,
accountId,
@@ -42,16 +33,14 @@ class MarkAsMultipleEmailReadInteractor {
yield Right(MarkAsMultipleEmailReadAllSuccess(
result.length,
readAction,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
));
} else if (result.isEmpty) {
yield Left(MarkAsMultipleEmailReadAllFailure(readAction));
} else {
yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(
result.length,
readAction,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
));
}
} catch (e) {
yield Left(MarkAsMultipleEmailReadFailure(readAction, e));
@@ -22,22 +22,20 @@ class MarkAsStarMultipleEmailInteractor {
try {
yield Right(LoadingMarkAsStarMultipleEmailAll());
final currentEmailState = await _emailRepository.getEmailState(session, accountId);
final result = await _emailRepository.markAsStar(session, accountId, emailIds, markStarAction);
if (emailIds.length == result.length) {
yield Right(MarkAsStarMultipleEmailAllSuccess(
emailIds.length,
markStarAction,
currentEmailState: currentEmailState));
));
} else if (result.isEmpty) {
yield Left(MarkAsStarMultipleEmailAllFailure(markStarAction));
} else {
yield Right(MarkAsStarMultipleEmailHasSomeEmailFailure(
result.length,
markStarAction,
currentEmailState: currentEmailState));
));
}
} catch (e) {
yield Left(MarkAsStarMultipleEmailFailure(markStarAction, e));
@@ -1,19 +1,18 @@
import 'dart:async';
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.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/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
class MoveMultipleEmailToMailboxInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
MoveMultipleEmailToMailboxInteractor(this._emailRepository, this._mailboxRepository);
MoveMultipleEmailToMailboxInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(
Session session,
@@ -22,20 +21,8 @@ class MoveMultipleEmailToMailboxInteractor {
) async* {
try {
yield Right(LoadingMoveMultipleEmailToMailboxAll());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(session, accountId),
_emailRepository.getEmailState(session, accountId),
], eagerError: true);
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest);
int totalEmail = 0;
for (var element in moveRequest.currentMailboxes.values) {
totalEmail = totalEmail + element.length;
}if (totalEmail == result.length) {
if (moveRequest.totalEmails == result.length) {
yield Right(MoveMultipleEmailToMailboxAllSuccess(
result,
moveRequest.currentMailboxes.keys.first,
@@ -43,8 +30,7 @@ class MoveMultipleEmailToMailboxInteractor {
moveRequest.moveAction,
moveRequest.emailActionType,
destinationPath: moveRequest.destinationPath,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
));
} else if (result.isEmpty) {
yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction, moveRequest.emailActionType));
} else {
@@ -55,8 +41,7 @@ class MoveMultipleEmailToMailboxInteractor {
moveRequest.moveAction,
moveRequest.emailActionType,
destinationPath: moveRequest.destinationPath,
currentEmailState: currentEmailState,
currentMailboxState: currentMailboxState));
));
}
} catch (e) {
yield Left(MoveMultipleEmailToMailboxFailure(moveRequest.emailActionType, moveRequest.moveAction, e));
@@ -559,10 +559,6 @@ class ThreadController extends BaseController with EmailActionController {
Future<void> _refreshChangeSearchEmail() async {
log('ThreadController::_refreshChangeSearchEmail:');
if (limitEmailFetched.value > ThreadConstants.maximumEmailQueryLimit &&
listEmailController.hasClients) {
listEmailController.jumpTo(0);
}
canSearchMore = false;
searchController.updateFilterEmail(
positionOption: option(
@@ -8,7 +8,6 @@ import 'package:tmail_ui_user/features/composer/domain/repository/composer_repos
import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import '../../../../fixtures/account_fixtures.dart';
import '../../../../fixtures/session_fixtures.dart';
@@ -16,22 +15,18 @@ import 'create_new_and_save_email_to_drafts_interactor_test.mocks.dart';
@GenerateNiceMocks([
MockSpec<EmailRepository>(),
MockSpec<MailboxRepository>(),
MockSpec<ComposerRepository>(),
])
void main() {
late MockEmailRepository emailRepository;
late MockMailboxRepository mailboxRepository;
late MockComposerRepository composerRepository;
late CreateNewAndSaveEmailToDraftsInteractor createNewAndSaveEmailToDraftsInteractor;
setUp(() {
emailRepository = MockEmailRepository();
mailboxRepository = MockMailboxRepository();
composerRepository = MockComposerRepository();
createNewAndSaveEmailToDraftsInteractor = CreateNewAndSaveEmailToDraftsInteractor(
emailRepository,
mailboxRepository,
composerRepository);
});
@@ -7,7 +7,6 @@ import 'package:tmail_ui_user/features/composer/domain/repository/composer_repos
import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_send_email_interactor.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import '../../../../fixtures/account_fixtures.dart';
import '../../../../fixtures/session_fixtures.dart';
@@ -15,16 +14,13 @@ import 'create_new_and_send_email_interactor_test.mocks.dart';
@GenerateNiceMocks([
MockSpec<EmailRepository>(),
MockSpec<MailboxRepository>(),
MockSpec<ComposerRepository>(),
])
void main() {
final emailRepository = MockEmailRepository();
final mailboxRepository = MockMailboxRepository();
final composerRepository = MockComposerRepository();
final createNewAndSendEmailInteractor = CreateNewAndSendEmailInteractor(
emailRepository,
mailboxRepository,
composerRepository);
group('create new and send email interactor test:', () {
test(
@@ -1,6 +1,5 @@
import 'package:dartz/dartz.dart' hide State;
import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
@@ -34,13 +33,8 @@ void main() {
const eventActionType = EventActionType.yes;
test('SHOULD emit loading and success states when storeEventAttendanceStatus is successful', () async {
final currentEmailState = State('abc123');
final updatedEmail = Email(id: emailIdFixture);
when(mockEmailRepository.getEmailState(
sessionFixture,
accountIdFixture
)).thenAnswer((_) async => currentEmailState);
when(mockEmailRepository.storeEventAttendanceStatus(
sessionFixture,
accountIdFixture,
@@ -58,13 +52,10 @@ void main() {
result,
emitsInOrder([
Right(StoreEventAttendanceStatusLoading()),
Right(StoreEventAttendanceStatusSuccess(
eventActionType,
currentEmailState: currentEmailState)),
Right(StoreEventAttendanceStatusSuccess(eventActionType)),
]),
);
verify(mockEmailRepository.getEmailState(sessionFixture, accountIdFixture)).called(1);
verify(mockEmailRepository.storeEventAttendanceStatus(
sessionFixture,
accountIdFixture,
@@ -77,9 +68,11 @@ void main() {
test('SHOULD emit loading and failure states when storeEventAttendanceStatus throws an exception', () async {
final exception = Exception();
when(mockEmailRepository.getEmailState(
when(mockEmailRepository.storeEventAttendanceStatus(
sessionFixture,
accountIdFixture
accountIdFixture,
emailIdFixture,
eventActionType,
)).thenThrow(exception);
final result = storeEventAttendanceStatusInteractor.execute(
@@ -95,12 +88,6 @@ void main() {
Left(StoreEventAttendanceStatusFailure(exception: exception)),
]),
);
verify(mockEmailRepository.getEmailState(
sessionFixture,
accountIdFixture
)).called(1);
verifyNoMoreInteractions(mockEmailRepository);
});
});
}