TF-3487 Handle search email failure
This commit is contained in:
@@ -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,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user