Skip to content

Commit df7c151

Browse files
committed
TF-3150 Remove Cancel button and add timeout for saving & sending email
1 parent 5cb6541 commit df7c151

20 files changed

+975
-127
lines changed
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
class SendingEmailCanceledException implements Exception {}
22

3-
class SavingEmailToDraftsCanceledException implements Exception {}
3+
class SavingEmailToDraftsCanceledException implements Exception {}
4+
5+
class SendingEmailTimeoutException implements Exception {}
6+
7+
class SavingEmailToDraftsTimeoutException implements Exception {}

lib/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor.dart

Lines changed: 66 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,28 @@ import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts
1515
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
1616
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
1717
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
18+
import 'package:tmail_ui_user/features/login/data/network/interceptors/timeout_interceptors.dart';
1819
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
1920
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
21+
import 'package:tmail_ui_user/main/utils/app_config.dart';
2022

2123
class CreateNewAndSaveEmailToDraftsInteractor {
2224
final EmailRepository _emailRepository;
2325
final MailboxRepository _mailboxRepository;
2426
final ComposerRepository _composerRepository;
27+
final TimeoutInterceptors _timeoutInterceptors;
2528

2629
CreateNewAndSaveEmailToDraftsInteractor(
2730
this._emailRepository,
2831
this._mailboxRepository,
2932
this._composerRepository,
33+
this._timeoutInterceptors,
3034
);
3135

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

4449
final emailCreated = await _createEmailObject(createEmailRequest);
4550

46-
if (emailCreated != null) {
47-
if (createEmailRequest.draftsEmailId == null) {
48-
yield dartz.Right<Failure, Success>(SaveEmailAsDraftsLoading());
49-
50-
final emailDraftSaved = await _emailRepository.saveEmailAsDrafts(
51-
createEmailRequest.session,
52-
createEmailRequest.accountId,
53-
emailCreated,
54-
cancelToken: cancelToken
55-
);
56-
57-
yield dartz.Right<Failure, Success>(
58-
SaveEmailAsDraftsSuccess(
59-
emailDraftSaved.id!,
60-
currentMailboxState: listCurrentState?.value1,
61-
currentEmailState: listCurrentState?.value2
62-
)
63-
);
64-
} else {
65-
yield dartz.Right<Failure, Success>(UpdatingEmailDrafts());
66-
67-
final emailDraftSaved = await _emailRepository.updateEmailDrafts(
68-
createEmailRequest.session,
69-
createEmailRequest.accountId,
70-
emailCreated,
71-
createEmailRequest.draftsEmailId!,
72-
cancelToken: cancelToken
73-
);
74-
75-
yield dartz.Right<Failure, Success>(
76-
UpdateEmailDraftsSuccess(
77-
emailDraftSaved.id!,
78-
currentMailboxState: listCurrentState?.value1,
79-
currentEmailState: listCurrentState?.value2
80-
)
81-
);
51+
if (emailCreated == null) {
52+
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
53+
return;
54+
}
55+
56+
if (enableTimeout) {
57+
_timeoutInterceptors.setTimeout(
58+
connectionTimeout: AppConfig.savingMessageTimeout,
59+
sendTimeout: AppConfig.savingMessageTimeout,
60+
receiveTimeout: AppConfig.savingMessageTimeout,
61+
);
62+
}
63+
64+
if (createEmailRequest.draftsEmailId == null) {
65+
yield dartz.Right<Failure, Success>(SaveEmailAsDraftsLoading());
66+
67+
final emailDraftSaved = await _emailRepository.saveEmailAsDrafts(
68+
createEmailRequest.session,
69+
createEmailRequest.accountId,
70+
emailCreated,
71+
cancelToken: cancelToken
72+
);
73+
74+
if (enableTimeout) {
75+
_timeoutInterceptors.resetTimeout();
8276
}
77+
78+
yield dartz.Right<Failure, Success>(
79+
SaveEmailAsDraftsSuccess(
80+
emailDraftSaved.id!,
81+
currentMailboxState: listCurrentState?.value1,
82+
currentEmailState: listCurrentState?.value2
83+
)
84+
);
8385
} else {
84-
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
86+
yield dartz.Right<Failure, Success>(UpdatingEmailDrafts());
87+
88+
final emailDraftSaved = await _emailRepository.updateEmailDrafts(
89+
createEmailRequest.session,
90+
createEmailRequest.accountId,
91+
emailCreated,
92+
createEmailRequest.draftsEmailId!,
93+
cancelToken: cancelToken
94+
);
95+
96+
if (enableTimeout) {
97+
_timeoutInterceptors.resetTimeout();
98+
}
99+
100+
yield dartz.Right<Failure, Success>(
101+
UpdateEmailDraftsSuccess(
102+
emailDraftSaved.id!,
103+
currentMailboxState: listCurrentState?.value1,
104+
currentEmailState: listCurrentState?.value2
105+
)
106+
);
85107
}
86108
} catch (e) {
87109
logError('CreateNewAndSaveEmailToDraftsInteractor::execute: Exception: $e');
110+
if (enableTimeout) {
111+
_timeoutInterceptors.resetTimeout();
112+
}
88113
if (e is UnknownError && e.message is List<SavingEmailToDraftsCanceledException>) {
89114
if (createEmailRequest.draftsEmailId == null) {
90115
yield dartz.Left<Failure, Success>(SaveEmailAsDraftsFailure(SavingEmailToDraftsCanceledException()));
91116
} else {
92117
yield dartz.Left<Failure, Success>(UpdateEmailDraftsFailure(SavingEmailToDraftsCanceledException()));
93118
}
119+
} else if (e is ConnectionTimeout || e is SendTimeout || e is ReceiveTimeout) {
120+
yield dartz.Left<Failure, Success>(createEmailRequest.draftsEmailId == null
121+
? SaveEmailAsDraftsFailure(SavingEmailToDraftsTimeoutException())
122+
: UpdateEmailDraftsFailure(SavingEmailToDraftsTimeoutException()));
94123
} else {
95124
if (createEmailRequest.draftsEmailId == null) {
96125
yield dartz.Left<Failure, Success>(SaveEmailAsDraftsFailure(e));

lib/features/composer/domain/usecases/create_new_and_send_email_interactor.dart

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,29 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/create_e
1515
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
1616
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
1717
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
18+
import 'package:tmail_ui_user/features/login/data/network/interceptors/timeout_interceptors.dart';
1819
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
1920
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart';
2021
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
22+
import 'package:tmail_ui_user/main/utils/app_config.dart';
2123

2224
class CreateNewAndSendEmailInteractor {
2325
final EmailRepository _emailRepository;
2426
final MailboxRepository _mailboxRepository;
2527
final ComposerRepository _composerRepository;
28+
final TimeoutInterceptors _timeoutInterceptors;
2629

2730
CreateNewAndSendEmailInteractor(
2831
this._emailRepository,
2932
this._mailboxRepository,
3033
this._composerRepository,
34+
this._timeoutInterceptors,
3135
);
3236

3337
Stream<dartz.Either<Failure, Success>> execute({
3438
required CreateEmailRequest createEmailRequest,
35-
CancelToken? cancelToken
39+
CancelToken? cancelToken,
40+
bool enableTimeout = false,
3641
}) async* {
3742
SendingEmailArguments? sendingEmailArguments;
3843
try {
@@ -45,38 +50,54 @@ class CreateNewAndSendEmailInteractor {
4550

4651
sendingEmailArguments = await _createEmailObject(createEmailRequest);
4752

48-
if (sendingEmailArguments != null) {
49-
yield dartz.Right<Failure, Success>(SendEmailLoading());
53+
if (sendingEmailArguments == null) {
54+
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
55+
return;
56+
}
5057

51-
await _emailRepository.sendEmail(
52-
sendingEmailArguments.session,
53-
sendingEmailArguments.accountId,
54-
sendingEmailArguments.emailRequest,
55-
mailboxRequest: sendingEmailArguments.mailboxRequest,
56-
cancelToken: cancelToken
58+
if (enableTimeout) {
59+
_timeoutInterceptors.setTimeout(
60+
connectionTimeout: AppConfig.sendingMessageTimeout,
61+
sendTimeout: AppConfig.sendingMessageTimeout,
62+
receiveTimeout: AppConfig.sendingMessageTimeout,
5763
);
64+
}
65+
66+
yield dartz.Right<Failure, Success>(SendEmailLoading());
5867

59-
if (sendingEmailArguments.emailRequest.emailIdDestroyed != null) {
60-
await _deleteOldDraftsEmail(
61-
session: sendingEmailArguments.session,
62-
accountId: sendingEmailArguments.accountId,
63-
draftEmailId: sendingEmailArguments.emailRequest.emailIdDestroyed!,
64-
cancelToken: cancelToken
65-
);
66-
}
67-
68-
yield dartz.Right<Failure, Success>(
69-
SendEmailSuccess(
70-
currentMailboxState: listCurrentState?.value1,
71-
currentEmailState: listCurrentState?.value2,
72-
emailRequest: sendingEmailArguments.emailRequest
73-
)
68+
await _emailRepository.sendEmail(
69+
sendingEmailArguments.session,
70+
sendingEmailArguments.accountId,
71+
sendingEmailArguments.emailRequest,
72+
mailboxRequest: sendingEmailArguments.mailboxRequest,
73+
cancelToken: cancelToken,
74+
);
75+
76+
if (enableTimeout) {
77+
_timeoutInterceptors.resetTimeout();
78+
}
79+
80+
if (sendingEmailArguments.emailRequest.emailIdDestroyed != null) {
81+
await _deleteOldDraftsEmail(
82+
session: sendingEmailArguments.session,
83+
accountId: sendingEmailArguments.accountId,
84+
draftEmailId: sendingEmailArguments.emailRequest.emailIdDestroyed!,
85+
cancelToken: cancelToken
7486
);
75-
} else {
76-
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
7787
}
88+
89+
yield dartz.Right<Failure, Success>(
90+
SendEmailSuccess(
91+
currentMailboxState: listCurrentState?.value1,
92+
currentEmailState: listCurrentState?.value2,
93+
emailRequest: sendingEmailArguments.emailRequest
94+
)
95+
);
7896
} catch (e) {
7997
logError('CreateNewAndSendEmailInteractor::execute: Exception: $e');
98+
if (enableTimeout) {
99+
_timeoutInterceptors.resetTimeout();
100+
}
80101
if (e is UnknownError && e.message is List<SendingEmailCanceledException>) {
81102
yield dartz.Left<Failure, Success>(SendEmailFailure(
82103
exception: SendingEmailCanceledException(),
@@ -85,6 +106,14 @@ class CreateNewAndSendEmailInteractor {
85106
emailRequest: sendingEmailArguments?.emailRequest,
86107
mailboxRequest: sendingEmailArguments?.mailboxRequest,
87108
));
109+
} else if (e is ConnectionTimeout || e is SendTimeout || e is ReceiveTimeout) {
110+
yield dartz.Left<Failure, Success>(SendEmailFailure(
111+
exception: SendingEmailTimeoutException(),
112+
session: sendingEmailArguments?.session,
113+
accountId: sendingEmailArguments?.accountId,
114+
emailRequest: sendingEmailArguments?.emailRequest,
115+
mailboxRequest: sendingEmailArguments?.mailboxRequest,
116+
));
88117
} else {
89118
yield dartz.Left<Failure, Success>(SendEmailFailure(
90119
exception: e,

lib/features/composer/presentation/composer_bindings.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import 'package:tmail_ui_user/features/email/data/repository/email_repository_im
3232
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
3333
import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart';
3434
import 'package:tmail_ui_user/features/email/domain/usecases/transform_html_email_content_interactor.dart';
35+
import 'package:tmail_ui_user/features/login/data/network/interceptors/timeout_interceptors.dart';
3536
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
3637
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
3738
import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart';
@@ -207,11 +208,13 @@ class ComposerBindings extends BaseBindings {
207208
Get.find<EmailRepository>(),
208209
Get.find<MailboxRepository>(),
209210
Get.find<ComposerRepository>(),
211+
Get.find<TimeoutInterceptors>(),
210212
));
211213
Get.lazyPut(() => CreateNewAndSaveEmailToDraftsInteractor(
212214
Get.find<EmailRepository>(),
213215
Get.find<MailboxRepository>(),
214216
Get.find<ComposerRepository>(),
217+
Get.find<TimeoutInterceptors>(),
215218
));
216219
Get.lazyPut(() => RestoreEmailInlineImagesInteractor(
217220
Get.find<ComposerCacheRepository>()));

0 commit comments

Comments
 (0)