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