TF-3487 Handle search email failure

This commit is contained in:
DatDang
2025-02-24 10:38:03 +07:00
committed by Dat H. Pham
parent 39cea85f86
commit 33b90d3c65
5 changed files with 29 additions and 9 deletions
@@ -483,6 +483,7 @@ class SearchEmailController extends BaseController
void _searchEmailsFailure(SearchEmailFailure failure) {
listResultSearch.clear();
resultSearchViewState.value = Left(failure);
showRetryToast(failure);
}
void searchMoreEmailsAction() {
@@ -17,5 +17,5 @@ class SearchEmailSuccess extends UIState {
class SearchEmailFailure extends FeatureFailure {
SearchEmailFailure(dynamic exception) : super(exception: exception);
SearchEmailFailure(dynamic exception, {super.onRetry}) : super(exception: exception);
}
@@ -55,7 +55,19 @@ class SearchEmailInteractor {
yield Right(SearchEmailSuccess(presentationEmailList));
} catch (e) {
yield Left(SearchEmailFailure(e));
yield Left(SearchEmailFailure(
e,
onRetry: execute(
session,
accountId,
filter: filter,
limit: limit,
position: position,
sort: sort,
properties: properties,
needRefreshSearchState: true,
),
));
}
}
}
@@ -201,6 +201,7 @@ class ThreadController extends BaseController with EmailActionController {
mailboxDashBoardController.updateRefreshAllEmailState(Left(RefreshAllEmailFailure()));
canSearchMore = false;
mailboxDashBoardController.emailsInCurrentMailbox.clear();
showRetryToast(failure);
} else if (failure is SearchMoreEmailFailure) {
loadingMoreStatus.value = LoadingMoreStatus.completed;
canSearchMore = true;
@@ -1,3 +1,5 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
@@ -100,7 +102,7 @@ void main() {
test(
'should return Failure when threadRepository.searchEmails returns Failure',
() {
() async {
// arrange
final exception = Exception();
when(
@@ -119,15 +121,19 @@ void main() {
SessionFixtures.aliceSession,
AccountFixtures.aliceAccountId,
filter: EmailFilterCondition(text: 'test'),
);
).asBroadcastStream();
// assert
final firstState = await result.first;
final lastState = await result.last;
expect(firstState, Right(SearchingState()));
expect(
result,
emitsInOrder([
Right(SearchingState()),
Left(SearchEmailFailure(exception)),
]),
lastState.fold((failure) {
return failure is SearchEmailFailure
&& failure.exception == exception
&& failure.onRetry is Stream<Either<Failure, Success>>;
}, (success) => false),
true,
);
},
);