From bf353f820b59c48564d40c13ce10f1a18c128197 Mon Sep 17 00:00:00 2001 From: HuyNguyen Date: Tue, 17 Jan 2023 09:53:58 +0700 Subject: [PATCH] TF-1363: [Presentation]: Implement enable or disable spam report for Mobile --- .../mailbox/presentation/mailbox_view.dart | 47 +++++++++++++++++++ .../presentation/mailbox_view_web.dart | 9 ++-- .../widgets/mailbox_folder_tile_builder.dart | 9 ++++ .../domain/model/spam_report_state.dart | 17 +++---- ...me_dismissed_spam_reported_interactor.dart | 2 +- .../delete_spam_report_state_interactor.dart | 2 +- .../mailbox_dashboard_controller.dart | 4 +- .../widgets/spam_report_banner_widget.dart | 2 +- 8 files changed, 74 insertions(+), 18 deletions(-) diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index cc8842a49..bfa8db8c1 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -6,9 +6,12 @@ import 'package:get/get.dart'; import 'package:model/model.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/context_item_mailbox_action.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_bottom_sheet_action_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_builder.dart'; @@ -297,6 +300,49 @@ class MailboxView extends GetWidget { ]); } + void _openBottomSheetSpamMenuAction(BuildContext context, PresentationMailbox mailbox) { + final _spamActionsSupported = [ + controller.mailboxDashBoardController.enableSpamReport + ? MailboxActions.disableSpamReport + : MailboxActions.enableSpamReport + ]; + + final listContextSpamPopupMenuItemAction = _spamActionsSupported + .map((action) => ContextMenuItemMailboxAction(action, action.getContextMenuItemState(mailbox))) + .toList(); + + controller.openContextMenuAction( + context, + _bottomSheetIdentityActionTiles(context, mailbox, listContextSpamPopupMenuItemAction)); + } + + List _bottomSheetIdentityActionTiles( + BuildContext context, + PresentationMailbox mailbox, + List contextMenuActions) { + return contextMenuActions + .map((action) => _openBottomSheetSpamMenuActionTile(context, action, mailbox)) + .toList(); + } + + Widget _openBottomSheetSpamMenuActionTile( + BuildContext context, + ContextMenuItemMailboxAction contextMenuItem, + PresentationMailbox mailbox) { + return (MailboxBottomSheetActionTileBuilder( + Key('${contextMenuItem.action.name}_action'), + SvgPicture.asset( + contextMenuItem.action.getContextMenuIcon(_imagePaths), + color: AppColor.primaryColor), + contextMenuItem.action.getTitleContextMenu(context), + mailbox, + absorbing: !contextMenuItem.isActivated, + opacity: !contextMenuItem.isActivated) + ..onActionClick((mailbox) => controller.handleMailboxAction( + context, contextMenuItem.action, mailbox))) + .build(); + } + List _buildListChildTileWidget(BuildContext context, MailboxNode parentNode, {MailboxNode? lastNode}) { return parentNode.childrenItems ?.map((mailboxNode) => mailboxNode.hasChildren() @@ -314,6 +360,7 @@ class MailboxView extends GetWidget { ).build() : Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, allSelectMode: controller.currentSelectMode.value) + ..addOnLongPressSpamReport((mailboxNode) => _openBottomSheetSpamMenuAction(context, mailboxNode.item)) ..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) ..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode))) .build()) diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 9676df84c..498773ef8 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -408,9 +408,12 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu MailboxActions.delete ]; - if(mailbox.isSpam) { - mailboxActionsSupported.insert(1, - controller.mailboxDashBoardController.enableSpamRepot ? MailboxActions.disableSpamReport : MailboxActions.enableSpamReport); + if (mailbox.isSpam) { + mailboxActionsSupported.insert( + 1, + controller.mailboxDashBoardController.enableSpamReport + ? MailboxActions.disableSpamReport + : MailboxActions.enableSpamReport); } final listContextMenuItemAction = mailboxActionsSupported diff --git a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart index 9456dcb50..3cabf4cfb 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -15,6 +15,7 @@ typedef OnOpenMailboxFolderClick = void Function(MailboxNode); typedef OnSelectMailboxFolderClick = void Function(MailboxNode); typedef OnMenuActionClick = void Function(RelativeRect, MailboxNode); typedef OnDragItemAccepted = void Function(List, PresentationMailbox); +typedef OnLongPressSpamReport = void Function(MailboxNode); class MailBoxFolderTileBuilder { @@ -35,6 +36,7 @@ class MailBoxFolderTileBuilder { OnSelectMailboxFolderClick? _onSelectMailboxFolderClick; OnMenuActionClick? _onMenuActionClick; OnDragItemAccepted? _onDragItemAccepted; + OnLongPressSpamReport? _onLongPressSpamReport; bool isHoverItem = false; @@ -72,6 +74,10 @@ class MailBoxFolderTileBuilder { _onDragItemAccepted = onDragItemAccepted; } + void addOnLongPressSpamReport(OnLongPressSpamReport onLongPressSpamReport) { + _onLongPressSpamReport = onLongPressSpamReport; + } + Widget build() => DragTarget>( builder: (context, _, __,) { return _buildMailboxItem(); @@ -117,6 +123,9 @@ class MailBoxFolderTileBuilder { child: Opacity( opacity: _mailboxNode.isActivated ? 1.0 : 0.3, child: InkWell( + onLongPress: _mailboxNode.item.isSpam ? () { + _onLongPressSpamReport?.call(_mailboxNode); + } : null, onTap: () => allSelectMode == SelectMode.ACTIVE ? _onSelectMailboxFolderClick?.call(_mailboxNode) : _onOpenMailboxFolderClick?.call(_mailboxNode), diff --git a/lib/features/mailbox_dashboard/domain/model/spam_report_state.dart b/lib/features/mailbox_dashboard/domain/model/spam_report_state.dart index 229502514..b288ec814 100644 --- a/lib/features/mailbox_dashboard/domain/model/spam_report_state.dart +++ b/lib/features/mailbox_dashboard/domain/model/spam_report_state.dart @@ -1,16 +1,13 @@ enum SpamReportState { enabled, - disabled, -} - -extension SpamReportStateExtension on SpamReportState { - + disabled; + String get keyValue { - switch(this) { - case SpamReportState.enabled: - return 'enabled'; - case SpamReportState.disabled: - return 'disabled'; + switch(this) { + case SpamReportState.enabled: + return 'enabled'; + case SpamReportState.disabled: + return 'disabled'; } } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/usecases/delete_last_time_dismissed_spam_reported_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/delete_last_time_dismissed_spam_reported_interactor.dart index 1d666f701..e7b73f715 100644 --- a/lib/features/mailbox_dashboard/domain/usecases/delete_last_time_dismissed_spam_reported_interactor.dart +++ b/lib/features/mailbox_dashboard/domain/usecases/delete_last_time_dismissed_spam_reported_interactor.dart @@ -12,7 +12,7 @@ class DeleteLastTimeDismissedSpamReportedInteractor { Stream> execute() async* { try { yield Right(DeleteLastTimeDismissedSpamReportedLoading()); - await _spamReportRepository.deleteLastTimeDismissedSpamReported(); + await _spamReportRepository.deleteLastTimeDismissedSpamReported(); yield Right(DeleteLastTimeDismissedSpamReportedSuccess()); } catch (e) { yield Left(DeleteLastTimeDismissedSpamReportedFailure(e)); diff --git a/lib/features/mailbox_dashboard/domain/usecases/delete_spam_report_state_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/delete_spam_report_state_interactor.dart index 7844845b0..74e5d9a57 100644 --- a/lib/features/mailbox_dashboard/domain/usecases/delete_spam_report_state_interactor.dart +++ b/lib/features/mailbox_dashboard/domain/usecases/delete_spam_report_state_interactor.dart @@ -12,7 +12,7 @@ class DeleteSpamReportStateInteractor { Stream> execute() async* { try { yield Right(DeleteSpamReportStateLoading()); - await _spamReportRepository.deleteSpamReportState(); + await _spamReportRepository.deleteSpamReportState(); yield Right(DeleteSpamReportStateSuccess()); } catch (e) { yield Left(DeleteSpamReportStateFailure(e)); diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 51af2140e..556f87ed2 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1527,7 +1527,7 @@ class MailboxDashBoardController extends ReloadableController { dispatchAction(OpenSpamMailboxAction(context, presentationMailbox)); } - bool get enableSpamRepot => spamReportController.enableSpamReport; + bool get enableSpamReport => spamReportController.enableSpamReport; void _showSpamReportbanner() { if (spamReportController.enableSpamReport) { @@ -1536,7 +1536,7 @@ class MailboxDashBoardController extends ReloadableController { } void storeSpamReportStateAction() { - final _storeSpamReportState = enableSpamRepot ? SpamReportState.disabled : SpamReportState.enabled; + final _storeSpamReportState = enableSpamReport ? SpamReportState.disabled : SpamReportState.enabled; spamReportController.storeSpamReportStateAction(_storeSpamReportState); } diff --git a/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart b/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart index ff0c7e47c..7d6d3dd44 100644 --- a/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart +++ b/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart @@ -46,7 +46,7 @@ class SpamReportBannerWidget extends StatelessWidget { width: 8, ), Text( - AppLocalizations.of(context).countNewSpamEmails(5), + AppLocalizations.of(context).countNewSpamEmails(_spamReportController.numberOfUnreadSpamEmails), style: const TextStyle( fontSize: 16, color: AppColor.primaryColor,