From 9ad41d9a6f9580a8245ecc26a412fc30faa73060 Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Mon, 8 Aug 2022 11:33:10 +0700 Subject: [PATCH] add interactor get all rules --- .../datasource/manage_account_datasource.dart | 3 + .../manage_account_datasource_impl.dart | 10 +++ .../data/network/manage_account_api.dart | 30 +++++++ .../manage_account_repository_impl.dart | 6 ++ .../repository/manage_account_repository.dart | 3 + .../domain/state/get_all_rules_state.dart | 20 +++++ .../usecases/get_all_rules_interactor.dart | 23 ++++++ .../email_rules/email_rules_bindings.dart | 32 ++++++++ .../email_rules/email_rules_controller.dart | 45 +++++++++-- .../email_rules/email_rules_view.dart | 15 +++- .../widgets/email_rule_item_widget.dart | 4 +- .../widgets/list_email_rules_widget.dart | 81 ++++++++++--------- .../profiles/profiles_bindings.dart | 2 + 13 files changed, 226 insertions(+), 48 deletions(-) create mode 100644 lib/features/manage_account/domain/state/get_all_rules_state.dart create mode 100644 lib/features/manage_account/domain/usecases/get_all_rules_interactor.dart diff --git a/lib/features/manage_account/data/datasource/manage_account_datasource.dart b/lib/features/manage_account/data/datasource/manage_account_datasource.dart index d6bc6d5dc..36554ff21 100644 --- a/lib/features/manage_account/data/datasource/manage_account_datasource.dart +++ b/lib/features/manage_account/data/datasource/manage_account_datasource.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:rule_filter/rule_filter/tmail_rule.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart'; @@ -17,4 +18,6 @@ abstract class ManageAccountDataSource { Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest); Future persistLanguage(Locale localeCurrent); + + Future> getAllTMailRule(AccountId accountId); } \ No newline at end of file diff --git a/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart b/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart index 2a34cb414..c15db25e7 100644 --- a/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart +++ b/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:rule_filter/rule_filter/tmail_rule.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart'; @@ -61,4 +62,13 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource { throw error; }); } + + @override + Future> getAllTMailRule(AccountId accountId) { + return Future.sync(() async { + return await manageAccountAPI.getListTMailRule(accountId); + }).catchError((error) { + throw error; + }); + } } \ No newline at end of file diff --git a/lib/features/manage_account/data/network/manage_account_api.dart b/lib/features/manage_account/data/network/manage_account_api.dart index 302722e50..a0ca40352 100644 --- a/lib/features/manage_account/data/network/manage_account_api.dart +++ b/lib/features/manage_account/data/network/manage_account_api.dart @@ -10,6 +10,9 @@ import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/identities/set/set_identity_method.dart'; import 'package:jmap_dart_client/jmap/identities/set/set_identity_response.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; +import 'package:rule_filter/rule_filter/get/get_rule_filter_method.dart'; +import 'package:rule_filter/rule_filter/get/get_rule_filter_response.dart'; +import 'package:rule_filter/rule_filter/tmail_rule.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart'; @@ -114,4 +117,31 @@ class ManageAccountAPI { throw error; }); } + + Future> getListTMailRule(AccountId accountId) async { + final processingInvocation = ProcessingInvocation(); + final requestBuilder = + JmapRequestBuilder(_httpClient, processingInvocation); + + final getRuleFilterMethod = GetRuleFilterMethod( + accountId, + ); + + final getRuleFilterInvocation = + requestBuilder.invocation(getRuleFilterMethod); + final response = await (requestBuilder + ..usings(getRuleFilterMethod.requiredCapabilities)) + .build() + .execute(); + + final result = response.parse( + getRuleFilterInvocation.methodCallId, + GetRuleFilterResponse.deserialize); + + if (result?.list.isEmpty == true) { + return []; + } + + return result?.list.first.rules ?? []; + } } \ No newline at end of file diff --git a/lib/features/manage_account/data/repository/manage_account_repository_impl.dart b/lib/features/manage_account/data/repository/manage_account_repository_impl.dart index 764d4b4ef..e4bcfc283 100644 --- a/lib/features/manage_account/data/repository/manage_account_repository_impl.dart +++ b/lib/features/manage_account/data/repository/manage_account_repository_impl.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:rule_filter/rule_filter/tmail_rule.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; @@ -39,4 +40,9 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository { Future persistLanguage(Locale localeCurrent) { return dataSource.persistLanguage(localeCurrent); } + + @override + Future> getAllTMailRule(AccountId accountId) { + return dataSource.getAllTMailRule(accountId); + } } \ No newline at end of file diff --git a/lib/features/manage_account/domain/repository/manage_account_repository.dart b/lib/features/manage_account/domain/repository/manage_account_repository.dart index e8b1b7bc5..6706a18d0 100644 --- a/lib/features/manage_account/domain/repository/manage_account_repository.dart +++ b/lib/features/manage_account/domain/repository/manage_account_repository.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:rule_filter/rule_filter/tmail_rule.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart'; @@ -17,4 +18,6 @@ abstract class ManageAccountRepository { Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest); Future persistLanguage(Locale localeCurrent); + + Future> getAllTMailRule(AccountId accountId); } \ No newline at end of file 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 new file mode 100644 index 000000000..e1320da18 --- /dev/null +++ b/lib/features/manage_account/domain/state/get_all_rules_state.dart @@ -0,0 +1,20 @@ +import 'package:core/core.dart'; +import 'package:rule_filter/rule_filter/tmail_rule.dart'; + +class GetAllRulesSuccess extends UIState { + final List? rules; + + GetAllRulesSuccess(this.rules); + + @override + List get props => [rules]; +} + +class GetAllRulesFailure extends FeatureFailure { + final dynamic exception; + + GetAllRulesFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file 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 new file mode 100644 index 000000000..238d2d382 --- /dev/null +++ b/lib/features/manage_account/domain/usecases/get_all_rules_interactor.dart @@ -0,0 +1,23 @@ +import 'dart:core'; + +import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_rules_state.dart'; + +class GetAllRulesInteractor { + final ManageAccountRepository manageAccountRepository; + + GetAllRulesInteractor(this.manageAccountRepository); + + Stream> execute(AccountId accountId) async* { + try { + yield Right(LoadingState()); + final rulesResponse = await manageAccountRepository.getAllTMailRule(accountId); + yield Right(GetAllRulesSuccess(rulesResponse)); + } catch (exception) { + yield Left(GetAllRulesFailure(exception)); + } + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/email_rules/email_rules_bindings.dart b/lib/features/manage_account/presentation/email_rules/email_rules_bindings.dart index e69de29bb..bbae30886 100644 --- a/lib/features/manage_account/presentation/email_rules/email_rules_bindings.dart +++ b/lib/features/manage_account/presentation/email_rules/email_rules_bindings.dart @@ -0,0 +1,32 @@ +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart'; + +class EmailRulesBindings extends BaseBindings { + + @override + void bindingsController() { + Get.lazyPut(() => EmailRulesController( + Get.find(), + )); + } + + @override + void bindingsDataSource() {} + + @override + void bindingsDataSourceImpl() {} + + @override + void bindingsInteractor() { + Get.lazyPut(() => GetAllRulesInteractor(Get.find())); + } + + @override + void bindingsRepository() {} + + @override + void bindingsRepositoryImpl() {} +} \ No newline at end of file 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 b19addb98..a5387bce5 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,34 +1,65 @@ import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:rule_filter/rule_filter/tmail_rule.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_rules_state.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; class EmailRulesController extends BaseController { - final listEmailRule = [].obs; + final _accountDashBoardController = Get.find(); + final GetAllRulesInteractor _getAllRulesInteractor; + late Worker accountIdWorker; - EmailRulesController(); + EmailRulesController(this._getAllRulesInteractor); - @override - void onReady() { - super.onReady(); + void _clearWorker() { + accountIdWorker.call(); } @override void onDone() { + viewState.value.fold( + (failure) {}, + (success) { + if (success is GetAllRulesSuccess) { + if (success.rules?.isNotEmpty == true) { + listEmailRule.addAll(success.rules!); + } + } + } + ); } @override void onError(error) {} + @override + void onInit() { + _getAllRules(_accountDashBoardController.accountId.value!); + super.onInit(); + } + + @override + void onClose() { + _clearWorker(); + super.onClose(); + } + void goToCreateNewRule() { //TODO: goToCreateNewRule } - void editEmailRule(TMailRule rule){ + void editEmailRule(TMailRule rule) { //TODO: editEmailRule } - void deleteEmailRule(TMailRule rule){ + void deleteEmailRule(TMailRule rule) { //TODO: deleteEmailRule } + + void _getAllRules(AccountId accountId) { + consumeState(_getAllRulesInteractor.execute(accountId)); + } } 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 96dfca55c..9935c89d4 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,11 +1,12 @@ import 'package:core/core.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/email_rules/email_rules_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/widgets/list_email_rules_widget.dart'; -class EmailRulesView extends GetWidget { +class EmailRulesView extends GetWidget with AppLoaderMixin { final _responsiveUtils = Get.find(); final _imagePaths = Get.find(); @@ -41,6 +42,7 @@ class EmailRulesView extends GetWidget { }, ), const SizedBox(height: 22), + _buildLoadingView(), const Expanded(child: ListEmailRulesWidget()) ], ), @@ -49,4 +51,15 @@ class EmailRulesView extends GetWidget { ), ); } + + Widget _buildLoadingView() { + return Obx(() => controller.viewState.value.fold( + (failure) => const SizedBox.shrink(), + (success) => success is LoadingState + ? Padding( + padding: const EdgeInsets.only(bottom: 24), + child: loadingWidget) + : const SizedBox.shrink() + )); + } } diff --git a/lib/features/manage_account/presentation/email_rules/widgets/email_rule_item_widget.dart b/lib/features/manage_account/presentation/email_rules/widgets/email_rule_item_widget.dart index 2edbf8cc5..4c98fa151 100644 --- a/lib/features/manage_account/presentation/email_rules/widgets/email_rule_item_widget.dart +++ b/lib/features/manage_account/presentation/email_rules/widgets/email_rule_item_widget.dart @@ -24,7 +24,7 @@ class EmailRulesItemWidget extends GetWidget { return Container( padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 24), color: Colors.white, - child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ + child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ Text(rule.name, style: const TextStyle( fontSize: 16, @@ -41,7 +41,7 @@ class EmailRulesItemWidget extends GetWidget { }), buildIconWeb( icon: SvgPicture.asset( - _imagePaths.icDeleteAttachment, + _imagePaths.icDeleteRule, fit: BoxFit.fill, ), onTap: () { diff --git a/lib/features/manage_account/presentation/email_rules/widgets/list_email_rules_widget.dart b/lib/features/manage_account/presentation/email_rules/widgets/list_email_rules_widget.dart index c6609bc18..a5deee8e8 100644 --- a/lib/features/manage_account/presentation/email_rules/widgets/list_email_rules_widget.dart +++ b/lib/features/manage_account/presentation/email_rules/widgets/list_email_rules_widget.dart @@ -15,48 +15,53 @@ class ListEmailRulesWidget extends GetWidget { color: AppColor.colorBackgroundWrapIconStyleCode, borderRadius: BorderRadius.circular(16), ), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: const EdgeInsets.symmetric( - vertical: 28, - horizontal: 24, - ), - child: Text(AppLocalizations.of(context).headerNameOfRules, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: AppColor.colorTextButtonHeaderThread)), - ), - const Divider( - color: AppColor.lineItemListColor, - height: 1, - thickness: 0.2, - ), - Expanded( - child: ListView.separated( - shrinkWrap: true, - itemCount: controller.listEmailRule.length, - itemBuilder: (context, index) { - final rule = controller.listEmailRule[index]; - return EmailRulesItemWidget( - rule: rule, - editRule: (rule) { - controller.editEmailRule(rule); - }, - deleteRule: (rule) { - controller.editEmailRule(rule); - }, - ); - }, - separatorBuilder: (BuildContext context, int index) => - const Divider( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 28, + horizontal: 24, + ), + child: Text(AppLocalizations.of(context).headerNameOfRules, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: AppColor.colorTextButtonHeaderThread)), + ), + const Divider( color: AppColor.lineItemListColor, height: 1, thickness: 0.2, ), - ), - ), - ]), + Expanded( + child: Obx( + () => ListView.separated( + shrinkWrap: true, + itemCount: controller.listEmailRule.length, + itemBuilder: (context, index) { + final rule = controller.listEmailRule[index]; + return EmailRulesItemWidget( + rule: rule, + editRule: (rule) { + controller.editEmailRule(rule); + }, + deleteRule: (rule) { + controller.editEmailRule(rule); + }, + ); + }, + separatorBuilder: (BuildContext context, int index) => + const Divider( + color: AppColor.lineItemListColor, + height: 1, + thickness: 0.2, + ), + ), + ), + ), + ]), ); } } diff --git a/lib/features/manage_account/presentation/profiles/profiles_bindings.dart b/lib/features/manage_account/presentation/profiles/profiles_bindings.dart index 95d4381c7..91b905a2c 100644 --- a/lib/features/manage_account/presentation/profiles/profiles_bindings.dart +++ b/lib/features/manage_account/presentation/profiles/profiles_bindings.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identities_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/profiles_controller.dart'; @@ -9,6 +10,7 @@ class ProfileBindings extends BaseBindings { void dependencies() { super.dependencies(); IdentitiesBindings().dependencies(); + EmailRulesBindings().dependencies(); } @override