TF-3764 Add Create filter button in context menu

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-06-12 11:48:20 +07:00
committed by Dat H. Pham
parent bab0331fe0
commit 5068a11524
19 changed files with 172 additions and 74 deletions
@@ -104,6 +104,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_clear_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_create_filter_for_folder.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_preferences_setting_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_save_email_as_draft_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
@@ -119,9 +120,11 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart';
import 'package:tmail_ui_user/features/mailto/presentation/model/mailto_arguments.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_rule_filter_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_email_rule_filter_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_vacation_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vacation_interactor.dart';
@@ -234,6 +237,7 @@ class MailboxDashBoardController extends ReloadableController
GetAutoCompleteInteractor? _getAutoCompleteInteractor;
IOSNotificationManager? _iosNotificationManager;
GetServerSettingInteractor? getServerSettingInteractor;
CreateNewEmailRuleFilterInteractor? createNewEmailRuleFilterInteractor;
final scaffoldKey = GlobalKey<ScaffoldState>();
final selectedMailbox = Rxn<PresentationMailbox>();
@@ -461,6 +465,8 @@ class MailboxDashBoardController extends ReloadableController
isSenderImportantFlagEnabled.value = success.settingOption.isDisplaySenderPriority;
} else if (success is ClearMailboxSuccess) {
clearMailboxSuccess(success);
} else if (success is CreateNewRuleFilterSuccess) {
handleCreateNewRuleFilterSuccess(success);
}
}
@@ -499,6 +505,8 @@ class MailboxDashBoardController extends ReloadableController
_handleGetAllIdentitiesFailure();
} else if (failure is ClearMailboxFailure) {
clearMailboxFailure(failure);
} else if (failure is CreateNewRuleFilterFailure) {
handleCreateNewRuleFilterFailure(failure);
}
}
@@ -0,0 +1,86 @@
import 'package:core/utils/platform_info.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/manage_account/domain/exceptions/rule_filter_exception.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_email_rule_filter_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_rule_filter_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_email_rule_filter_interactor.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
extension HandleCreateFilterForFolder on MailboxDashBoardController {
Future<void> openCreateEmailRuleView(
PresentationMailbox presentationMailbox,
) async {
final accountId = this.accountId.value;
final session = sessionCurrent;
if (accountId == null) {
consumeState(Stream.value(
Left(CreateNewRuleFilterFailure(NotFoundAccountIdException()))));
return;
}
if (session == null) {
consumeState(Stream.value(
Left(CreateNewRuleFilterFailure(NotFoundSessionException()))));
return;
}
final arguments = RulesFilterCreatorArguments(
accountId,
session,
mailboxDestination: presentationMailbox,
);
final newRuleFilterRequest = PlatformInfo.isWeb
? await DialogRouter.pushGeneralDialog(
routeName: AppRoutes.rulesFilterCreator,
arguments: arguments,
)
: await push(
AppRoutes.rulesFilterCreator,
arguments: arguments,
);
if (newRuleFilterRequest is CreateNewEmailRuleFilterRequest) {
_createNewRuleFilterAction(accountId, newRuleFilterRequest);
}
}
void _createNewRuleFilterAction(
AccountId accountId,
CreateNewEmailRuleFilterRequest ruleFilterRequest,
) {
createNewEmailRuleFilterInteractor =
getBinding<CreateNewEmailRuleFilterInteractor>();
if (createNewEmailRuleFilterInteractor == null) {
consumeState(Stream.value(
Left(CreateNewRuleFilterFailure(RuleFilterNotBindingException()))));
return;
}
consumeState(createNewEmailRuleFilterInteractor!.execute(
accountId,
ruleFilterRequest,
));
}
void handleCreateNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) {
if (success.newListRules.isNotEmpty == true) {
toastManager.showMessageSuccess(success);
}
}
void handleCreateNewRuleFilterFailure(CreateNewRuleFilterFailure failure) {
toastManager.showMessageFailure(failure);
}
}