Skip to content

Commit

Permalink
TF-3087 [MOBILE] Add loading bar for suggestion search
Browse files Browse the repository at this point in the history
  • Loading branch information
dab246 authored and hoangdat committed Sep 16, 2024
1 parent 4494f7b commit 7daab0b
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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),
Expand Down Expand Up @@ -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,
Expand All @@ -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),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(),
Expand All @@ -198,6 +200,7 @@ class SearchEmailController extends BaseController
if (listSuggestionSearch.isEmpty && currentSearchText.isEmpty) {
listRecentSearch.value = await getAllRecentSearchAction(pattern: value);
}
suggestionSearchViewState.value = Right(UIState.idle);
});
}

Expand Down
16 changes: 5 additions & 11 deletions lib/features/search/email/presentation/search_email_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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),
Expand Down
Original file line number Diff line number Diff line change
@@ -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()
);
}
}
);
}
}

0 comments on commit 7daab0b

Please sign in to comment.