TF-1897 Implement resend sending email when failed

(cherry picked from commit f508b65688503e9ae8ece5a1924e84481b98a39e)
This commit is contained in:
dab246
2023-06-10 19:20:30 +07:00
committed by Dat Vu
parent b6528b5bf5
commit c5bd77f800
16 changed files with 338 additions and 129 deletions
@@ -0,0 +1,9 @@
import 'package:tmail_ui_user/features/offline_mode/model/sending_email_hive_cache.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_email_extension.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
extension ListSendingEmailExtension on List<SendingEmail> {
List<SendingEmailHiveCache> toHiveCache() => map((sendingEmail) => sendingEmail.toHiveCache()).toList();
List<String> get sendingIds => map((sendingEmail) => sendingEmail.sendingId).toSet().toList();
}
@@ -101,6 +101,10 @@ class SendingEmail with EquatableMixin {
bool get isWaiting => sendingState == SendingState.waiting;
bool get isError => sendingState == SendingState.error;
bool get isSuccess => sendingState == SendingState.success;
@override
List<Object?> get props => [
sendingId,
@@ -0,0 +1,40 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
class UpdateMultipleSendingEmailLoading extends UIState {}
class UpdateMultipleSendingEmailAllSuccess extends UIState {
final List<SendingEmail> newSendingEmails;
UpdateMultipleSendingEmailAllSuccess(this.newSendingEmails);
@override
List<Object?> get props => [newSendingEmails];
}
class UpdateMultipleSendingEmailHasSomeSuccess extends UIState {
final List<SendingEmail> newSendingEmails;
UpdateMultipleSendingEmailHasSomeSuccess(this.newSendingEmails);
@override
List<Object?> get props => [newSendingEmails];
}
class UpdateMultipleSendingEmailAllFailure extends FeatureFailure {
UpdateMultipleSendingEmailAllFailure(dynamic exception) : super(exception: exception);
@override
List<Object?> get props => [exception];
}
class UpdateMultipleSendingEmailFailure extends FeatureFailure {
UpdateMultipleSendingEmailFailure(dynamic exception) : super(exception: exception);
@override
List<Object?> get props => [exception];
}
@@ -0,0 +1,38 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:tmail_ui_user/features/sending_queue/data/exceptions/sending_queue_exceptions.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/repository/sending_queue_repository.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/state/update_multiple_sending_email_state.dart';
class UpdateMultipleSendingEmailInteractor {
final SendingQueueRepository _sendingQueueRepository;
UpdateMultipleSendingEmailInteractor(this._sendingQueueRepository);
Stream<Either<Failure, Success>> execute(
AccountId accountId,
UserName userName,
List<SendingEmail> newSendingEmails
) async* {
try {
yield Right<Failure, Success>(UpdateMultipleSendingEmailLoading());
final storedSendingEmails = await _sendingQueueRepository.updateMultipleSendingEmail(
accountId,
userName,
newSendingEmails);
if (storedSendingEmails.length == newSendingEmails.length) {
yield Right<Failure, Success>(UpdateMultipleSendingEmailAllSuccess(storedSendingEmails));
} else if (storedSendingEmails.isEmpty) {
yield Left<Failure, Success>(UpdateMultipleSendingEmailAllFailure(NotFoundSendingEmailHiveObject()));
} else {
yield Right<Failure, Success>(UpdateMultipleSendingEmailHasSomeSuccess(storedSendingEmails));
}
} catch (e) {
yield Left<Failure, Success>(UpdateMultipleSendingEmailFailure(e));
}
}
}
@@ -15,12 +15,11 @@ class UpdateSendingEmailInteractor {
Stream<Either<Failure, Success>> execute(
AccountId accountId,
UserName userName,
SendingEmail newSendingEmail,
{bool needToReopen = false}
SendingEmail newSendingEmail
) async* {
try {
yield Right<Failure, Success>(UpdateSendingEmailLoading());
final storedSendingEmail = await _sendingQueueRepository.updateSendingEmail(accountId, userName, newSendingEmail, needToReopen: needToReopen);
final storedSendingEmail = await _sendingQueueRepository.updateSendingEmail(accountId, userName, newSendingEmail);
yield Right<Failure, Success>(UpdateSendingEmailSuccess(storedSendingEmail));
} catch (e) {
yield Left<Failure, Success>(UpdateSendingEmailFailure(e));