TF-3087 [MOBILE] Add loading bar for suggestion search
This commit is contained in:
@@ -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()
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user