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() {
|
Widget createSuggestionsWidget() {
|
||||||
final listItemSuggestionWidget = _buildListViewSuggestionWidget();
|
final listItemSuggestionWidget = _buildListViewSuggestionWidget();
|
||||||
final loadingWidget = _buildLoadingBarWidget();
|
final loadingWidget = _buildLoadingBarWidget();
|
||||||
final listAction = _buildListActionWidget();
|
final listActionWidget = _buildListActionWidget();
|
||||||
final listItemContactWidget = _buildListViewContactWidget();
|
final listItemContactWidget = _buildListViewContactWidget();
|
||||||
|
|
||||||
Widget child = ListView(
|
Widget child = ListView(
|
||||||
@@ -1212,7 +1212,7 @@ class _SuggestionsListState<T, P, R> extends State<_SuggestionsList<T, P, R>>
|
|||||||
controller: _scrollController,
|
controller: _scrollController,
|
||||||
reverse: widget.suggestionsBox!.direction == AxisDirection.down ? false : true, // reverses the list to start at the bottom
|
reverse: widget.suggestionsBox!.direction == AxisDirection.down ? false : true, // reverses the list to start at the bottom
|
||||||
children: [
|
children: [
|
||||||
if (listAction != null) listAction,
|
if (listActionWidget != null) listActionWidget,
|
||||||
if (loadingWidget != null) loadingWidget,
|
if (loadingWidget != null) loadingWidget,
|
||||||
if (widget.buttonShowAllResult != null && widget.controller?.text.isNotEmpty == true)
|
if (widget.buttonShowAllResult != null && widget.controller?.text.isNotEmpty == true)
|
||||||
widget.buttonShowAllResult!(context, widget.controller?.text),
|
widget.buttonShowAllResult!(context, widget.controller?.text),
|
||||||
@@ -1241,7 +1241,7 @@ class _SuggestionsListState<T, P, R> extends State<_SuggestionsList<T, P, R>>
|
|||||||
Widget createRecentWidget() {
|
Widget createRecentWidget() {
|
||||||
final listItemRecent = _buildListViewRecentWidget();
|
final listItemRecent = _buildListViewRecentWidget();
|
||||||
final loadingWidget = _buildLoadingBarWidget();
|
final loadingWidget = _buildLoadingBarWidget();
|
||||||
final listAction = _buildListActionWidget();
|
final listActionWidget = _buildListActionWidget();
|
||||||
|
|
||||||
Widget child = ListView(
|
Widget child = ListView(
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
@@ -1250,7 +1250,7 @@ class _SuggestionsListState<T, P, R> extends State<_SuggestionsList<T, P, R>>
|
|||||||
controller: _scrollController,
|
controller: _scrollController,
|
||||||
reverse: widget.suggestionsBox!.direction == AxisDirection.down ? false : true, // reverses the list to start at the bottom
|
reverse: widget.suggestionsBox!.direction == AxisDirection.down ? false : true, // reverses the list to start at the bottom
|
||||||
children: [
|
children: [
|
||||||
if (listAction != null) listAction,
|
if (listActionWidget != null) listActionWidget,
|
||||||
if (loadingWidget != null) loadingWidget,
|
if (loadingWidget != null) loadingWidget,
|
||||||
if (widget.buttonShowAllResult != null && widget.controller?.text.isNotEmpty == true)
|
if (widget.buttonShowAllResult != null && widget.controller?.text.isNotEmpty == true)
|
||||||
widget.buttonShowAllResult!(context, widget.controller?.text),
|
widget.buttonShowAllResult!(context, widget.controller?.text),
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ class SearchEmailController extends BaseController
|
|||||||
final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs;
|
final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs;
|
||||||
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));
|
||||||
|
|
||||||
late Debouncer<String> _deBouncerTime;
|
late Debouncer<String> _deBouncerTime;
|
||||||
late Worker dashBoardViewStateWorker;
|
late Worker dashBoardViewStateWorker;
|
||||||
@@ -177,6 +178,7 @@ class SearchEmailController extends BaseController
|
|||||||
initialValue: '');
|
initialValue: '');
|
||||||
_deBouncerTime.values.listen((value) async {
|
_deBouncerTime.values.listen((value) async {
|
||||||
log('SearchEmailController::_initializeDebounceTimeTextSearchChange(): $value');
|
log('SearchEmailController::_initializeDebounceTimeTextSearchChange(): $value');
|
||||||
|
suggestionSearchViewState.value = Right(LoadingState());
|
||||||
currentSearchText.value = value;
|
currentSearchText.value = value;
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
textOption: value.isNotEmpty ? Some(SearchQuery(value)) : const None(),
|
textOption: value.isNotEmpty ? Some(SearchQuery(value)) : const None(),
|
||||||
@@ -198,6 +200,7 @@ class SearchEmailController extends BaseController
|
|||||||
if (listSuggestionSearch.isEmpty && currentSearchText.isEmpty) {
|
if (listSuggestionSearch.isEmpty && currentSearchText.isEmpty) {
|
||||||
listRecentSearch.value = await getAllRecentSearchAction(pattern: value);
|
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_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/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_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';
|
||||||
@@ -74,7 +75,10 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
),
|
),
|
||||||
const Divider(color: AppColor.colorDividerComposer, height: 1),
|
const Divider(color: AppColor.colorDividerComposer, height: 1),
|
||||||
_buildListSearchFilterAction(context),
|
_buildListSearchFilterAction(context),
|
||||||
_buildLoadingView(),
|
Obx(() => SearchEmailLoadingBarWidget(
|
||||||
|
suggestionViewState: controller.suggestionSearchViewState.value,
|
||||||
|
resultSearchViewState: controller.viewState.value,
|
||||||
|
)),
|
||||||
Expanded(child: Obx(() {
|
Expanded(child: Obx(() {
|
||||||
if (controller.searchIsRunning.isFalse) {
|
if (controller.searchIsRunning.isFalse) {
|
||||||
return SingleChildScrollView(
|
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) {
|
List<Widget> _contextMenuActionTile(BuildContext context, PresentationEmail email) {
|
||||||
return <Widget>[
|
return <Widget>[
|
||||||
_markAsEmailSpamOrUnSpamAction(context, email),
|
_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