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) { void _searchEmailsFailure(SearchEmailFailure failure) {
listResultSearch.clear(); listResultSearch.clear();
resultSearchViewState.value = Left(failure); resultSearchViewState.value = Left(failure);
showRetryToast(failure);
} }
void searchMoreEmailsAction() { void searchMoreEmailsAction() {
@@ -17,5 +17,5 @@ class SearchEmailSuccess extends UIState {
class SearchEmailFailure extends FeatureFailure { 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)); yield Right(SearchEmailSuccess(presentationEmailList));
} catch (e) { } 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())); mailboxDashBoardController.updateRefreshAllEmailState(Left(RefreshAllEmailFailure()));
canSearchMore = false; canSearchMore = false;
mailboxDashBoardController.emailsInCurrentMailbox.clear(); mailboxDashBoardController.emailsInCurrentMailbox.clear();
showRetryToast(failure);
} else if (failure is SearchMoreEmailFailure) { } else if (failure is SearchMoreEmailFailure) {
loadingMoreStatus.value = LoadingMoreStatus.completed; loadingMoreStatus.value = LoadingMoreStatus.completed;
canSearchMore = true; 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:dartz/dartz.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
@@ -100,7 +102,7 @@ void main() {
test( test(
'should return Failure when threadRepository.searchEmails returns Failure', 'should return Failure when threadRepository.searchEmails returns Failure',
() { () async {
// arrange // arrange
final exception = Exception(); final exception = Exception();
when( when(
@@ -119,15 +121,19 @@ void main() {
SessionFixtures.aliceSession, SessionFixtures.aliceSession,
AccountFixtures.aliceAccountId, AccountFixtures.aliceAccountId,
filter: EmailFilterCondition(text: 'test'), filter: EmailFilterCondition(text: 'test'),
); ).asBroadcastStream();
// assert // assert
final firstState = await result.first;
final lastState = await result.last;
expect(firstState, Right(SearchingState()));
expect( expect(
result, lastState.fold((failure) {
emitsInOrder([ return failure is SearchEmailFailure
Right(SearchingState()), && failure.exception == exception
Left(SearchEmailFailure(exception)), && failure.onRetry is Stream<Either<Failure, Success>>;
]), }, (success) => false),
true,
); );
}, },
); );