TF-894 Enable CreateButton every time and only show error when not valid condition

This commit is contained in:
dab246
2022-09-08 14:17:52 +07:00
committed by Dat H. Pham
parent 474235de4f
commit 38f890dd30
5 changed files with 95 additions and 72 deletions
@@ -1,7 +1,5 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
@@ -23,30 +21,34 @@ import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/v
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/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';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class RulesFilterCreatorController extends BaseMailboxController {
final _appToast = Get.find<AppToast>();
final VerifyNameInteractor _verifyNameInteractor;
final GetAllMailboxInteractor _getAllMailboxInteractor;
final actionType = CreatorActionType.create.obs;
final errorRuleName = Rxn<String>();
final errorConditionValue = Rxn<String>();
final errorRuleConditionValue = Rxn<String>();
final errorRuleActionValue = Rxn<String>();
final ruleConditionFieldSelected = Rxn<rule_condition.Field>();
final ruleConditionComparatorSelected = Rxn<rule_condition.Comparator>();
final emailRuleFilterActionSelected = Rxn<EmailRuleFilterAction>();
final mailboxSelected = Rxn<PresentationMailbox>();
final isCreateRuleFilterValid = RxBool(false);
final inputRuleNameController = TextEditingController();
final inputConditionValueController = TextEditingController();
final inputRuleNameFocusNode = FocusNode();
final inputRuleConditionFocusNode = FocusNode();
AccountId? _accountId;
String? _newRuleName;
String? _newConditionValue;
String? _newRuleConditionValue;
TMailRule? _currentTMailRule;
RulesFilterCreatorController(
@@ -65,6 +67,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
@override
void onClose() {
inputRuleNameFocusNode.dispose();
inputRuleConditionFocusNode.dispose();
inputRuleNameController.dispose();
inputConditionValueController.dispose();
super.onClose();
@@ -77,16 +80,11 @@ class RulesFilterCreatorController extends BaseMailboxController {
void onData(Either<Failure, Success> newState) {
super.onData(newState);
newState.fold(
(failure) {
if (failure is GetAllMailboxFailure) {
_updateStateCreatorButton();
}
},
(failure) => null,
(success) async {
if (success is GetAllMailboxSuccess) {
await buildTree(success.mailboxList);
_setUpMailboxSelected();
_updateStateCreatorButton();
}
});
}
@@ -115,8 +113,8 @@ class RulesFilterCreatorController extends BaseMailboxController {
ruleConditionFieldSelected.value = _currentTMailRule!.condition.field;
ruleConditionComparatorSelected.value = _currentTMailRule!.condition.comparator;
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
_newConditionValue = _currentTMailRule!.condition.value;
_setValueInputField(inputConditionValueController, _newConditionValue ?? '');
_newRuleConditionValue = _currentTMailRule!.condition.value;
_setValueInputField(inputConditionValueController, _newRuleConditionValue ?? '');
_newRuleName = _currentTMailRule!.name;
_setValueInputField(inputRuleNameController, _newRuleName ?? '');
_getAllMailboxAction();
@@ -124,7 +122,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
break;
}
inputRuleNameFocusNode.requestFocus();
_updateStateCreatorButton();
}
void _setValueInputField(TextEditingController controller, String value) {
@@ -150,13 +147,11 @@ class RulesFilterCreatorController extends BaseMailboxController {
void updateRuleName(BuildContext context, String? value) {
_newRuleName = value;
errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName);
_updateStateCreatorButton();
}
void updateConditionValue(BuildContext context, String? value) {
_newConditionValue = value;
errorConditionValue.value = _getErrorStringByInputValue(context, _newConditionValue);
_updateStateCreatorButton();
_newRuleConditionValue = value;
errorRuleConditionValue.value = _getErrorStringByInputValue(context, _newRuleConditionValue);
}
String? _getErrorStringByInputValue(BuildContext context, String? inputValue) {
@@ -174,20 +169,17 @@ class RulesFilterCreatorController extends BaseMailboxController {
void selectRuleConditionField(rule_condition.Field? newField) {
ruleConditionFieldSelected.value = newField;
_updateStateCreatorButton();
}
void selectRuleConditionComparator(rule_condition.Comparator? newComparator) {
ruleConditionComparatorSelected.value = newComparator;
_updateStateCreatorButton();
}
void selectEmailRuleFilterAction(EmailRuleFilterAction? newAction) {
emailRuleFilterActionSelected.value = newAction;
_updateStateCreatorButton();
}
void selectMailbox() async {
void selectMailbox(BuildContext context) async {
final destinationMailbox = await push(
AppRoutes.DESTINATION_PICKER,
arguments: DestinationPickerArguments(
@@ -196,19 +188,12 @@ class RulesFilterCreatorController extends BaseMailboxController {
if (destinationMailbox is PresentationMailbox) {
mailboxSelected.value = destinationMailbox;
_updateStateCreatorButton();
errorRuleActionValue.value = _getErrorStringByInputValue(
context,
mailboxSelected.value?.name?.name);
}
}
void _updateStateCreatorButton() {
isCreateRuleFilterValid.value = _newRuleName?.trim().isNotEmpty == true &&
_newConditionValue?.trim().isNotEmpty == true &&
mailboxSelected.value != null &&
ruleConditionFieldSelected.value != null &&
emailRuleFilterActionSelected.value != null &&
ruleConditionComparatorSelected.value != null;
}
void createNewRuleFilter(BuildContext context) async {
FocusScope.of(context).unfocus();
@@ -216,13 +201,44 @@ class RulesFilterCreatorController extends BaseMailboxController {
if (errorName?.isNotEmpty == true) {
log('RulesFilterCreatorController::createNewRuleFilter(): errorName: $errorName');
errorRuleName.value = errorName;
inputRuleNameFocusNode.requestFocus();
_appToast.showToastWithIcon(
currentOverlayContext!,
textColor: AppColor.toastErrorBackgroundColor,
message: AppLocalizations.of(currentContext!).this_field_cannot_be_blank);
return;
}
final errorCondition = _getErrorStringByInputValue(context, _newConditionValue);
final errorCondition = _getErrorStringByInputValue(context, _newRuleConditionValue);
if (errorCondition?.isNotEmpty == true) {
log('RulesFilterCreatorController::createNewRuleFilter(): errorCondition: $errorCondition');
errorConditionValue.value = errorName;
errorRuleConditionValue.value = errorCondition;
inputRuleConditionFocusNode.requestFocus();
_appToast.showToastWithIcon(
currentOverlayContext!,
textColor: AppColor.toastErrorBackgroundColor,
message: AppLocalizations.of(currentContext!).this_field_cannot_be_blank);
return;
}
final errorAction = _getErrorStringByInputValue(context, mailboxSelected.value?.name?.name);
if (errorAction?.isNotEmpty == true) {
log('RulesFilterCreatorController::createNewRuleFilter(): errorAction: $errorAction');
errorRuleActionValue.value = errorAction;
_appToast.showToastWithIcon(
currentOverlayContext!,
textColor: AppColor.toastErrorBackgroundColor,
message: AppLocalizations.of(currentContext!).this_field_cannot_be_blank);
return;
}
if (ruleConditionFieldSelected.value == null ||
ruleConditionComparatorSelected.value == null ||
emailRuleFilterActionSelected.value == null) {
_appToast.showToastWithIcon(
currentOverlayContext!,
textColor: AppColor.toastErrorBackgroundColor,
message: AppLocalizations.of(currentContext!).toastErrorMessageWhenCreateNewRule);
return;
}
@@ -237,7 +253,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
condition: rule_condition.RuleCondition(
field: ruleConditionFieldSelected.value!,
comparator: ruleConditionComparatorSelected.value!,
value: _newConditionValue!
value: _newRuleConditionValue!
));
log('RulesFilterCreatorController::newTMailRule(): $newTMailRule');
@@ -161,8 +161,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
supportSelectionIcon: true))),
Expanded(child: Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorConditionValue.value,
errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) =>
controller.updateConditionValue(context, value))))
]
@@ -205,7 +206,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
Expanded(child: Obx(() =>
RuleFilterButtonField<PresentationMailbox>(
value: controller.mailboxSelected.value,
tapActionCallback: (value) => controller.selectMailbox()))),
borderColor: _getBorderColorMailboxSelected(),
tapActionCallback: (value) => controller.selectMailbox(context)))),
])
),
]
@@ -235,16 +237,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.actionType.value.getActionName(context),
width: 128,
height: 44,
backgroundColor: AppColor.colorTextButton
.withOpacity(controller.isCreateRuleFilterValid.value
? 1.0
: 0.4),
backgroundColor: AppColor.colorTextButton,
radius: 10,
onTap: () {
if (controller.isCreateRuleFilterValid.value) {
controller.createNewRuleFilter(context);
}
})),
onTap: () => controller.createNewRuleFilter(context))),
]
),
)
@@ -322,8 +317,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
supportSelectionIcon: true))),
Expanded(child: Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorConditionValue.value,
errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) =>
controller.updateConditionValue(context, value))))
]
@@ -367,7 +363,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
Expanded(child: Obx(() =>
RuleFilterButtonField<PresentationMailbox>(
value: controller.mailboxSelected.value,
tapActionCallback: (value) => controller.selectMailbox()))),
borderColor: _getBorderColorMailboxSelected(),
tapActionCallback: (value) => controller.selectMailbox(context)))),
])
),
]
@@ -396,16 +393,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.actionType.value.getActionName(context),
width: 128,
height: 44,
backgroundColor: AppColor.colorTextButton
.withOpacity(controller.isCreateRuleFilterValid.value
? 1.0
: 0.4),
backgroundColor: AppColor.colorTextButton,
radius: 10,
onTap: () {
if (controller.isCreateRuleFilterValid.value) {
controller.createNewRuleFilter(context);
}
}))),
onTap: () => controller.createNewRuleFilter(context)))),
]
),
)
@@ -498,8 +488,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
),
Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorConditionValue.value,
errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) =>
controller.updateConditionValue(context, value)))
]
@@ -552,7 +543,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
),
Obx(() => RuleFilterButtonField<PresentationMailbox>(
value: controller.mailboxSelected.value,
tapActionCallback: (value) => controller.selectMailbox()))
borderColor: _getBorderColorMailboxSelected(),
tapActionCallback: (value) => controller.selectMailbox(context)))
])
),
]
@@ -581,16 +573,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.actionType.value.getActionName(context),
width: 128,
height: 44,
backgroundColor: AppColor.colorTextButton
.withOpacity(controller.isCreateRuleFilterValid.value
? 1.0
: 0.4),
backgroundColor: AppColor.colorTextButton,
radius: 10,
onTap: () {
if (controller.isCreateRuleFilterValid.value) {
controller.createNewRuleFilter(context);
}
}))),
onTap: () => controller.createNewRuleFilter(context)))),
]
),
)
@@ -704,4 +689,12 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
}))
.build();
}
Color _getBorderColorMailboxSelected() {
if (controller.errorRuleActionValue.value?.isNotEmpty == true) {
return AppColor.colorInputBorderErrorVerifyName;
} else {
return AppColor.colorInputBorderCreateMailbox;
}
}
}
@@ -16,11 +16,13 @@ class RuleFilterButtonField<T> extends StatelessWidget {
final T? value;
final OnTapActionCallback? tapActionCallback;
final Color? borderColor;
const RuleFilterButtonField({
super.key,
this.value,
this.tapActionCallback
this.tapActionCallback,
this.borderColor,
});
@override
@@ -34,7 +36,7 @@ class RuleFilterButtonField<T> extends StatelessWidget {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border.all(
color: AppColor.colorInputBorderCreateMailbox,
color: borderColor ?? AppColor.colorInputBorderCreateMailbox,
width: 1),
color: Colors.white),
padding: const EdgeInsets.only(left: 12, right: 10),
+7 -1
View File
@@ -1,5 +1,5 @@
{
"@@last_modified": "2022-09-05T09:25:59.780036",
"@@last_modified": "2022-09-08T14:02:20.481140",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
@@ -2129,5 +2129,11 @@
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"toastErrorMessageWhenCreateNewRule": "You have not filled in the information completely.",
"@toastErrorMessageWhenCreateNewRule": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
}
}
@@ -2198,4 +2198,10 @@ class AppLocalizations {
'The rule has been removed.',
name: 'toastMessageDeleteEmailRuleSuccessfully');
}
String get toastErrorMessageWhenCreateNewRule {
return Intl.message(
'You have not filled in the information completely.',
name: 'toastErrorMessageWhenCreateNewRule');
}
}