TF-3087 [MOBILE] Add loading bar for suggestion search

This commit is contained in:
dab246
2024-09-13 17:14:03 +07:00
committed by Dat H. Pham
parent 4494f7bdaf
commit 7daab0bb1a
4 changed files with 66 additions and 15 deletions
@@ -1202,7 +1202,7 @@ class _SuggestionsListState<T, P, R> extends State<_SuggestionsList<T, P, R>>
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<T, P, R> extends State<_SuggestionsList<T, P, R>>
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<T, P, R> extends State<_SuggestionsList<T, P, R>>
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<T, P, R> extends State<_SuggestionsList<T, P, R>>
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),
@@ -104,6 +104,7 @@ class SearchEmailController extends BaseController
final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs;
final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE);
final emailSortOrderType = EmailSortOrderType.mostRecent.obs;
final suggestionSearchViewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
late Debouncer<String> _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);
});
}
@@ -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<SearchEmailController>
),
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<SearchEmailController>
);
}
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<Widget> _contextMenuActionTile(BuildContext context, PresentationEmail email) {
return <Widget>[
_markAsEmailSpamOrUnSpamAction(context, email),
@@ -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<Failure, Success> resultSearchViewState;
final Either<Failure, Success> 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()
);
}
}
);
}
}