diff --git a/core/lib/presentation/views/quick_search/quick_search_input_form.dart b/core/lib/presentation/views/quick_search/quick_search_input_form.dart index 4bdabf824..1a159229d 100644 --- a/core/lib/presentation/views/quick_search/quick_search_input_form.dart +++ b/core/lib/presentation/views/quick_search/quick_search_input_form.dart @@ -1202,7 +1202,7 @@ class _SuggestionsListState extends State<_SuggestionsList> Widget createSuggestionsWidget() { final listItemSuggestionWidget = _buildListViewSuggestionWidget(); final loadingWidget = _buildLoadingBarWidget(); - final listAction = _buildListActionWidget(); + final listActionWidget = _buildListActionWidget(); final listItemContactWidget = _buildListViewContactWidget(); Widget child = ListView( @@ -1212,7 +1212,7 @@ class _SuggestionsListState extends State<_SuggestionsList> controller: _scrollController, reverse: widget.suggestionsBox!.direction == AxisDirection.down ? false : true, // reverses the list to start at the bottom children: [ - if (listAction != null) listAction, + if (listActionWidget != null) listActionWidget, if (loadingWidget != null) loadingWidget, if (widget.buttonShowAllResult != null && widget.controller?.text.isNotEmpty == true) widget.buttonShowAllResult!(context, widget.controller?.text), @@ -1241,7 +1241,7 @@ class _SuggestionsListState extends State<_SuggestionsList> Widget createRecentWidget() { final listItemRecent = _buildListViewRecentWidget(); final loadingWidget = _buildLoadingBarWidget(); - final listAction = _buildListActionWidget(); + final listActionWidget = _buildListActionWidget(); Widget child = ListView( padding: EdgeInsets.zero, @@ -1250,7 +1250,7 @@ class _SuggestionsListState extends State<_SuggestionsList> controller: _scrollController, reverse: widget.suggestionsBox!.direction == AxisDirection.down ? false : true, // reverses the list to start at the bottom children: [ - if (listAction != null) listAction, + if (listActionWidget != null) listActionWidget, if (loadingWidget != null) loadingWidget, if (widget.buttonShowAllResult != null && widget.controller?.text.isNotEmpty == true) widget.buttonShowAllResult!(context, widget.controller?.text), diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index dd0d63e35..929ec2eb5 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -104,6 +104,7 @@ class SearchEmailController extends BaseController final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs; final selectionMode = Rx(SelectMode.INACTIVE); final emailSortOrderType = EmailSortOrderType.mostRecent.obs; + final suggestionSearchViewState = Rx>(Right(UIState.idle)); late Debouncer _deBouncerTime; late Worker dashBoardViewStateWorker; @@ -177,6 +178,7 @@ class SearchEmailController extends BaseController initialValue: ''); _deBouncerTime.values.listen((value) async { log('SearchEmailController::_initializeDebounceTimeTextSearchChange(): $value'); + suggestionSearchViewState.value = Right(LoadingState()); currentSearchText.value = value; _updateSimpleSearchFilter( textOption: value.isNotEmpty ? Some(SearchQuery(value)) : const None(), @@ -198,6 +200,7 @@ class SearchEmailController extends BaseController if (listSuggestionSearch.isEmpty && currentSearchText.isEmpty) { listRecentSearch.value = await getAllRecentSearchAction(pattern: value); } + suggestionSearchViewState.value = Right(UIState.idle); }); } diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index fdfbc0322..5ed097a53 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -28,6 +28,7 @@ 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_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/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/presentation/styles/item_email_tile_styles.dart'; @@ -74,7 +75,10 @@ class SearchEmailView extends GetWidget ), const Divider(color: AppColor.colorDividerComposer, height: 1), _buildListSearchFilterAction(context), - _buildLoadingView(), + Obx(() => SearchEmailLoadingBarWidget( + suggestionViewState: controller.suggestionSearchViewState.value, + resultSearchViewState: controller.viewState.value, + )), Expanded(child: Obx(() { if (controller.searchIsRunning.isFalse) { return SingleChildScrollView( @@ -622,16 +626,6 @@ class SearchEmailView extends GetWidget ); } - Widget _buildLoadingView() { - return Obx(() => controller.viewState.value.fold( - (failure) => const SizedBox.shrink(), - (success) => success is SearchingState - ? Padding( - padding: const EdgeInsets.symmetric(vertical: 16), - child: loadingWidget) - : const SizedBox.shrink())); - } - List _contextMenuActionTile(BuildContext context, PresentationEmail email) { return [ _markAsEmailSpamOrUnSpamAction(context, email), diff --git a/lib/features/search/email/presentation/widgets/search_email_loading_bar_widget.dart b/lib/features/search/email/presentation/widgets/search_email_loading_bar_widget.dart new file mode 100644 index 000000000..d03840570 --- /dev/null +++ b/lib/features/search/email/presentation/widgets/search_email_loading_bar_widget.dart @@ -0,0 +1,54 @@ + +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/base/mixin/app_loader_mixin.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart'; + +class SearchEmailLoadingBarWidget extends StatelessWidget with AppLoaderMixin { + + final Either resultSearchViewState; + final Either suggestionViewState; + + const SearchEmailLoadingBarWidget({ + super.key, + required this.resultSearchViewState, + required this.suggestionViewState + }); + + @override + Widget build(BuildContext context) { + return resultSearchViewState.fold( + (failure) { + return suggestionViewState.fold( + (failure) => const SizedBox.shrink(), + (success) => success is LoadingState + ? Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: loadingWidget + ) + : const SizedBox.shrink() + ); + }, + (success) { + if (success is SearchingState) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: loadingWidget + ); + } else { + return suggestionViewState.fold( + (failure) => const SizedBox.shrink(), + (success) => success is LoadingState + ? Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: loadingWidget + ) + : const SizedBox.shrink() + ); + } + } + ); + } +} \ No newline at end of file