TF-3002 [MOBILE] Fix no result screen still show during search is in progress
This commit is contained in:
@@ -107,6 +107,7 @@ class SearchEmailController extends BaseController
|
|||||||
final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE);
|
final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE);
|
||||||
final emailSortOrderType = EmailSortOrderType.mostRecent.obs;
|
final emailSortOrderType = EmailSortOrderType.mostRecent.obs;
|
||||||
final suggestionSearchViewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
final suggestionSearchViewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||||
|
final resultSearchViewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||||
|
|
||||||
late Debouncer<String> _deBouncerTime;
|
late Debouncer<String> _deBouncerTime;
|
||||||
late Worker dashBoardViewStateWorker;
|
late Worker dashBoardViewStateWorker;
|
||||||
@@ -175,6 +176,8 @@ class SearchEmailController extends BaseController
|
|||||||
_searchMoreEmailsSuccess(success);
|
_searchMoreEmailsSuccess(success);
|
||||||
} else if (success is RefreshChangesSearchEmailSuccess) {
|
} else if (success is RefreshChangesSearchEmailSuccess) {
|
||||||
_refreshChangesSearchEmailsSuccess(success);
|
_refreshChangesSearchEmailsSuccess(success);
|
||||||
|
} else if (success is SearchingState) {
|
||||||
|
resultSearchViewState.value = Right(success);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,6 +191,22 @@ class SearchEmailController extends BaseController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void handleUrgentExceptionOnMobile({Failure? failure, Exception? exception}) {
|
||||||
|
super.handleUrgentExceptionOnMobile(failure: failure, exception: exception);
|
||||||
|
if (failure is SearchEmailFailure) {
|
||||||
|
_searchEmailsFailure(failure);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void handleUrgentExceptionOnWeb({Failure? failure, Exception? exception}) {
|
||||||
|
super.handleUrgentExceptionOnWeb(failure: failure, exception: exception);
|
||||||
|
if (failure is SearchEmailFailure) {
|
||||||
|
_searchEmailsFailure(failure);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _initializeDebounceTimeTextSearchChange() {
|
void _initializeDebounceTimeTextSearchChange() {
|
||||||
_deBouncerTime = Debouncer<String>(
|
_deBouncerTime = Debouncer<String>(
|
||||||
const Duration(milliseconds: 500),
|
const Duration(milliseconds: 500),
|
||||||
@@ -345,6 +364,7 @@ class SearchEmailController extends BaseController
|
|||||||
textInputSearchFocus.unfocus();
|
textInputSearchFocus.unfocus();
|
||||||
|
|
||||||
if (session != null && accountId != null) {
|
if (session != null && accountId != null) {
|
||||||
|
resultSearchViewState.value = Right(SearchingState());
|
||||||
canSearchMore = true;
|
canSearchMore = true;
|
||||||
searchIsRunning.value = true;
|
searchIsRunning.value = true;
|
||||||
cancelSelectionMode();
|
cancelSelectionMode();
|
||||||
@@ -400,6 +420,8 @@ class SearchEmailController extends BaseController
|
|||||||
isSearchEmailRunning: true
|
isSearchEmailRunning: true
|
||||||
);
|
);
|
||||||
|
|
||||||
|
resultSearchViewState.value = Right(success);
|
||||||
|
|
||||||
if (resultSearchScrollController.hasClients) {
|
if (resultSearchScrollController.hasClients) {
|
||||||
resultSearchScrollController.animateTo(
|
resultSearchScrollController.animateTo(
|
||||||
0,
|
0,
|
||||||
@@ -410,6 +432,7 @@ class SearchEmailController extends BaseController
|
|||||||
|
|
||||||
void _searchEmailsFailure(SearchEmailFailure failure) {
|
void _searchEmailsFailure(SearchEmailFailure failure) {
|
||||||
listResultSearch.clear();
|
listResultSearch.clear();
|
||||||
|
resultSearchViewState.value = Left(failure);
|
||||||
}
|
}
|
||||||
|
|
||||||
void searchMoreEmailsAction() {
|
void searchMoreEmailsAction() {
|
||||||
|
|||||||
@@ -31,13 +31,12 @@ import 'package:tmail_ui_user/features/search/email/presentation/widgets/email_r
|
|||||||
import 'package:tmail_ui_user/features/search/email/presentation/widgets/email_receive_time_cupertino_action_sheet_action_builder.dart';
|
import 'package:tmail_ui_user/features/search/email/presentation/widgets/email_receive_time_cupertino_action_sheet_action_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/search/email/presentation/widgets/email_sort_by_action_tile_widget.dart';
|
import 'package:tmail_ui_user/features/search/email/presentation/widgets/email_sort_by_action_tile_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/search/email/presentation/widgets/email_sort_by_cupertino_action_sheet_action_builder.dart';
|
import 'package:tmail_ui_user/features/search/email/presentation/widgets/email_sort_by_cupertino_action_sheet_action_builder.dart';
|
||||||
|
import 'package:tmail_ui_user/features/search/email/presentation/widgets/empty_search_email_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/search/email/presentation/widgets/search_email_loading_bar_widget.dart';
|
import 'package:tmail_ui_user/features/search/email/presentation/widgets/search_email_loading_bar_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/styles/item_email_tile_styles.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/styles/item_email_tile_styles.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'
|
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'
|
||||||
if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart';
|
if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/empty_emails_widget.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
class SearchEmailView extends GetWidget<SearchEmailController>
|
class SearchEmailView extends GetWidget<SearchEmailController>
|
||||||
@@ -82,7 +81,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
_buildListSearchFilterAction(context),
|
_buildListSearchFilterAction(context),
|
||||||
Obx(() => SearchEmailLoadingBarWidget(
|
Obx(() => SearchEmailLoadingBarWidget(
|
||||||
suggestionViewState: controller.suggestionSearchViewState.value,
|
suggestionViewState: controller.suggestionSearchViewState.value,
|
||||||
resultSearchViewState: controller.viewState.value,
|
resultSearchViewState: controller.resultSearchViewState.value,
|
||||||
)),
|
)),
|
||||||
Expanded(child: Obx(() {
|
Expanded(child: Obx(() {
|
||||||
if (controller.searchIsRunning.isFalse) {
|
if (controller.searchIsRunning.isFalse) {
|
||||||
@@ -110,7 +109,11 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
controller.listResultSearch
|
controller.listResultSearch
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return _buildEmptyEmail(context);
|
return Obx(() => EmptySearchEmailWidget(
|
||||||
|
suggestionViewState: controller.suggestionSearchViewState.value,
|
||||||
|
resultSearchViewState: controller.resultSearchViewState.value,
|
||||||
|
isNetworkConnectionAvailable: controller.networkConnectionController.isNetworkConnectionAvailable(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})),
|
})),
|
||||||
@@ -613,18 +616,6 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildEmptyEmail(BuildContext context) {
|
|
||||||
return Obx(() => controller.viewState.value.fold(
|
|
||||||
(failure) => const SizedBox.shrink(),
|
|
||||||
(success) => success is! SearchingState
|
|
||||||
? EmptyEmailsWidget(
|
|
||||||
key: const Key('empty_search_email_view'),
|
|
||||||
isNetworkConnectionAvailable: controller.networkConnectionController.isNetworkConnectionAvailable(),
|
|
||||||
isSearchActive: true)
|
|
||||||
: const SizedBox.shrink())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildListEmailBody(BuildContext context, List<PresentationEmail> listPresentationEmail) {
|
Widget _buildListEmailBody(BuildContext context, List<PresentationEmail> listPresentationEmail) {
|
||||||
return NotificationListener<ScrollNotification>(
|
return NotificationListener<ScrollNotification>(
|
||||||
onNotification: (ScrollNotification scrollInfo) {
|
onNotification: (ScrollNotification scrollInfo) {
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
|
||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/presentation/widgets/empty_emails_widget.dart';
|
||||||
|
|
||||||
|
class EmptySearchEmailWidget extends StatelessWidget {
|
||||||
|
|
||||||
|
final Either<Failure, Success> resultSearchViewState;
|
||||||
|
final Either<Failure, Success> suggestionViewState;
|
||||||
|
final bool isNetworkConnectionAvailable;
|
||||||
|
|
||||||
|
const EmptySearchEmailWidget({
|
||||||
|
super.key,
|
||||||
|
required this.resultSearchViewState,
|
||||||
|
required this.suggestionViewState,
|
||||||
|
required this.isNetworkConnectionAvailable,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return resultSearchViewState.fold(
|
||||||
|
(failure) => _suggestionViewStateToUI(suggestionViewState),
|
||||||
|
(success) {
|
||||||
|
if (success is SearchingState) {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
} else {
|
||||||
|
return _suggestionViewStateToUI(suggestionViewState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _suggestionViewStateToUI(Either<Failure, Success> viewState) {
|
||||||
|
return viewState.fold(
|
||||||
|
(failure) => EmptyEmailsWidget(
|
||||||
|
key: const Key('empty_search_email_view'),
|
||||||
|
isNetworkConnectionAvailable: isNetworkConnectionAvailable,
|
||||||
|
isSearchActive: true
|
||||||
|
),
|
||||||
|
(success) {
|
||||||
|
if (success is LoadingState) {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
} else {
|
||||||
|
return EmptyEmailsWidget(
|
||||||
|
key: const Key('empty_search_email_view'),
|
||||||
|
isNetworkConnectionAvailable: isNetworkConnectionAvailable,
|
||||||
|
isSearchActive: true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
-19
@@ -20,17 +20,7 @@ class SearchEmailLoadingBarWidget extends StatelessWidget with AppLoaderMixin {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return resultSearchViewState.fold(
|
return resultSearchViewState.fold(
|
||||||
(failure) {
|
(failure) => _suggestionViewStateToUI(suggestionViewState),
|
||||||
return suggestionViewState.fold(
|
|
||||||
(failure) => const SizedBox.shrink(),
|
|
||||||
(success) => success is LoadingState
|
|
||||||
? Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
|
||||||
child: loadingWidget
|
|
||||||
)
|
|
||||||
: const SizedBox.shrink()
|
|
||||||
);
|
|
||||||
},
|
|
||||||
(success) {
|
(success) {
|
||||||
if (success is SearchingState) {
|
if (success is SearchingState) {
|
||||||
return Padding(
|
return Padding(
|
||||||
@@ -38,15 +28,23 @@ class SearchEmailLoadingBarWidget extends StatelessWidget with AppLoaderMixin {
|
|||||||
child: loadingWidget
|
child: loadingWidget
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return suggestionViewState.fold(
|
return _suggestionViewStateToUI(suggestionViewState);
|
||||||
(failure) => const SizedBox.shrink(),
|
}
|
||||||
(success) => success is LoadingState
|
}
|
||||||
? Padding(
|
);
|
||||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
}
|
||||||
child: loadingWidget
|
|
||||||
)
|
Widget _suggestionViewStateToUI(Either<Failure, Success> viewState) {
|
||||||
: const SizedBox.shrink()
|
return viewState.fold(
|
||||||
|
(failure) => const SizedBox.shrink(),
|
||||||
|
(success) {
|
||||||
|
if (success is LoadingState) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||||
|
child: loadingWidget
|
||||||
);
|
);
|
||||||
|
} else {
|
||||||
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user