Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TF-3150 Fix cancel sending email not work as expected #3186

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
class SendingEmailCanceledException implements Exception {}

class SavingEmailToDraftsCanceledException implements Exception {}
class SavingEmailToDraftsCanceledException implements Exception {}

class SendingEmailTimeoutException implements Exception {}

class SavingEmailToDraftsTimeoutException implements Exception {}
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,28 @@ import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/login/data/network/interceptors/timeout_interceptors.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/utils/app_config.dart';

class CreateNewAndSaveEmailToDraftsInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
final ComposerRepository _composerRepository;
final TimeoutInterceptors _timeoutInterceptors;

CreateNewAndSaveEmailToDraftsInteractor(
this._emailRepository,
this._mailboxRepository,
this._composerRepository,
this._timeoutInterceptors,
);

Stream<dartz.Either<Failure, Success>> execute({
required CreateEmailRequest createEmailRequest,
CancelToken? cancelToken,
bool enableTimeout = false,
}) async* {
try {
yield dartz.Right<Failure, Success>(GenerateEmailLoading());
Expand All @@ -43,54 +48,78 @@ class CreateNewAndSaveEmailToDraftsInteractor {

final emailCreated = await _createEmailObject(createEmailRequest);

if (emailCreated != null) {
if (createEmailRequest.draftsEmailId == null) {
yield dartz.Right<Failure, Success>(SaveEmailAsDraftsLoading());

final emailDraftSaved = await _emailRepository.saveEmailAsDrafts(
createEmailRequest.session,
createEmailRequest.accountId,
emailCreated,
cancelToken: cancelToken
);

yield dartz.Right<Failure, Success>(
SaveEmailAsDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
);
} else {
yield dartz.Right<Failure, Success>(UpdatingEmailDrafts());

final emailDraftSaved = await _emailRepository.updateEmailDrafts(
createEmailRequest.session,
createEmailRequest.accountId,
emailCreated,
createEmailRequest.draftsEmailId!,
cancelToken: cancelToken
);

yield dartz.Right<Failure, Success>(
UpdateEmailDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
);
if (emailCreated == null) {
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
return;
}

if (enableTimeout) {
_timeoutInterceptors.setTimeout(
connectionTimeout: AppConfig.savingMessageTimeout,
sendTimeout: AppConfig.savingMessageTimeout,
receiveTimeout: AppConfig.savingMessageTimeout,
);
}

if (createEmailRequest.draftsEmailId == null) {
yield dartz.Right<Failure, Success>(SaveEmailAsDraftsLoading());

final emailDraftSaved = await _emailRepository.saveEmailAsDrafts(
createEmailRequest.session,
createEmailRequest.accountId,
emailCreated,
cancelToken: cancelToken
);

if (enableTimeout) {
_timeoutInterceptors.resetTimeout();
}

yield dartz.Right<Failure, Success>(
SaveEmailAsDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
);
} else {
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
yield dartz.Right<Failure, Success>(UpdatingEmailDrafts());

final emailDraftSaved = await _emailRepository.updateEmailDrafts(
createEmailRequest.session,
createEmailRequest.accountId,
emailCreated,
createEmailRequest.draftsEmailId!,
cancelToken: cancelToken
);

if (enableTimeout) {
_timeoutInterceptors.resetTimeout();
}

yield dartz.Right<Failure, Success>(
UpdateEmailDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
);
}
} catch (e) {
logError('CreateNewAndSaveEmailToDraftsInteractor::execute: Exception: $e');
if (enableTimeout) {
_timeoutInterceptors.resetTimeout();
}
hoangdat marked this conversation as resolved.
Show resolved Hide resolved
if (e is UnknownError && e.message is List<SavingEmailToDraftsCanceledException>) {
if (createEmailRequest.draftsEmailId == null) {
yield dartz.Left<Failure, Success>(SaveEmailAsDraftsFailure(SavingEmailToDraftsCanceledException()));
} else {
yield dartz.Left<Failure, Success>(UpdateEmailDraftsFailure(SavingEmailToDraftsCanceledException()));
}
} else if (e is ConnectionTimeout || e is SendTimeout || e is ReceiveTimeout) {
yield dartz.Left<Failure, Success>(createEmailRequest.draftsEmailId == null
? SaveEmailAsDraftsFailure(SavingEmailToDraftsTimeoutException())
: UpdateEmailDraftsFailure(SavingEmailToDraftsTimeoutException()));
} else {
if (createEmailRequest.draftsEmailId == null) {
yield dartz.Left<Failure, Success>(SaveEmailAsDraftsFailure(e));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,29 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/create_e
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/login/data/network/interceptors/timeout_interceptors.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';

class CreateNewAndSendEmailInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
final ComposerRepository _composerRepository;
final TimeoutInterceptors _timeoutInterceptors;

CreateNewAndSendEmailInteractor(
this._emailRepository,
this._mailboxRepository,
this._composerRepository,
this._timeoutInterceptors,
);

Stream<dartz.Either<Failure, Success>> execute({
required CreateEmailRequest createEmailRequest,
CancelToken? cancelToken
CancelToken? cancelToken,
bool enableTimeout = false,
}) async* {
SendingEmailArguments? sendingEmailArguments;
try {
Expand All @@ -45,38 +50,54 @@ class CreateNewAndSendEmailInteractor {

sendingEmailArguments = await _createEmailObject(createEmailRequest);

if (sendingEmailArguments != null) {
yield dartz.Right<Failure, Success>(SendEmailLoading());
if (sendingEmailArguments == null) {
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
return;
}

await _emailRepository.sendEmail(
sendingEmailArguments.session,
sendingEmailArguments.accountId,
sendingEmailArguments.emailRequest,
mailboxRequest: sendingEmailArguments.mailboxRequest,
cancelToken: cancelToken
if (enableTimeout) {
_timeoutInterceptors.setTimeout(
connectionTimeout: AppConfig.sendingMessageTimeout,
sendTimeout: AppConfig.sendingMessageTimeout,
receiveTimeout: AppConfig.sendingMessageTimeout,
);
}

yield dartz.Right<Failure, Success>(SendEmailLoading());

if (sendingEmailArguments.emailRequest.emailIdDestroyed != null) {
await _deleteOldDraftsEmail(
session: sendingEmailArguments.session,
accountId: sendingEmailArguments.accountId,
draftEmailId: sendingEmailArguments.emailRequest.emailIdDestroyed!,
cancelToken: cancelToken
);
}

yield dartz.Right<Failure, Success>(
SendEmailSuccess(
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2,
emailRequest: sendingEmailArguments.emailRequest
)
await _emailRepository.sendEmail(
sendingEmailArguments.session,
sendingEmailArguments.accountId,
sendingEmailArguments.emailRequest,
mailboxRequest: sendingEmailArguments.mailboxRequest,
cancelToken: cancelToken,
);

if (enableTimeout) {
_timeoutInterceptors.resetTimeout();
}

if (sendingEmailArguments.emailRequest.emailIdDestroyed != null) {
await _deleteOldDraftsEmail(
session: sendingEmailArguments.session,
accountId: sendingEmailArguments.accountId,
draftEmailId: sendingEmailArguments.emailRequest.emailIdDestroyed!,
cancelToken: cancelToken
);
} else {
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
}

yield dartz.Right<Failure, Success>(
SendEmailSuccess(
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2,
emailRequest: sendingEmailArguments.emailRequest
)
);
} catch (e) {
logError('CreateNewAndSendEmailInteractor::execute: Exception: $e');
if (enableTimeout) {
_timeoutInterceptors.resetTimeout();
}
hoangdat marked this conversation as resolved.
Show resolved Hide resolved
if (e is UnknownError && e.message is List<SendingEmailCanceledException>) {
yield dartz.Left<Failure, Success>(SendEmailFailure(
exception: SendingEmailCanceledException(),
Expand All @@ -85,6 +106,14 @@ class CreateNewAndSendEmailInteractor {
emailRequest: sendingEmailArguments?.emailRequest,
mailboxRequest: sendingEmailArguments?.mailboxRequest,
));
} else if (e is ConnectionTimeout || e is SendTimeout || e is ReceiveTimeout) {
yield dartz.Left<Failure, Success>(SendEmailFailure(
exception: SendingEmailTimeoutException(),
session: sendingEmailArguments?.session,
accountId: sendingEmailArguments?.accountId,
emailRequest: sendingEmailArguments?.emailRequest,
mailboxRequest: sendingEmailArguments?.mailboxRequest,
));
} else {
yield dartz.Left<Failure, Success>(SendEmailFailure(
exception: e,
Expand Down
3 changes: 3 additions & 0 deletions lib/features/composer/presentation/composer_bindings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import 'package:tmail_ui_user/features/email/data/repository/email_repository_im
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/transform_html_email_content_interactor.dart';
import 'package:tmail_ui_user/features/login/data/network/interceptors/timeout_interceptors.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart';
Expand Down Expand Up @@ -207,11 +208,13 @@ class ComposerBindings extends BaseBindings {
Get.find<EmailRepository>(),
Get.find<MailboxRepository>(),
Get.find<ComposerRepository>(),
Get.find<TimeoutInterceptors>(),
));
Get.lazyPut(() => CreateNewAndSaveEmailToDraftsInteractor(
Get.find<EmailRepository>(),
Get.find<MailboxRepository>(),
Get.find<ComposerRepository>(),
Get.find<TimeoutInterceptors>(),
));
Get.lazyPut(() => RestoreEmailInlineImagesInteractor(
Get.find<ComposerCacheRepository>()));
Expand Down
Loading
Loading