TF-1363: [Presentation]: Implement enable or disable spam report for Mobile

This commit is contained in:
HuyNguyen
2023-01-17 09:53:58 +07:00
committed by Dat H. Pham
parent 272a36fdbc
commit bf353f820b
8 changed files with 74 additions and 18 deletions
@@ -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<MailboxController> {
]);
}
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<Widget> _bottomSheetIdentityActionTiles(
BuildContext context,
PresentationMailbox mailbox,
List<ContextMenuItemMailboxAction> 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<Widget> _buildListChildTileWidget(BuildContext context, MailboxNode parentNode, {MailboxNode? lastNode}) {
return parentNode.childrenItems
?.map((mailboxNode) => mailboxNode.hasChildren()
@@ -314,6 +360,7 @@ class MailboxView extends GetWidget<MailboxController> {
).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())
@@ -408,9 +408,12 @@ class MailboxView extends GetWidget<MailboxController> 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
@@ -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<PresentationEmail>, 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<List<PresentationEmail>>(
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),
@@ -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';
}
}
}
@@ -12,7 +12,7 @@ class DeleteLastTimeDismissedSpamReportedInteractor {
Stream<Either<Failure, Success>> execute() async* {
try {
yield Right<Failure, Success>(DeleteLastTimeDismissedSpamReportedLoading());
await _spamReportRepository.deleteLastTimeDismissedSpamReported();
await _spamReportRepository.deleteLastTimeDismissedSpamReported();
yield Right<Failure, Success>(DeleteLastTimeDismissedSpamReportedSuccess());
} catch (e) {
yield Left<Failure, Success>(DeleteLastTimeDismissedSpamReportedFailure(e));
@@ -12,7 +12,7 @@ class DeleteSpamReportStateInteractor {
Stream<Either<Failure, Success>> execute() async* {
try {
yield Right<Failure, Success>(DeleteSpamReportStateLoading());
await _spamReportRepository.deleteSpamReportState();
await _spamReportRepository.deleteSpamReportState();
yield Right<Failure, Success>(DeleteSpamReportStateSuccess());
} catch (e) {
yield Left<Failure, Success>(DeleteSpamReportStateFailure(e));
@@ -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);
}
@@ -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,