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 36554ff21..c06c58801 100644 --- a/lib/features/manage_account/data/datasource/manage_account_datasource.dart +++ b/lib/features/manage_account/data/datasource/manage_account_datasource.dart @@ -5,6 +5,7 @@ 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/delete_email_rule_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'; @@ -20,4 +21,7 @@ abstract class ManageAccountDataSource { Future persistLanguage(Locale localeCurrent); Future> getAllTMailRule(AccountId accountId); + + Future> deleteTMailRule(AccountId accountId, DeleteEmailRuleRequest deleteEmailRuleRequest); + } \ 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 c15db25e7..39f654562 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 @@ -8,29 +8,34 @@ import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_acc 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'; 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/delete_email_rule_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'; class ManageAccountDataSourceImpl extends ManageAccountDataSource { - final ManageAccountAPI manageAccountAPI; final LanguageCacheManager _languageCacheManager; - ManageAccountDataSourceImpl(this.manageAccountAPI, this._languageCacheManager); + ManageAccountDataSourceImpl( + this.manageAccountAPI, this._languageCacheManager); @override - Future getAllIdentities(AccountId accountId, {Properties? properties}) { + Future getAllIdentities(AccountId accountId, + {Properties? properties}) { return Future.sync(() async { - return await manageAccountAPI.getAllIdentities(accountId, properties: properties); + return await manageAccountAPI.getAllIdentities(accountId, + properties: properties); }).catchError((error) { throw error; }); } @override - Future createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) { + Future createNewIdentity( + AccountId accountId, CreateNewIdentityRequest identityRequest) { return Future.sync(() async { - return await manageAccountAPI.createNewIdentity(accountId, identityRequest); + return await manageAccountAPI.createNewIdentity( + accountId, identityRequest); }).catchError((error) { throw error; }); @@ -46,9 +51,11 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource { } @override - Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) { + Future editIdentity( + AccountId accountId, EditIdentityRequest editIdentityRequest) { return Future.sync(() async { - return await manageAccountAPI.editIdentity(accountId, editIdentityRequest); + return await manageAccountAPI.editIdentity( + accountId, editIdentityRequest); }).catchError((error) { throw error; }); @@ -71,4 +78,16 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource { throw error; }); } -} \ No newline at end of file + + @override + Future> deleteTMailRule(AccountId accountId, DeleteEmailRuleRequest deleteEmailRuleRequest) { + + deleteEmailRuleRequest.currentEmailRules.remove(deleteEmailRuleRequest.emailRuleDelete); + + return Future.sync(() async { + return await manageAccountAPI.updateListTMailRule(accountId, deleteEmailRuleRequest.currentEmailRules); + }).catchError((error) { + throw error; + }); + } +} 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 a59aa930b..8787e540c 100644 --- a/lib/features/manage_account/data/network/manage_account_api.dart +++ b/lib/features/manage_account/data/network/manage_account_api.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/patch_object.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/get/get_identity_method.dart'; @@ -12,6 +13,9 @@ 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/rule_filter_id.dart'; +import 'package:rule_filter/rule_filter/rule_id.dart'; +import 'package:rule_filter/rule_filter/set/set_rule_filter_method.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'; @@ -123,8 +127,8 @@ class ManageAccountAPI { final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation); final getRuleFilterMethod = GetRuleFilterMethod( - accountId, - ); + accountId, + )..addIds({RuleFilterIdSingleton.ruleFilterIdSingleton.id}); final getRuleFilterInvocation = requestBuilder.invocation(getRuleFilterMethod); final response = await (requestBuilder @@ -142,4 +146,42 @@ class ManageAccountAPI { return result?.list.first.rules ?? []; } + + Future> updateListTMailRule(AccountId accountId, List listTMailRule) async { + + final List listTMailRuleWithId = listTMailRule + .asMap() + .map((key, value) => MapEntry(key, value.copyWith(id: RuleId(id: Id(key.toString()))))) + .values + .toList(); + + final processingInvocation = ProcessingInvocation(); + final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation); + + final setRuleFilterMethod = SetRuleFilterMethod(accountId) + ..addUpdateRuleFilter({Id(RuleFilterIdType.singleton.value): listTMailRuleWithId}); + + requestBuilder.invocation(setRuleFilterMethod); + + final getListTMailRuleUpdated = GetRuleFilterMethod(accountId) + ..addIds({RuleFilterIdSingleton.ruleFilterIdSingleton.id}); + + final getListTMailRuleUpdatedInvocation = requestBuilder.invocation(getListTMailRuleUpdated); + + final response = await (requestBuilder + ..usings(getListTMailRuleUpdated.requiredCapabilities)) + .build() + .execute(); + + + final result = response.parse( + getListTMailRuleUpdatedInvocation.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 e4bcfc283..3b01ceddc 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 @@ -6,6 +6,7 @@ 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/delete_email_rule_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'; import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; @@ -45,4 +46,9 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository { Future> getAllTMailRule(AccountId accountId) { return dataSource.getAllTMailRule(accountId); } + + @override + Future> deleteTMailRule(AccountId accountId, DeleteEmailRuleRequest deleteEmailRuleRequest) { + return dataSource.deleteTMailRule(accountId, deleteEmailRuleRequest); + } } \ No newline at end of file diff --git a/lib/features/manage_account/domain/model/delete_email_rule_request.dart b/lib/features/manage_account/domain/model/delete_email_rule_request.dart new file mode 100644 index 000000000..471cde913 --- /dev/null +++ b/lib/features/manage_account/domain/model/delete_email_rule_request.dart @@ -0,0 +1,15 @@ +import 'package:equatable/equatable.dart'; +import 'package:rule_filter/rule_filter/tmail_rule.dart'; + +class DeleteEmailRuleRequest with EquatableMixin { + final TMailRule emailRuleDelete; + final List currentEmailRules; + + DeleteEmailRuleRequest({ + required this.emailRuleDelete, + required this.currentEmailRules, + }); + + @override + List get props => [emailRuleDelete, currentEmailRules]; +} 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 6706a18d0..5e93d120f 100644 --- a/lib/features/manage_account/domain/repository/manage_account_repository.dart +++ b/lib/features/manage_account/domain/repository/manage_account_repository.dart @@ -5,6 +5,7 @@ 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/delete_email_rule_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'; @@ -20,4 +21,7 @@ abstract class ManageAccountRepository { Future persistLanguage(Locale localeCurrent); Future> getAllTMailRule(AccountId accountId); + + Future> deleteTMailRule(AccountId accountId, DeleteEmailRuleRequest deleteEmailRuleRequest); + } \ No newline at end of file diff --git a/lib/features/manage_account/domain/state/delete_email_rule_state.dart b/lib/features/manage_account/domain/state/delete_email_rule_state.dart new file mode 100644 index 000000000..8f99bafdc --- /dev/null +++ b/lib/features/manage_account/domain/state/delete_email_rule_state.dart @@ -0,0 +1,20 @@ +import 'package:core/core.dart'; +import 'package:rule_filter/rule_filter/tmail_rule.dart'; + +class DeleteEmailRuleSuccess extends UIState { + final List? rules; + + DeleteEmailRuleSuccess(this.rules); + + @override + List get props => [rules]; +} + +class DeleteEmailRuleFailure extends FeatureFailure { + final dynamic exception; + + DeleteEmailRuleFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/manage_account/domain/usecases/delete_email_rule_interactor.dart b/lib/features/manage_account/domain/usecases/delete_email_rule_interactor.dart new file mode 100644 index 000000000..8f33c4011 --- /dev/null +++ b/lib/features/manage_account/domain/usecases/delete_email_rule_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/model/delete_email_rule_request.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/delete_email_rule_state.dart'; + +class DeleteEmailRuleInteractor { + final ManageAccountRepository manageAccountRepository; + + DeleteEmailRuleInteractor(this.manageAccountRepository); + + Stream> execute(AccountId accountId, DeleteEmailRuleRequest deleteEmailRuleRequest) async* { + try { + final result = await manageAccountRepository.deleteTMailRule(accountId, deleteEmailRuleRequest); + yield Right(DeleteEmailRuleSuccess(result)); + } catch (exception) { + yield Left(DeleteEmailRuleFailure(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 bbae30886..09e46f211 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 @@ -1,6 +1,7 @@ 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/delete_email_rule_interactor.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'; @@ -10,6 +11,7 @@ class EmailRulesBindings extends BaseBindings { void bindingsController() { Get.lazyPut(() => EmailRulesController( Get.find(), + Get.find(), )); } @@ -22,6 +24,7 @@ class EmailRulesBindings extends BaseBindings { @override void bindingsInteractor() { Get.lazyPut(() => GetAllRulesInteractor(Get.find())); + Get.lazyPut(() => DeleteEmailRuleInteractor(Get.find())); } @override 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 c20348215..364cee9b9 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 @@ -3,23 +3,27 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; 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/model/delete_email_rule_request.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/delete_email_rule_state.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/delete_email_rule_interactor.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/widgets/email_rule_bottom_sheet_action_tile_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class EmailRulesController extends BaseController { final listEmailRule = [].obs; final _accountDashBoardController = Get.find(); final GetAllRulesInteractor _getAllRulesInteractor; + final DeleteEmailRuleInteractor _deleteEmailRuleInteractor; final _imagePaths = Get.find(); - EmailRulesController(this._getAllRulesInteractor); + EmailRulesController(this._getAllRulesInteractor, this._deleteEmailRuleInteractor); @override void onDone() { @@ -29,6 +33,12 @@ class EmailRulesController extends BaseController { listEmailRule.addAll(success.rules!); } } + if (success is DeleteEmailRuleSuccess) { + if (success.rules?.isNotEmpty == true) { + listEmailRule.clear(); + listEmailRule.addAll(success.rules!); + } + } }); } @@ -37,7 +47,7 @@ class EmailRulesController extends BaseController { @override void onInit() { - _getAllRules(_accountDashBoardController.accountId.value!); + _getAllRules(); super.onInit(); } @@ -49,12 +59,16 @@ class EmailRulesController extends BaseController { //TODO: editEmailRule } - void deleteEmailRule(TMailRule rule) { - //TODO: deleteEmailRule + void deleteEmailRule(TMailRule emailRule) { + final deleteEmailRuleRequest = DeleteEmailRuleRequest( + emailRuleDelete : emailRule, + currentEmailRules: listEmailRule, + ); + consumeState(_deleteEmailRuleInteractor.execute(_accountDashBoardController.accountId.value!, deleteEmailRuleRequest)); } - void _getAllRules(AccountId accountId) { - consumeState(_getAllRulesInteractor.execute(accountId)); + void _getAllRules() { + consumeState(_getAllRulesInteractor.execute(_accountDashBoardController.accountId.value!)); } void openEditRuleMenuAction(BuildContext context, TMailRule rule) { @@ -78,8 +92,10 @@ class EmailRulesController extends BaseController { iconRightPadding: const EdgeInsets.only(right: 12), textStyleAction: const TextStyle( fontSize: 17, color: AppColor.colorActionDeleteConfirmDialog), - )..onActionClick((rule) => deleteEmailRule(rule))) - .build(); + )..onActionClick((rule) { + deleteEmailRule(rule); + popBack(); + })).build(); } Widget _editEmailRuleActionTile(BuildContext context, TMailRule rule) { 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 b7a33c65a..d25078165 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 @@ -42,9 +42,7 @@ class ListEmailRulesWidget extends GetWidget { itemCount: controller.listEmailRule.length, itemBuilder: (context, index) { final rule = controller.listEmailRule[index]; - return EmailRulesItemWidget( - rule: rule, - ); + return EmailRulesItemWidget(rule: rule); }, separatorBuilder: (BuildContext context, int index) => const Divider( diff --git a/rule_filter/lib/rule_filter/converter/rule_id_nullable_converter.dart b/rule_filter/lib/rule_filter/converter/rule_id_nullable_converter.dart index eb9b4b35e..2304b73e7 100644 --- a/rule_filter/lib/rule_filter/converter/rule_id_nullable_converter.dart +++ b/rule_filter/lib/rule_filter/converter/rule_id_nullable_converter.dart @@ -1,5 +1,4 @@ import 'package:jmap_dart_client/jmap/core/id.dart'; -import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:rule_filter/rule_filter/rule_id.dart'; diff --git a/rule_filter/lib/rule_filter/get/get_rule_filter_method.dart b/rule_filter/lib/rule_filter/get/get_rule_filter_method.dart index cd6375329..057372f72 100644 --- a/rule_filter/lib/rule_filter/get/get_rule_filter_method.dart +++ b/rule_filter/lib/rule_filter/get/get_rule_filter_method.dart @@ -9,7 +9,6 @@ import 'package:jmap_dart_client/jmap/core/request/result_reference.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:rule_filter/rule_filter/converter/rule_id_converter.dart'; -import 'package:rule_filter/rule_filter/rule_id.dart'; part 'get_rule_filter_method.g.dart'; diff --git a/rule_filter/lib/rule_filter/get/get_rule_filter_response.dart b/rule_filter/lib/rule_filter/get/get_rule_filter_response.dart index debf91a32..fe464d1c9 100644 --- a/rule_filter/lib/rule_filter/get/get_rule_filter_response.dart +++ b/rule_filter/lib/rule_filter/get/get_rule_filter_response.dart @@ -7,7 +7,6 @@ import 'package:jmap_dart_client/jmap/core/method/response/get_response.dart'; import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:rule_filter/rule_filter/rule_filter.dart'; -import 'package:rule_filter/rule_filter/tmail_rule.dart'; part 'get_rule_filter_response.g.dart'; diff --git a/rule_filter/lib/rule_filter/rule_filter_id.dart b/rule_filter/lib/rule_filter/rule_filter_id.dart index 37a77bbcc..2a5d55979 100644 --- a/rule_filter/lib/rule_filter/rule_filter_id.dart +++ b/rule_filter/lib/rule_filter/rule_filter_id.dart @@ -1,7 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/http/converter/id_converter.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; -import 'package:json_annotation/json_annotation.dart'; import 'package:rule_filter/rule_filter/converter/rule_filter_id_coverter.dart'; enum RuleFilterIdType { diff --git a/rule_filter/lib/rule_filter/rule_id.dart b/rule_filter/lib/rule_filter/rule_id.dart index 7593811b9..89161b2e6 100644 --- a/rule_filter/lib/rule_filter/rule_id.dart +++ b/rule_filter/lib/rule_filter/rule_id.dart @@ -1,7 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/http/converter/id_converter.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; -import 'package:json_annotation/json_annotation.dart'; @IdConverter() class RuleId with EquatableMixin { diff --git a/rule_filter/lib/rule_filter/tmail_rule.dart b/rule_filter/lib/rule_filter/tmail_rule.dart index f6daa2dae..f448b1672 100644 --- a/rule_filter/lib/rule_filter/tmail_rule.dart +++ b/rule_filter/lib/rule_filter/tmail_rule.dart @@ -35,4 +35,18 @@ class TMailRule extends Rule { condition, action, ]; + + TMailRule copyWith({ + RuleId? id, + String? name, + RuleCondition? condition, + RuleAction? action, + }) { + return TMailRule( + id: id ?? this.id, + name: name ?? this.name, + condition: condition ?? this.condition, + action: action ?? this.action, + ); + } }