From 59d8fc0393a827c489e6045c6efa1f937d8e46ff Mon Sep 17 00:00:00 2001 From: hieubt Date: Mon, 2 Oct 2023 17:28:05 +0700 Subject: [PATCH] TF-2084 Update rule filter creator controller for multi actions (cherry picked from commit a6b70ca579ef7455bd4b5f143a309746d3f97630) --- .../rules_filter_creator_controller.dart | 120 +++++++++++++++--- 1 file changed, 100 insertions(+), 20 deletions(-) diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart index 5925c157d..00bbc198e 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart @@ -1,4 +1,3 @@ - import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/presentation/utils/keyboard_utils.dart'; @@ -36,6 +35,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_rules import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/email_rule_filter_action.dart'; +import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rule_filter_action_arguments.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -53,7 +53,6 @@ class RulesFilterCreatorController extends BaseMailboxController { GetAllRulesInteractor? _getAllRulesInteractor; final errorRuleName = Rxn(); - final errorRuleActionValue = Rxn(); final emailRuleFilterActionSelected = Rxn(); final mailboxSelected = Rxn(); final actionType = CreatorActionType.create.obs; @@ -64,6 +63,14 @@ class RulesFilterCreatorController extends BaseMailboxController { final listRuleConditionValueArguments = RxList(); final conditionCombinerType = Rxn(); + final errorMailboxSelectedValue = Rxn(); + final errorForwardEmailValue = Rxn(); + final TextEditingController forwardEmailController = TextEditingController(); + final FocusNode forwardEmailFocusNode = FocusNode(); + final listEmailRuleFilterActionSelected = RxList(); + int maxCountAction = EmailRuleFilterAction.values.where((action) => action.getSupported() == true).length - 1; + final isShowAddAction = Rxn(); + String? _newRuleName; RulesFilterCreatorArguments? arguments; @@ -118,6 +125,8 @@ class RulesFilterCreatorController extends BaseMailboxController { ruleConditionValueArguments.focusNode.dispose(); ruleConditionValueArguments.controller.dispose(); } + forwardEmailFocusNode.dispose(); + forwardEmailController.dispose(); super.onClose(); } @@ -160,7 +169,9 @@ class RulesFilterCreatorController extends BaseMailboxController { controller: TextEditingController(), ); listRuleConditionValueArguments.add(newRuleConditionValueArguments); - emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage; + isShowAddAction.value = true; + RuleFilterActionArguments newRuleFilterAction = RuleFilterActionArguments.newAction(null); + listEmailRuleFilterActionSelected.add(newRuleFilterAction); if (_emailAddress != null) { RuleCondition firstRuleCondition = RuleCondition( field: rule_condition.Field.from, @@ -294,11 +305,34 @@ class RulesFilterCreatorController extends BaseMailboxController { } } - void selectEmailRuleFilterAction(EmailRuleFilterAction? newAction) { - emailRuleFilterActionSelected.value = newAction; + void selectEmailRuleFilterAction(EmailRuleFilterAction? newAction, int ruleFilterActionIndex) { + RuleFilterActionArguments newRuleFilterAction = RuleFilterActionArguments.newAction(newAction); + if (newRuleFilterAction is RejectItActionArguments) { + listEmailRuleFilterActionSelected.clear(); + forwardEmailController.clear(); + mailboxSelected.value = null; + listEmailRuleFilterActionSelected.add(newRuleFilterAction); + isShowAddAction.value = false; + errorForwardEmailValue.value = null; + errorMailboxSelectedValue.value = null; + } else { + if (listEmailRuleFilterActionSelected.length < maxCountAction) { + isShowAddAction.value = true; + } + final int duplicatedIndex = listEmailRuleFilterActionSelected.indexWhere((filterAction) => filterAction.action == newAction); + if (duplicatedIndex != -1) { + _appToast.showToastErrorMessage( + currentOverlayContext!, + AppLocalizations.of(currentContext!).duplicatedActionError, + ); + } else { + listEmailRuleFilterActionSelected[ruleFilterActionIndex] = newRuleFilterAction; + } + } + listEmailRuleFilterActionSelected.refresh(); } - void selectMailbox(BuildContext context) async { + void selectMailbox(BuildContext context, int ruleFilterActionIndex) async { if (_accountId != null) { final arguments = DestinationPickerArguments( _accountId!, @@ -311,9 +345,11 @@ class RulesFilterCreatorController extends BaseMailboxController { if (destinationMailbox is PresentationMailbox && context.mounted) { mailboxSelected.value = destinationMailbox; - errorRuleActionValue.value = _getErrorStringByInputValue( + errorMailboxSelectedValue.value = _getErrorStringByInputValue( context, mailboxSelected.value?.getDisplayName(context)); + RuleFilterActionArguments newRuleFilterAction = MoveMessageActionArguments(mailbox: mailboxSelected.value); + listEmailRuleFilterActionSelected[ruleFilterActionIndex] = newRuleFilterAction; } } } @@ -350,19 +386,7 @@ class RulesFilterCreatorController extends BaseMailboxController { } } - final errorAction = _getErrorStringByInputValue(context, mailboxSelected.value?.getDisplayName(context)); - log('RulesFilterCreatorController::createNewRuleFilter:errorAction: $errorAction'); - if (errorAction?.isNotEmpty == true) { - errorRuleActionValue.value = errorAction; - if (currentOverlayContext != null && currentContext != null) { - _appToast.showToastErrorMessage( - currentOverlayContext!, - AppLocalizations.of(currentContext!).this_field_cannot_be_blank); - } - return; - } - - if (listRuleCondition.isEmpty || emailRuleFilterActionSelected.value == null) { + if (listRuleCondition.isEmpty == true || listEmailRuleFilterActionSelected.isEmpty == true) { if (currentOverlayContext != null && currentContext != null) { _appToast.showToastErrorMessage( currentOverlayContext!, @@ -371,6 +395,32 @@ class RulesFilterCreatorController extends BaseMailboxController { return; } + if (listEmailRuleFilterActionSelected.isNotEmpty == true) { + for (var ruleFilterAction in listEmailRuleFilterActionSelected) { + if (ruleFilterAction is MoveMessageActionArguments) { + final errorAction = _getErrorStringByInputValue(context, mailboxSelected.value?.getDisplayName(context)); + log('RulesFilterCreatorController::createNewRuleFilter:errorAction: $errorAction'); + if (errorAction?.isNotEmpty == true) { + if (currentOverlayContext != null && currentContext != null) { + _appToast.showToastErrorMessage( + currentOverlayContext!, + AppLocalizations.of(currentContext!).notSelectedMailboxToMoveMessage); + } + return; + } + } + if (ruleFilterAction is ForwardActionArguments) { + final errorAction = _getErrorStringByInputValue(context, ruleFilterAction.forwardEmail); + log('RulesFilterCreatorController::createNewRuleFilter:errorAction: $errorAction'); + if (errorAction?.isNotEmpty == true) { + errorForwardEmailValue.value = errorAction; + forwardEmailFocusNode.requestFocus(); + return; + } + } + } + } + late EquatableMixin ruleFilterRequest; if (actionType.value == CreatorActionType.create) { @@ -435,4 +485,34 @@ class RulesFilterCreatorController extends BaseMailboxController { conditionCombinerType.value = combinerType; } } + void tapAddAction() { + RuleFilterActionArguments newRuleFilterAction = RuleFilterActionArguments.newAction(null); + listEmailRuleFilterActionSelected.add(newRuleFilterAction); + if (listEmailRuleFilterActionSelected.length >= maxCountAction) { + isShowAddAction.value = false; + } + } + + void tapRemoveAction(int ruleFilterActionIndex) { + EmailRuleFilterAction? actionToRemove = listEmailRuleFilterActionSelected[ruleFilterActionIndex].action; + if (actionToRemove is ForwardActionArguments) { + forwardEmailController.clear(); + errorForwardEmailValue.value = null; + } + if (actionToRemove is MoveMessageActionArguments) { + mailboxSelected.value = null; + errorMailboxSelectedValue.value = null; + } + isShowAddAction.value = true; + listEmailRuleFilterActionSelected.removeAt(ruleFilterActionIndex); + } + + void updateForwardEmailValue(BuildContext context, String? value, int ruleActionIndex) { + String? errorAction = _getErrorStringByInputValue(context, value); + log('RulesFilterCreatorController::createNewRuleFilter:errorAction: $errorAction'); + RuleFilterActionArguments newRuleFilterAction = ForwardActionArguments(forwardEmail: value); + errorForwardEmailValue.value = errorAction; + listEmailRuleFilterActionSelected[ruleActionIndex] = newRuleFilterAction; + listEmailRuleFilterActionSelected.refresh(); + } } \ No newline at end of file