TF-898 Implement quick creating rule in email view
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.593 10.2064C11.3622 10.4757 10.9536 10.4988 10.694 10.2572L10.3915 9.97571L9.98438 10.3758C9.7207 10.6346 9.45947 10.825 9.20068 10.9471C8.94189 11.0643 8.67578 11.1229 8.40234 11.1229C8.12891 11.1229 7.86035 11.0643 7.59668 10.9471C7.33301 10.825 7.07178 10.6346 6.81299 10.3758L6.40586 9.9757L2.19424 14.1478C2.30684 14.1771 2.43285 14.1917 2.57227 14.1917H13.6699C14.0461 14.1917 14.3511 14.4967 14.3511 14.8729C14.3511 15.249 14.0461 15.554 13.6699 15.554H2.57227C1.78125 15.554 1.18311 15.3514 0.777832 14.9461C0.372559 14.5457 0.169922 13.9549 0.169922 13.1736V5.07305C0.169922 4.29668 0.362793 3.7083 0.748535 3.30791C1.13916 2.90264 1.68604 2.7 2.38916 2.7H14.2031C14.9941 2.7 15.5923 2.90264 15.9976 3.30791C16.4028 3.7083 16.6055 4.29668 16.6055 5.07305V7.02617C16.6055 7.39832 16.3038 7.7 15.9316 7.7C15.5595 7.7 15.2578 7.39832 15.2578 7.02617V5.19406L11.2819 9.10087L11.5427 9.34186C11.7892 9.56963 11.8114 9.95158 11.593 10.2064ZM5.51557 9.10081L1.51758 13.0613V5.17201L5.51557 9.10081ZM2.57227 4.06231C2.4411 4.06231 2.3218 4.07561 2.21436 4.10221L7.56006 9.38701C7.71143 9.5335 7.85303 9.64336 7.98486 9.7166C8.12158 9.78496 8.26074 9.81914 8.40234 9.81914C8.53418 9.81914 8.66602 9.78496 8.79785 9.7166C8.93457 9.64824 9.08105 9.53838 9.2373 9.38701L14.583 4.1092C14.4699 4.07794 14.3433 4.06231 14.2031 4.06231H2.57227Z" fill="#007AFF"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.8838 10.8623C12.0858 10.0644 12.651 8.7 13.7795 8.7H18.5605C19.689 8.7 20.2541 10.0644 19.4562 10.8623L16.77 13.5485V16.7C16.77 17.0314 16.5014 17.3 16.17 17.3C15.8386 17.3 15.57 17.0314 15.57 16.7V13.5485L12.8838 10.8623ZM16.17 12.4515L18.6077 10.0138C18.6241 9.99734 18.6267 9.98654 18.6278 9.98066C18.6293 9.9715 18.6288 9.95728 18.6221 9.94116C18.6154 9.92503 18.6058 9.91458 18.5982 9.90922C18.5933 9.90578 18.5838 9.9 18.5605 9.9H13.7795C13.7562 9.9 13.7467 9.90578 13.7418 9.90922C13.7342 9.91458 13.7245 9.92503 13.7179 9.94116C13.7112 9.95728 13.7106 9.9715 13.7122 9.98065C13.7132 9.98654 13.7158 9.99734 13.7323 10.0138L16.17 12.4515Z" fill="#007AFF"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -175,6 +175,7 @@ class ImagePaths {
|
||||
String get icQuotas => _getImagePath('ic_quotas.svg');
|
||||
String get icQuotasWarning => _getImagePath('ic_quotas_warning.svg');
|
||||
String get icQuotasOutOfStorage => _getImagePath('ic_quotas_out_of_storage.svg');
|
||||
String get icQuickCreatingRule => _getImagePath('ic_quick_creating_rule.svg');
|
||||
|
||||
String _getImagePath(String imageName) {
|
||||
return AssetsPaths.images + imageName;
|
||||
|
||||
@@ -8,12 +8,14 @@ import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:rule_filter/rule_filter/capability_rule_filter.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/view_as_dialog_action_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/bindings/email_rules_interactor_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forwarding_interactors_bindings.dart';
|
||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
|
||||
@@ -129,4 +131,13 @@ abstract class BaseController extends GetxController
|
||||
logError('ReloadableController::injectForwardBindings(): exception: $e');
|
||||
}
|
||||
}
|
||||
|
||||
void injectRuleFilterBindings(Session? session, AccountId? accountId) {
|
||||
try {
|
||||
requireCapability(session!, accountId!, [capabilityRuleFilter]);
|
||||
EmailRulesInteractorBindings().dependencies();
|
||||
} catch(e) {
|
||||
logError('ReloadableController::injectRuleFilterBindings(): exception: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,9 +55,13 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.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/state/get_all_identities_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/presentation/extensions/datetime_extension.dart';
|
||||
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
@@ -85,6 +89,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
final DownloadAttachmentForWebInteractor _downloadAttachmentForWebInteractor;
|
||||
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
|
||||
|
||||
CreateNewEmailRuleFilterInteractor? _createNewEmailRuleFilterInteractor;
|
||||
SendReceiptToSenderInteractor? _sendReceiptToSenderInteractor;
|
||||
|
||||
final emailAddressExpandMode = ExpandMode.COLLAPSE.obs;
|
||||
@@ -126,6 +131,14 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
_initializeDebounceTimeIndexPageViewChange();
|
||||
_initWorker();
|
||||
_listenDownloadAttachmentProgressState();
|
||||
injectRuleFilterBindings(
|
||||
emailSupervisorController.sessionCurrent,
|
||||
emailSupervisorController.accountId);
|
||||
try {
|
||||
_createNewEmailRuleFilterInteractor = Get.find<CreateNewEmailRuleFilterInteractor>();
|
||||
} catch (e) {
|
||||
logError('SingleEmailController::onInit(): ${e.toString()}');
|
||||
}
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@@ -138,7 +151,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
try {
|
||||
_sendReceiptToSenderInteractor = Get.find<SendReceiptToSenderInteractor>();
|
||||
} catch (e) {
|
||||
logError('EmailController::onReady(): SendReceiptToSenderInteractor not registered');
|
||||
logError('SingleEmailController::onReady(): SendReceiptToSenderInteractor not registered');
|
||||
}
|
||||
super.onReady();
|
||||
}
|
||||
@@ -161,7 +174,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
|
||||
void _initWorker() {
|
||||
emailWorker = ever(emailSupervisorController.selectedEmail, (presentationEmail) {
|
||||
log('EmailController::_initWorker(): $presentationEmail');
|
||||
log('SingleEmailController::_initWorker(): $presentationEmail');
|
||||
if (presentationEmail is PresentationEmail) {
|
||||
if (_currentEmailId != presentationEmail.id) {
|
||||
_currentEmailId = presentationEmail.id;
|
||||
@@ -185,7 +198,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
|
||||
void _listenDownloadAttachmentProgressState() {
|
||||
downloadProgressState.listen((state) {
|
||||
log('EmailController::_listenDownloadAttachmentProgressState(): $state');
|
||||
log('SingleEmailController::_listenDownloadAttachmentProgressState(): $state');
|
||||
state.fold(
|
||||
(failure) => null,
|
||||
(success) {
|
||||
@@ -203,7 +216,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
} else if (success is DownloadingAttachmentForWeb) {
|
||||
final percent = success.progress.round();
|
||||
log('EmailController::DownloadingAttachmentForWeb(): $percent%');
|
||||
log('SingleEmailController::DownloadingAttachmentForWeb(): $percent%');
|
||||
|
||||
emailSupervisorController.mailboxDashBoardController.updateDownloadTask(
|
||||
success.taskId,
|
||||
@@ -234,7 +247,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
.firstWhere((identity) => identity.mayDelete == false);
|
||||
_identitySelected = identityDefault;
|
||||
} catch (e) {
|
||||
logError('EmailController::_getAllIdentitiesSuccess(): ${e.toString()}');
|
||||
logError('SingleEmailController::_getAllIdentitiesSuccess(): ${e.toString()}');
|
||||
_identitySelected = success.identities!.first;
|
||||
}
|
||||
}
|
||||
@@ -290,6 +303,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
_getAllIdentitiesSuccess(success);
|
||||
} else if (success is SendReceiptToSenderSuccess) {
|
||||
_sendReceiptToSenderSuccess(success);
|
||||
} else if (success is CreateNewRuleFilterSuccess) {
|
||||
_createNewRuleFilterSuccess(success);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -479,7 +494,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
|
||||
void _openDownloadedPreviewWorkGroupDocument(DownloadedResponse downloadedResponse) async {
|
||||
log('EmailController::_openDownloadedPreviewWorkGroupDocument(): $downloadedResponse');
|
||||
log('SingleEmailController::_openDownloadedPreviewWorkGroupDocument(): $downloadedResponse');
|
||||
if (downloadedResponse.mediaType == null) {
|
||||
await share_library.Share.shareFiles([downloadedResponse.filePath]);
|
||||
}
|
||||
@@ -490,7 +505,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
uti: Platform.isIOS ? downloadedResponse.mediaType!.getDocumentUti().value : null);
|
||||
|
||||
if (openResult.type != open_file.ResultType.done) {
|
||||
logError('EmailController::_openDownloadedPreviewWorkGroupDocument(): no preview available');
|
||||
logError('SingleEmailController::_openDownloadedPreviewWorkGroupDocument(): no preview available');
|
||||
if (currentContext != null) {
|
||||
_appToast.showErrorToast(AppLocalizations.of(currentContext!).noPreviewAvailable);
|
||||
}
|
||||
@@ -516,7 +531,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
|
||||
void _downloadAttachmentForWebSuccessAction(DownloadAttachmentForWebSuccess success) {
|
||||
log('EmailController::_downloadAttachmentForWebSuccessAction():');
|
||||
log('SingleEmailController::_downloadAttachmentForWebSuccessAction():');
|
||||
mailboxDashBoardController.deleteDownloadTask(success.taskId);
|
||||
|
||||
_downloadManager.createAnchorElementDownloadFileWeb(
|
||||
@@ -525,7 +540,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
|
||||
void _downloadAttachmentForWebFailureAction(DownloadAttachmentForWebFailure failure) {
|
||||
log('EmailController::_downloadAttachmentForWebFailureAction(): $failure');
|
||||
log('SingleEmailController::_downloadAttachmentForWebFailureAction(): $failure');
|
||||
mailboxDashBoardController.deleteDownloadTask(failure.taskId);
|
||||
|
||||
if (currentOverlayContext != null && currentContext != null) {
|
||||
@@ -774,8 +789,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
(EmailAddressBottomSheetBuilder(context, imagePaths, emailAddress)
|
||||
..addOnCloseContextMenuAction(() => popBack())
|
||||
..addOnCopyEmailAddressAction((emailAddress) => copyEmailAddress(context, emailAddress))
|
||||
..addOnComposeEmailAction((emailAddress) => composeEmailFromEmailAddress(emailAddress)))
|
||||
.show();
|
||||
..addOnComposeEmailAction((emailAddress) => composeEmailFromEmailAddress(emailAddress))
|
||||
..addOnQuickCreatingRuleEmailBottomSheetAction((emailAddress) => quickCreatingRule(context, emailAddress))
|
||||
).show();
|
||||
} else {
|
||||
showDialog(
|
||||
context: context,
|
||||
@@ -784,10 +800,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
child: EmailAddressDialogBuilder(
|
||||
emailAddress,
|
||||
onCloseDialogAction: () => popBack(),
|
||||
onCopyEmailAddressAction: (emailAddress) =>
|
||||
copyEmailAddress(context, emailAddress),
|
||||
onComposeEmailAction: (emailAddress) =>
|
||||
composeEmailFromEmailAddress(emailAddress))));
|
||||
onCopyEmailAddressAction: (emailAddress) => copyEmailAddress(context, emailAddress),
|
||||
onComposeEmailAction: (emailAddress) => composeEmailFromEmailAddress(emailAddress),
|
||||
onQuickCreatingRuleEmailDialogAction: (emailAddress) => quickCreatingRule(context, emailAddress)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -813,9 +831,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
|
||||
void openMailToLink(Uri? uri) {
|
||||
log('EmailController::openMailToLink(): ${uri.toString()}');
|
||||
log('SingleEmailController::openMailToLink(): ${uri.toString()}');
|
||||
String address = uri?.path ?? '';
|
||||
log('EmailController::openMailToLink(): address: $address');
|
||||
log('SingleEmailController::openMailToLink(): address: $address');
|
||||
if (address.isNotEmpty) {
|
||||
final emailAddress = EmailAddress(null, address);
|
||||
final arguments = ComposerArguments(
|
||||
@@ -920,7 +938,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
mdn: mdnToSender,
|
||||
identityId: _identitySelected!.id!,
|
||||
sendId: Id(_uuid.v1()));
|
||||
log('EmailController::_handleSendReceiptToSenderAction(): sendReceiptRequest: $sendReceiptRequest');
|
||||
log('SingleEmailController::_handleSendReceiptToSenderAction(): sendReceiptRequest: $sendReceiptRequest');
|
||||
|
||||
consumeState(_sendReceiptToSenderInteractor!.execute(accountId, sendReceiptRequest));
|
||||
}
|
||||
@@ -948,7 +966,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
|
||||
void _sendReceiptToSenderSuccess(SendReceiptToSenderSuccess success) {
|
||||
log('EmailController::_sendReceiptToSenderSuccess(): ${success.mdn.toString()}');
|
||||
log('SingleEmailController::_sendReceiptToSenderSuccess(): ${success.mdn.toString()}');
|
||||
if (currentContext != null) {
|
||||
_appToast.showBottomToast(
|
||||
currentOverlayContext!,
|
||||
@@ -997,4 +1015,63 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
mailboxDashBoardController.goToComposer(arguments);
|
||||
}
|
||||
}
|
||||
|
||||
void quickCreatingRule(BuildContext context, EmailAddress emailAddress) async {
|
||||
popBack();
|
||||
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
final session = mailboxDashBoardController.sessionCurrent;
|
||||
if (accountId != null && session != null) {
|
||||
final arguments = RulesFilterCreatorArguments(
|
||||
accountId,
|
||||
session,
|
||||
emailAddress: emailAddress);
|
||||
|
||||
if (BuildUtils.isWeb) {
|
||||
showDialogRuleFilterCreator(
|
||||
context: context,
|
||||
arguments: arguments,
|
||||
onCreatedRuleFilter: (arguments) {
|
||||
if (arguments is CreateNewEmailRuleFilterRequest) {
|
||||
_createNewRuleFilterAction(accountId, arguments);
|
||||
}
|
||||
}
|
||||
);
|
||||
} else {
|
||||
final newRuleFilterRequest = await push(
|
||||
AppRoutes.rulesFilterCreator,
|
||||
arguments: arguments
|
||||
);
|
||||
|
||||
if (newRuleFilterRequest is CreateNewEmailRuleFilterRequest) {
|
||||
_createNewRuleFilterAction(accountId, newRuleFilterRequest);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _createNewRuleFilterAction(
|
||||
AccountId accountId,
|
||||
CreateNewEmailRuleFilterRequest ruleFilterRequest
|
||||
) async {
|
||||
try {
|
||||
_createNewEmailRuleFilterInteractor = Get.find<CreateNewEmailRuleFilterInteractor>();
|
||||
} catch (e) {
|
||||
logError('SingleEmailController::onInit(): ${e.toString()}');
|
||||
}
|
||||
if (_createNewEmailRuleFilterInteractor != null) {
|
||||
consumeState(_createNewEmailRuleFilterInteractor!.execute(accountId, ruleFilterRequest));
|
||||
}
|
||||
}
|
||||
|
||||
void _createNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) {
|
||||
if (success.newListRules.isNotEmpty == true) {
|
||||
if (currentOverlayContext != null && currentContext != null) {
|
||||
_appToast.showToastWithIcon(
|
||||
currentOverlayContext!,
|
||||
message: AppLocalizations.of(currentContext!).newFilterWasCreated,
|
||||
icon: imagePaths.icSelected);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -746,13 +746,19 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
return <Widget>[
|
||||
_markAsEmailUnreadAction(context, email),
|
||||
_markAsEmailSpamOrUnSpamAction(context, email),
|
||||
_quickCreatingRuleAction(context, email),
|
||||
];
|
||||
}
|
||||
|
||||
Widget _markAsEmailUnreadAction(BuildContext context, PresentationEmail email) {
|
||||
return (EmailActionCupertinoActionSheetActionBuilder(
|
||||
const Key('mark_as_unread_action'),
|
||||
SvgPicture.asset(imagePaths.icUnreadEmail, width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton),
|
||||
SvgPicture.asset(
|
||||
imagePaths.icUnreadEmail,
|
||||
width: 24,
|
||||
height: 24,
|
||||
fit: BoxFit.fill,
|
||||
color: AppColor.colorTextButton),
|
||||
AppLocalizations.of(context).mark_as_unread,
|
||||
email,
|
||||
iconLeftPadding: responsiveUtils.isMobile(context)
|
||||
@@ -772,7 +778,10 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
const Key('mark_as_spam_or_un_spam_action'),
|
||||
SvgPicture.asset(
|
||||
currentMailbox?.isSpam == true ? imagePaths.icNotSpam : imagePaths.icMailboxSpam,
|
||||
width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton),
|
||||
width: 24,
|
||||
height: 24,
|
||||
fit: BoxFit.fill,
|
||||
color: AppColor.colorTextButton),
|
||||
currentMailbox?.isSpam == true
|
||||
? AppLocalizations.of(context).remove_from_spam
|
||||
: AppLocalizations.of(context).mark_as_spam,
|
||||
@@ -788,6 +797,27 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _quickCreatingRuleAction(BuildContext context, PresentationEmail email) {
|
||||
return (EmailActionCupertinoActionSheetActionBuilder(
|
||||
const Key('quick_creating_rule_action'),
|
||||
SvgPicture.asset(
|
||||
imagePaths.icQuickCreatingRule,
|
||||
width: 24,
|
||||
height: 24,
|
||||
fit: BoxFit.fill,
|
||||
color: AppColor.colorTextButton),
|
||||
AppLocalizations.of(context).quickCreatingRule,
|
||||
email,
|
||||
iconLeftPadding: responsiveUtils.isMobile(context)
|
||||
? const EdgeInsets.only(left: 12, right: 16)
|
||||
: const EdgeInsets.only(right: 12),
|
||||
iconRightPadding: responsiveUtils.isMobile(context)
|
||||
? const EdgeInsets.only(right: 12)
|
||||
: EdgeInsets.zero)
|
||||
..onActionClick((email) => controller.quickCreatingRule(context, email.from!.first)))
|
||||
.build();
|
||||
}
|
||||
|
||||
List<PopupMenuEntry> _popupMenuEmailActionTile(BuildContext context, PresentationEmail email) {
|
||||
return [
|
||||
PopupMenuItem(
|
||||
@@ -796,75 +826,78 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
PopupMenuItem(
|
||||
padding: EdgeInsets.zero,
|
||||
child: _markAsEmailSpamOrUnSpamPopupItemAction(context, email)),
|
||||
PopupMenuItem(
|
||||
padding: EdgeInsets.zero,
|
||||
child: _quickCreatingRulePopupItemAction(context, email)),
|
||||
];
|
||||
}
|
||||
|
||||
Widget _markAsEmailUnreadPopupItemAction(BuildContext context, PresentationEmail email) {
|
||||
return InkWell(
|
||||
onTap: () => controller.handleEmailAction(context, email, EmailActionType.markAsUnread),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
child: SizedBox(
|
||||
width: 383,
|
||||
height: 56,
|
||||
child: Row(children: [
|
||||
SvgPicture.asset(
|
||||
imagePaths.icUnreadEmail,
|
||||
width: 24,
|
||||
height: 24,
|
||||
color: AppColor.colorTextButton,
|
||||
fit: BoxFit.fill),
|
||||
const SizedBox(width: 12),
|
||||
Expanded(child: Text(
|
||||
AppLocalizations.of(context).mark_as_unread,
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.w500)
|
||||
)),
|
||||
])
|
||||
),
|
||||
)
|
||||
return _popupMenuItem(
|
||||
icon: imagePaths.icUnreadEmail,
|
||||
title: AppLocalizations.of(context).mark_as_unread,
|
||||
onTapCallback: () => controller.handleEmailAction(context, email, EmailActionType.markAsUnread)
|
||||
);
|
||||
}
|
||||
|
||||
Widget _markAsEmailSpamOrUnSpamPopupItemAction(BuildContext context, PresentationEmail email) {
|
||||
final currentMailbox = controller.getMailboxContain(email);
|
||||
|
||||
return InkWell(
|
||||
onTap: () => controller.handleEmailAction(
|
||||
return _popupMenuItem(
|
||||
icon: currentMailbox?.isSpam == true
|
||||
? imagePaths.icNotSpam
|
||||
: imagePaths.icMailboxSpam,
|
||||
title: currentMailbox?.isSpam == true
|
||||
? AppLocalizations.of(context).remove_from_spam
|
||||
: AppLocalizations.of(context).mark_as_spam,
|
||||
onTapCallback: () => controller.handleEmailAction(
|
||||
context,
|
||||
email,
|
||||
currentMailbox?.isSpam == true
|
||||
? EmailActionType.unSpam
|
||||
: EmailActionType.moveToSpam),
|
||||
currentMailbox?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam)
|
||||
);
|
||||
}
|
||||
|
||||
Widget _quickCreatingRulePopupItemAction(BuildContext context, PresentationEmail email) {
|
||||
return _popupMenuItem(
|
||||
icon: imagePaths.icQuickCreatingRule,
|
||||
title: AppLocalizations.of(context).quickCreatingRule,
|
||||
onTapCallback: () => controller.quickCreatingRule(context, email.from!.first)
|
||||
);
|
||||
}
|
||||
|
||||
Widget _popupMenuItem({
|
||||
required String icon,
|
||||
required String title,
|
||||
Function()? onTapCallback
|
||||
}) {
|
||||
return Material(
|
||||
color: Colors.transparent,
|
||||
child: InkWell(
|
||||
onTap: onTapCallback,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
child: SizedBox(
|
||||
width: 383,
|
||||
height: 56,
|
||||
width: 300,
|
||||
height: 44,
|
||||
child: Row(children: [
|
||||
SvgPicture.asset(
|
||||
currentMailbox?.isSpam == true
|
||||
? imagePaths.icNotSpam
|
||||
: imagePaths.icMailboxSpam,
|
||||
width: 24,
|
||||
height: 24,
|
||||
icon,
|
||||
width: 20,
|
||||
height: 20,
|
||||
color: AppColor.colorTextButton,
|
||||
fit: BoxFit.fill),
|
||||
const SizedBox(width: 12),
|
||||
Expanded(child: Text(
|
||||
currentMailbox?.isSpam == true
|
||||
? AppLocalizations.of(context).remove_from_spam
|
||||
: AppLocalizations.of(context).mark_as_spam,
|
||||
title,
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontSize: 15,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.w500)
|
||||
fontWeight: FontWeight.normal)
|
||||
)),
|
||||
])
|
||||
),
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
typedef OnCloseBottomSheetAction = void Function();
|
||||
typedef OnCopyEmailAddressBottomSheetAction = void Function(EmailAddress);
|
||||
typedef OnComposeEmailBottomSheetAction = void Function(EmailAddress);
|
||||
typedef OnQuickCreatingRuleEmailBottomSheetAction = void Function(EmailAddress);
|
||||
|
||||
class EmailAddressBottomSheetBuilder {
|
||||
|
||||
@@ -21,6 +22,7 @@ class EmailAddressBottomSheetBuilder {
|
||||
OnCloseBottomSheetAction? _onCloseBottomSheetAction;
|
||||
OnCopyEmailAddressBottomSheetAction? _onCopyEmailAddressAction;
|
||||
OnComposeEmailBottomSheetAction? _onComposeEmailAction;
|
||||
OnQuickCreatingRuleEmailBottomSheetAction? _creatingRuleEmailBottomSheetAction;
|
||||
|
||||
EmailAddressBottomSheetBuilder(
|
||||
this._context,
|
||||
@@ -40,6 +42,10 @@ class EmailAddressBottomSheetBuilder {
|
||||
_onComposeEmailAction = onComposeEmailAction;
|
||||
}
|
||||
|
||||
void addOnQuickCreatingRuleEmailBottomSheetAction(OnQuickCreatingRuleEmailBottomSheetAction creatingRuleEmailBottomSheetAction) {
|
||||
_creatingRuleEmailBottomSheetAction = creatingRuleEmailBottomSheetAction;
|
||||
}
|
||||
|
||||
RoundedRectangleBorder _shape() {
|
||||
return const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(
|
||||
@@ -132,28 +138,54 @@ class EmailAddressBottomSheetBuilder {
|
||||
onPressed: () => _onCopyEmailAddressAction?.call(_emailAddress)
|
||||
)
|
||||
),
|
||||
SizedBox(height: _emailAddress.displayName.isNotEmpty ? 100 : 130),
|
||||
const SizedBox(height: 24),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 20),
|
||||
padding: const EdgeInsets.only(left: 24, right: 24, bottom: 12),
|
||||
child: SizedBox(
|
||||
key: const Key('quick_creating_rule_email_button'),
|
||||
width: double.infinity,
|
||||
height: 44,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
foregroundColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(Set<MaterialState> states) => AppColor.colorTextButton),
|
||||
backgroundColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(Set<MaterialState> states) => AppColor.colorItemEmailSelectedDesktop),
|
||||
shape: MaterialStateProperty.all(RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
side: const BorderSide(
|
||||
width: 0,
|
||||
color: AppColor.colorItemEmailSelectedDesktop)))),
|
||||
child: Text(
|
||||
AppLocalizations.of(_context).quickCreatingRule,
|
||||
style: const TextStyle(
|
||||
fontSize: 17,
|
||||
color: AppColor.colorTextButton,
|
||||
fontWeight: FontWeight.w500)),
|
||||
onPressed: () => _creatingRuleEmailBottomSheetAction?.call(_emailAddress)),
|
||||
)
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24, right: 24, bottom: 24),
|
||||
child: SizedBox(
|
||||
key: const Key('compose_email_button'),
|
||||
width: double.infinity,
|
||||
height: 48,
|
||||
child: ElevatedButton(
|
||||
height: 44,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
foregroundColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(Set<MaterialState> states) => Colors.white),
|
||||
backgroundColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(Set<MaterialState> states) => AppColor.colorTextButton),
|
||||
shape: MaterialStateProperty.all(RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
side: const BorderSide(
|
||||
width: 0,
|
||||
color: AppColor.colorTextButton)))),
|
||||
child: Text(
|
||||
AppLocalizations.of(_context).compose_email,
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontSize: 17,
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w500)),
|
||||
onPressed: () => _onComposeEmailAction?.call(_emailAddress)),
|
||||
|
||||
@@ -10,6 +10,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
typedef OnCloseDialogAction = void Function();
|
||||
typedef OnCopyEmailAddressDialogAction = void Function(EmailAddress);
|
||||
typedef OnComposeEmailDialogAction = void Function(EmailAddress);
|
||||
typedef OnQuickCreatingRuleEmailDialogAction = void Function(EmailAddress);
|
||||
|
||||
class EmailAddressDialogBuilder extends StatelessWidget {
|
||||
|
||||
@@ -17,6 +18,7 @@ class EmailAddressDialogBuilder extends StatelessWidget {
|
||||
final OnCloseDialogAction? onCloseDialogAction;
|
||||
final OnCopyEmailAddressDialogAction? onCopyEmailAddressAction;
|
||||
final OnComposeEmailDialogAction? onComposeEmailAction;
|
||||
final OnQuickCreatingRuleEmailDialogAction? onQuickCreatingRuleEmailDialogAction;
|
||||
|
||||
const EmailAddressDialogBuilder(
|
||||
this._emailAddress, {
|
||||
@@ -24,6 +26,7 @@ class EmailAddressDialogBuilder extends StatelessWidget {
|
||||
this.onCloseDialogAction,
|
||||
this.onCopyEmailAddressAction,
|
||||
this.onComposeEmailAction,
|
||||
this.onQuickCreatingRuleEmailDialogAction,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
@@ -43,7 +46,8 @@ class EmailAddressDialogBuilder extends StatelessWidget {
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16))),
|
||||
child: Wrap(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
@@ -115,28 +119,54 @@ class EmailAddressDialogBuilder extends StatelessWidget {
|
||||
onPressed: () => onCopyEmailAddressAction?.call(_emailAddress)
|
||||
)
|
||||
))),
|
||||
SizedBox(height: _emailAddress.displayName.isNotEmpty ? 100 : 130),
|
||||
const SizedBox(height: 24),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 20),
|
||||
padding: const EdgeInsets.only(left: 24, right: 24, bottom: 12),
|
||||
child: SizedBox(
|
||||
key: const Key('quick_creating_rule_email_button'),
|
||||
width: double.infinity,
|
||||
height: 44,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
foregroundColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(Set<MaterialState> states) => AppColor.colorTextButton),
|
||||
backgroundColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(Set<MaterialState> states) => AppColor.colorItemEmailSelectedDesktop),
|
||||
shape: MaterialStateProperty.all(RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
side: const BorderSide(
|
||||
width: 0,
|
||||
color: AppColor.colorItemEmailSelectedDesktop)))),
|
||||
child: Text(
|
||||
AppLocalizations.of(context).quickCreatingRule,
|
||||
style: const TextStyle(
|
||||
fontSize: 17,
|
||||
color: AppColor.colorTextButton,
|
||||
fontWeight: FontWeight.w500)),
|
||||
onPressed: () => onQuickCreatingRuleEmailDialogAction?.call(_emailAddress)),
|
||||
)
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24, right: 24, bottom: 24),
|
||||
child: SizedBox(
|
||||
key: const Key('compose_email_button'),
|
||||
width: double.infinity,
|
||||
height: 48,
|
||||
child: ElevatedButton(
|
||||
height: 44,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
foregroundColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(Set<MaterialState> states) => Colors.white),
|
||||
backgroundColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(Set<MaterialState> states) => AppColor.colorTextButton),
|
||||
shape: MaterialStateProperty.all(RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
side: const BorderSide(
|
||||
width: 0,
|
||||
color: AppColor.colorTextButton)))),
|
||||
child: Text(
|
||||
AppLocalizations.of(context).compose_email,
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontSize: 17,
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w500)),
|
||||
onPressed: () => onComposeEmailAction?.call(_emailAddress)),
|
||||
|
||||
+2
@@ -329,6 +329,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
accountId.value = sessionCurrent?.accounts.keys.first;
|
||||
_getUserProfile();
|
||||
injectAutoCompleteBindings(sessionCurrent, accountId.value);
|
||||
injectRuleFilterBindings(sessionCurrent, accountId.value);
|
||||
injectVacationBindings(sessionCurrent, accountId.value);
|
||||
_getVacationResponse();
|
||||
} else {
|
||||
@@ -1021,6 +1022,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
_getUserProfile();
|
||||
_handleComposerCache();
|
||||
injectAutoCompleteBindings(sessionCurrent, accountId.value);
|
||||
injectRuleFilterBindings(sessionCurrent, accountId.value);
|
||||
injectVacationBindings(sessionCurrent, accountId.value);
|
||||
_getVacationResponse();
|
||||
}
|
||||
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart';
|
||||
|
||||
class EmailRulesBindings extends Bindings {
|
||||
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut(() => EmailRulesController());
|
||||
}
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource/rule_filter_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/rule_filter_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/network/rule_filter_api.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/repository/rule_filter_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/rule_filter_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/create_new_email_rule_filter_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_email_rule_filter_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart';
|
||||
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
|
||||
|
||||
class EmailRulesInteractorBindings extends InteractorsBindings {
|
||||
|
||||
@override
|
||||
void bindingsDataSource() {
|
||||
Get.lazyPut<RuleFilterDataSource>(() => Get.find<RuleFilterDataSourceImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSourceImpl() {
|
||||
Get.lazyPut(() => RuleFilterDataSourceImpl(
|
||||
Get.find<RuleFilterAPI>(),
|
||||
Get.find<RemoteExceptionThrower>()));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsInteractor() {
|
||||
Get.lazyPut(() => GetAllRulesInteractor(Get.find<RuleFilterRepository>()));
|
||||
Get.lazyPut(() => DeleteEmailRuleInteractor(Get.find<RuleFilterRepository>()));
|
||||
Get.lazyPut(() => CreateNewEmailRuleFilterInteractor(Get.find<RuleFilterRepository>()));
|
||||
Get.lazyPut(() => EditEmailRuleFilterInteractor(Get.find<RuleFilterRepository>()));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepository() {
|
||||
Get.lazyPut<RuleFilterRepository>(() => Get.find<RuleFilterRepositoryImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepositoryImpl() {
|
||||
Get.lazyPut(() => RuleFilterRepositoryImpl(Get.find<RuleFilterDataSource>()));
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
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/create_new_email_rule_filter_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_email_rule_filter_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';
|
||||
|
||||
class EmailRulesBindings extends BaseBindings {
|
||||
|
||||
@override
|
||||
void bindingsController() {
|
||||
Get.lazyPut(() => EmailRulesController(
|
||||
Get.find<GetAllRulesInteractor>(),
|
||||
Get.find<DeleteEmailRuleInteractor>(),
|
||||
Get.find<CreateNewEmailRuleFilterInteractor>(),
|
||||
Get.find<EditEmailRuleFilterInteractor>(),
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSource() {}
|
||||
|
||||
@override
|
||||
void bindingsDataSourceImpl() {}
|
||||
|
||||
@override
|
||||
void bindingsInteractor() {
|
||||
Get.lazyPut(() => GetAllRulesInteractor(Get.find<ManageAccountRepository>()));
|
||||
Get.lazyPut(() => DeleteEmailRuleInteractor(Get.find<ManageAccountRepository>()));
|
||||
Get.lazyPut(() => CreateNewEmailRuleFilterInteractor(Get.find<ManageAccountRepository>()));
|
||||
Get.lazyPut(() => EditEmailRuleFilterInteractor(Get.find<ManageAccountRepository>()));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepository() {}
|
||||
|
||||
@override
|
||||
void bindingsRepositoryImpl() {}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import 'package:core/presentation/utils/app_toast.dart';
|
||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||
import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
|
||||
import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:core/utils/build_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
@@ -33,10 +34,10 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||
|
||||
class EmailRulesController extends BaseController {
|
||||
|
||||
final GetAllRulesInteractor _getAllRulesInteractor;
|
||||
final DeleteEmailRuleInteractor _deleteEmailRuleInteractor;
|
||||
final CreateNewEmailRuleFilterInteractor _createNewEmailRuleFilterInteractor;
|
||||
final EditEmailRuleFilterInteractor _editEmailRuleFilterInteractor;
|
||||
GetAllRulesInteractor? _getAllRulesInteractor;
|
||||
DeleteEmailRuleInteractor? _deleteEmailRuleInteractor;
|
||||
CreateNewEmailRuleFilterInteractor? _createNewEmailRuleFilterInteractor;
|
||||
EditEmailRuleFilterInteractor? _editEmailRuleFilterInteractor;
|
||||
|
||||
final _accountDashBoardController = Get.find<ManageAccountDashBoardController>();
|
||||
final _imagePaths = Get.find<ImagePaths>();
|
||||
@@ -45,12 +46,7 @@ class EmailRulesController extends BaseController {
|
||||
|
||||
final listEmailRule = <TMailRule>[].obs;
|
||||
|
||||
EmailRulesController(
|
||||
this._getAllRulesInteractor,
|
||||
this._deleteEmailRuleInteractor,
|
||||
this._createNewEmailRuleFilterInteractor,
|
||||
this._editEmailRuleFilterInteractor,
|
||||
);
|
||||
EmailRulesController();
|
||||
|
||||
@override
|
||||
void onDone() {
|
||||
@@ -71,16 +67,28 @@ class EmailRulesController extends BaseController {
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
_getAllRules();
|
||||
super.onInit();
|
||||
try {
|
||||
_getAllRulesInteractor = Get.find<GetAllRulesInteractor>();
|
||||
_deleteEmailRuleInteractor = Get.find<DeleteEmailRuleInteractor>();
|
||||
_createNewEmailRuleFilterInteractor = Get.find<CreateNewEmailRuleFilterInteractor>();
|
||||
_editEmailRuleFilterInteractor = Get.find<EditEmailRuleFilterInteractor>();
|
||||
} catch (e) {
|
||||
logError('EmailRulesController::onInit(): ${e.toString()}');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
_getAllRules();
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
void goToCreateNewRule(BuildContext context) async {
|
||||
final accountId = _accountDashBoardController.accountId.value;
|
||||
if (accountId != null) {
|
||||
final arguments = RulesFilterCreatorArguments(
|
||||
accountId,
|
||||
listEmailRule: listEmailRule);
|
||||
final session = _accountDashBoardController.sessionCurrent.value;
|
||||
if (accountId != null && session != null) {
|
||||
final arguments = RulesFilterCreatorArguments(accountId, session);
|
||||
|
||||
if (BuildUtils.isWeb) {
|
||||
showDialogRuleFilterCreator(
|
||||
@@ -107,9 +115,9 @@ class EmailRulesController extends BaseController {
|
||||
AccountId accountId,
|
||||
CreateNewEmailRuleFilterRequest ruleFilterRequest
|
||||
) async {
|
||||
consumeState(_createNewEmailRuleFilterInteractor.execute(
|
||||
accountId,
|
||||
ruleFilterRequest));
|
||||
if (_createNewEmailRuleFilterInteractor != null) {
|
||||
consumeState(_createNewEmailRuleFilterInteractor!.execute(accountId, ruleFilterRequest));
|
||||
}
|
||||
}
|
||||
|
||||
void _createNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) {
|
||||
@@ -127,12 +135,13 @@ class EmailRulesController extends BaseController {
|
||||
|
||||
void editEmailRule(BuildContext context, TMailRule rule) async {
|
||||
final accountId = _accountDashBoardController.accountId.value;
|
||||
if (accountId != null) {
|
||||
final session = _accountDashBoardController.sessionCurrent.value;
|
||||
if (accountId != null && session != null) {
|
||||
final arguments = RulesFilterCreatorArguments(
|
||||
accountId,
|
||||
session,
|
||||
actionType: CreatorActionType.edit,
|
||||
tMailRule: rule,
|
||||
listEmailRule: listEmailRule);
|
||||
tMailRule: rule);
|
||||
|
||||
if (BuildUtils.isWeb) {
|
||||
showDialogRuleFilterCreator(
|
||||
@@ -159,7 +168,9 @@ class EmailRulesController extends BaseController {
|
||||
AccountId accountId,
|
||||
EditEmailRuleFilterRequest ruleFilterRequest
|
||||
) {
|
||||
consumeState(_editEmailRuleFilterInteractor.execute(accountId, ruleFilterRequest));
|
||||
if (_editEmailRuleFilterInteractor != null) {
|
||||
consumeState(_editEmailRuleFilterInteractor!.execute(accountId, ruleFilterRequest));
|
||||
}
|
||||
}
|
||||
|
||||
void _editEmailRuleFilterSuccess(EditEmailRuleFilterSuccess success) {
|
||||
@@ -214,14 +225,17 @@ class EmailRulesController extends BaseController {
|
||||
void _handleDeleteEmailRuleAction(TMailRule emailRule) {
|
||||
popBack();
|
||||
|
||||
if (_deleteEmailRuleInteractor != null) {
|
||||
final deleteEmailRuleRequest = DeleteEmailRuleRequest(
|
||||
emailRuleDelete : emailRule,
|
||||
currentEmailRules: listEmailRule,
|
||||
);
|
||||
consumeState(_deleteEmailRuleInteractor.execute(
|
||||
|
||||
consumeState(_deleteEmailRuleInteractor!.execute(
|
||||
_accountDashBoardController.accountId.value!,
|
||||
deleteEmailRuleRequest));
|
||||
}
|
||||
}
|
||||
|
||||
void _handleDeleteEmailRuleSuccess(DeleteEmailRuleSuccess success) {
|
||||
if (currentOverlayContext != null && currentContext != null) {
|
||||
@@ -239,7 +253,9 @@ class EmailRulesController extends BaseController {
|
||||
}
|
||||
|
||||
void _getAllRules() {
|
||||
consumeState(_getAllRulesInteractor.execute(_accountDashBoardController.accountId.value!));
|
||||
if (_getAllRulesInteractor != null) {
|
||||
consumeState(_getAllRulesInteractor!.execute(_accountDashBoardController.accountId.value!));
|
||||
}
|
||||
}
|
||||
|
||||
void openEditRuleMenuAction(BuildContext context, TMailRule rule) {
|
||||
|
||||
@@ -21,7 +21,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oi
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.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';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.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/log_out_oidc_interactor.dart';
|
||||
@@ -73,7 +72,6 @@ class ManageAccountDashBoardBindings extends BaseBindings {
|
||||
Get.find<RemoteExceptionThrower>()
|
||||
));
|
||||
Get.lazyPut(() => ManageAccountDataSourceImpl(
|
||||
Get.find<ManageAccountAPI>(),
|
||||
Get.find<LanguageCacheManager>(),
|
||||
Get.find<RemoteExceptionThrower>()));
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_va
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vacation_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/action/dashboard_setting_action.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/email_rules/bindings/email_rules_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forward_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
||||
@@ -95,6 +95,7 @@ class ManageAccountDashBoardController extends ReloadableController {
|
||||
_getUserProfile();
|
||||
injectAutoCompleteBindings(sessionCurrent.value, accountId.value);
|
||||
injectForwardBindings(sessionCurrent.value, accountId.value);
|
||||
injectRuleFilterBindings(sessionCurrent.value, accountId.value);
|
||||
injectVacationBindings(sessionCurrent.value, accountId.value);
|
||||
_getVacationResponse();
|
||||
}
|
||||
@@ -108,6 +109,7 @@ class ManageAccountDashBoardController extends ReloadableController {
|
||||
_getUserProfile();
|
||||
injectAutoCompleteBindings(sessionCurrent.value, accountId.value);
|
||||
injectForwardBindings(sessionCurrent.value, accountId.value);
|
||||
injectRuleFilterBindings(sessionCurrent.value, accountId.value);
|
||||
injectVacationBindings(sessionCurrent.value, accountId.value);
|
||||
_getVacationResponse();
|
||||
if (arguments.menuSettingCurrent != null) {
|
||||
|
||||
+7
-4
@@ -1,21 +1,24 @@
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||
import 'package:rule_filter/rule_filter/tmail_rule.dart';
|
||||
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.dart';
|
||||
|
||||
class RulesFilterCreatorArguments with EquatableMixin {
|
||||
final AccountId accountId;
|
||||
final Session session;
|
||||
final CreatorActionType actionType;
|
||||
final TMailRule? tMailRule;
|
||||
final List<TMailRule>? listEmailRule;
|
||||
final EmailAddress? emailAddress;
|
||||
|
||||
RulesFilterCreatorArguments(this.accountId, {
|
||||
RulesFilterCreatorArguments(this.accountId, this.session, {
|
||||
this.actionType = CreatorActionType.create,
|
||||
this.tMailRule,
|
||||
this.listEmailRule
|
||||
this.emailAddress
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [accountId, actionType, tMailRule];
|
||||
List<Object?> get props => [accountId, actionType, session, tMailRule, emailAddress];
|
||||
}
|
||||
+40
-2
@@ -3,12 +3,16 @@ import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:core/presentation/utils/app_toast.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:core/utils/build_utils.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_action.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_append_in.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
|
||||
@@ -25,6 +29,8 @@ import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/v
|
||||
import 'package:tmail_ui_user/features/manage_account/data/extensions/list_tmail_rule_extensions.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/model/edit_email_rule_filter_request.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/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';
|
||||
@@ -41,6 +47,8 @@ class RulesFilterCreatorController extends BaseMailboxController {
|
||||
final VerifyNameInteractor _verifyNameInteractor;
|
||||
final GetAllMailboxInteractor _getAllMailboxInteractor;
|
||||
|
||||
GetAllRulesInteractor? _getAllRulesInteractor;
|
||||
|
||||
final errorRuleName = Rxn<String>();
|
||||
final errorRuleConditionValue = Rxn<String>();
|
||||
final errorRuleActionValue = Rxn<String>();
|
||||
@@ -62,7 +70,9 @@ class RulesFilterCreatorController extends BaseMailboxController {
|
||||
OnCreatedRuleFilterCallback? onCreatedRuleFilterCallback;
|
||||
VoidCallback? onDismissRuleFilterCreator;
|
||||
AccountId? _accountId;
|
||||
Session? _session;
|
||||
TMailRule? _currentTMailRule;
|
||||
EmailAddress? _emailAddress;
|
||||
List<TMailRule>? _listEmailRule;
|
||||
|
||||
RulesFilterCreatorController(
|
||||
@@ -78,6 +88,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
|
||||
inputConditionValueController = TextEditingController();
|
||||
inputRuleNameFocusNode = FocusNode();
|
||||
inputRuleConditionFocusNode = FocusNode();
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -85,10 +96,18 @@ class RulesFilterCreatorController extends BaseMailboxController {
|
||||
super.onReady();
|
||||
if (arguments != null) {
|
||||
_accountId = arguments!.accountId;
|
||||
_session = arguments!.session;
|
||||
_currentTMailRule = arguments!.tMailRule;
|
||||
_listEmailRule = arguments!.listEmailRule;
|
||||
_emailAddress = arguments!.emailAddress;
|
||||
actionType.value = arguments!.actionType;
|
||||
injectRuleFilterBindings(_session, _accountId);
|
||||
try {
|
||||
_getAllRulesInteractor = Get.find<GetAllRulesInteractor>();
|
||||
} catch (e) {
|
||||
logError('RulesFilterCreatorController::onInit(): ${e.toString()}');
|
||||
}
|
||||
_setUpDefaultValueRuleFilter();
|
||||
_getAllRules();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,7 +118,16 @@ class RulesFilterCreatorController extends BaseMailboxController {
|
||||
}
|
||||
|
||||
@override
|
||||
void onDone() {}
|
||||
void onDone() {
|
||||
viewState.value.fold((failure) {}, (success) {
|
||||
if (success is GetAllRulesSuccess) {
|
||||
log('RulesFilterCreatorController::onDone():GetAllRulesSuccess: ${success.rules}');
|
||||
if (success.rules?.isNotEmpty == true) {
|
||||
_listEmailRule = success.rules!;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void onData(Either<Failure, Success> newState) {
|
||||
@@ -114,12 +142,22 @@ class RulesFilterCreatorController extends BaseMailboxController {
|
||||
});
|
||||
}
|
||||
|
||||
void _getAllRules() {
|
||||
if (_accountId != null && _getAllRulesInteractor != null) {
|
||||
consumeState(_getAllRulesInteractor!.execute(_accountId!));
|
||||
}
|
||||
}
|
||||
|
||||
void _setUpDefaultValueRuleFilter() {
|
||||
switch(actionType.value) {
|
||||
case CreatorActionType.create:
|
||||
ruleConditionFieldSelected.value = rule_condition.Field.from;
|
||||
ruleConditionComparatorSelected.value = rule_condition.Comparator.contains;
|
||||
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
|
||||
if (_emailAddress != null) {
|
||||
_newRuleConditionValue = _emailAddress?.email;
|
||||
_setValueInputField(inputConditionValueController, _newRuleConditionValue ?? '');
|
||||
}
|
||||
break;
|
||||
case CreatorActionType.edit:
|
||||
if (_currentTMailRule != null) {
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:pointer_interceptor/pointer_interceptor.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
|
||||
import 'package:tmail_ui_user/features/base/widget/drop_down_button_widget.dart';
|
||||
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/extensions/rule_condition_extensions.dart';
|
||||
@@ -42,7 +43,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ResponsiveWidget(
|
||||
return PointerInterceptor(
|
||||
child: ResponsiveWidget(
|
||||
responsiveUtils: _responsiveUtils,
|
||||
mobile: Scaffold(
|
||||
backgroundColor: BuildUtils.isWeb
|
||||
@@ -115,6 +117,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
|
||||
)),
|
||||
)
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"@@last_modified": "2022-11-10T15:16:34.946211",
|
||||
"@@last_modified": "2022-11-11T04:08:42.994169",
|
||||
"initializing_data": "Initializing data...",
|
||||
"@initializing_data": {
|
||||
"type": "text",
|
||||
@@ -2497,5 +2497,11 @@
|
||||
"type": "text",
|
||||
"placeholders_order": [],
|
||||
"placeholders": {}
|
||||
},
|
||||
"quickCreatingRule": "Create a rule with this email",
|
||||
"@quickCreatingRule": {
|
||||
"type": "text",
|
||||
"placeholders_order": [],
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,7 @@ import 'package:tmail_ui_user/features/login/data/utils/library_platform/app_aut
|
||||
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/network/forwarding_api.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/network/identity_api.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/network/rule_filter_api.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/network/vacation_api.dart';
|
||||
import 'package:tmail_ui_user/features/quotas/data/network/quotas_api.dart';
|
||||
import 'package:tmail_ui_user/features/session/data/network/session_api.dart';
|
||||
@@ -81,7 +81,7 @@ class NetworkBindings extends Bindings {
|
||||
Get.find<JmapHttpClient.HttpClient>(),
|
||||
Get.find<DownloadManager>(),
|
||||
Get.find<DioClient>()));
|
||||
Get.put(ManageAccountAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||
Get.put(RuleFilterAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||
Get.put(VacationAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||
Get.put(ContactAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||
Get.put(IdentityAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||
|
||||
@@ -2563,4 +2563,10 @@ class AppLocalizations {
|
||||
name: 'textQuotasRunOutOfStorageContent',
|
||||
);
|
||||
}
|
||||
|
||||
String get quickCreatingRule {
|
||||
return Intl.message(
|
||||
'Create a rule with this email',
|
||||
name: 'quickCreatingRule');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user