From dab3dc3b99fa33b4410b153e2fa05c1303026808 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 9 Sep 2025 04:17:36 +0700 Subject: [PATCH] TF-4004 Add loading bar for email rule filter view --- .../domain/state/get_all_rules_state.dart | 2 ++ .../usecases/get_all_rules_interactor.dart | 2 +- .../email_rules/email_rules_controller.dart | 18 +++++++++++++ .../email_rules/email_rules_view.dart | 26 ++++++++++++++----- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/lib/features/manage_account/domain/state/get_all_rules_state.dart b/lib/features/manage_account/domain/state/get_all_rules_state.dart index d512a2d4e..965316a56 100644 --- a/lib/features/manage_account/domain/state/get_all_rules_state.dart +++ b/lib/features/manage_account/domain/state/get_all_rules_state.dart @@ -2,6 +2,8 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:rule_filter/rule_filter/tmail_rule.dart'; +class GettingAllRules extends LoadingState {} + class GetAllRulesSuccess extends UIState { final List? rules; diff --git a/lib/features/manage_account/domain/usecases/get_all_rules_interactor.dart b/lib/features/manage_account/domain/usecases/get_all_rules_interactor.dart index ec84f8a80..18f7a0889 100644 --- a/lib/features/manage_account/domain/usecases/get_all_rules_interactor.dart +++ b/lib/features/manage_account/domain/usecases/get_all_rules_interactor.dart @@ -13,7 +13,7 @@ class GetAllRulesInteractor { Stream> execute(AccountId accountId) async* { try { - yield Right(LoadingState()); + yield Right(GettingAllRules()); final rulesResponse = await _ruleFilterRepository.getAllTMailRule(accountId); yield Right(GetAllRulesSuccess(rulesResponse)); } catch (exception) { diff --git a/lib/features/manage_account/presentation/email_rules/email_rules_controller.dart b/lib/features/manage_account/presentation/email_rules/email_rules_controller.dart index 54f7f1b03..1953d43a7 100644 --- a/lib/features/manage_account/presentation/email_rules/email_rules_controller.dart +++ b/lib/features/manage_account/presentation/email_rules/email_rules_controller.dart @@ -1,6 +1,8 @@ +import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:core/utils/app_logger.dart'; import 'package:core/utils/platform_info.dart'; +import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; @@ -39,6 +41,11 @@ class EmailRulesController extends BaseController { final listEmailRule = [].obs; + bool get isLoading => viewState.value.fold( + (failure) => false, + (success) => success is GettingAllRules, + ); + @override void onInit() { super.onInit(); @@ -75,6 +82,15 @@ class EmailRulesController extends BaseController { } } + @override + void handleFailureViewState(Failure failure) { + if (failure is GetAllRulesFailure) { + listEmailRule.clear(); + } else { + super.handleFailureViewState(failure); + } + } + Future goToCreateNewRule() async { final accountId = _accountDashBoardController.accountId.value; final session = _accountDashBoardController.sessionCurrent; @@ -216,6 +232,8 @@ class EmailRulesController extends BaseController { void _getAllRules() { if (_getAllRulesInteractor != null) { consumeState(_getAllRulesInteractor!.execute(_accountDashBoardController.accountId.value!)); + } else { + consumeState(Stream.value(Left(GetAllRulesFailure(null)))); } } diff --git a/lib/features/manage_account/presentation/email_rules/email_rules_view.dart b/lib/features/manage_account/presentation/email_rules/email_rules_view.dart index 1c38bec65..e1f16dcec 100644 --- a/lib/features/manage_account/presentation/email_rules/email_rules_view.dart +++ b/lib/features/manage_account/presentation/email_rules/email_rules_view.dart @@ -1,6 +1,7 @@ import 'package:core/presentation/utils/theme_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/base/setting_detail_view_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/widgets/add_rule_button_widget.dart'; @@ -13,7 +14,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/email_r import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_explanation_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_header_widget.dart'; -class EmailRulesView extends GetWidget { +class EmailRulesView extends GetWidget + with AppLoaderMixin { const EmailRulesView({Key? key}) : super(key: key); @override @@ -92,13 +94,25 @@ class EmailRulesView extends GetWidget { ), ), ), + Obx( + () => controller.isLoading + ? Padding( + padding: const EdgeInsets.only(top: 8.0), + child: loadingWidget, + ) + : const SizedBox.shrink(), + ), Obx(() { if (controller.listEmailRule.isEmpty) { - return NoRulesWidget( - imagePaths: controller.imagePaths, - responsiveUtils: controller.responsiveUtils, - onAddRuleAction: controller.goToCreateNewRule, - ); + if (controller.isLoading) { + return const SizedBox.shrink(); + } else { + return NoRulesWidget( + imagePaths: controller.imagePaths, + responsiveUtils: controller.responsiveUtils, + onAddRuleAction: controller.goToCreateNewRule, + ); + } } else { return Expanded( child: ListEmailRulesWidget(