TF-1363: [Presentation]: Implement enable or disable spam report for Mobile
This commit is contained in:
@@ -6,9 +6,12 @@ import 'package:get/get.dart';
|
|||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:package_info_plus/package_info_plus.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/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_categories.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.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/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_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/mailbox_search_tile_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_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}) {
|
List<Widget> _buildListChildTileWidget(BuildContext context, MailboxNode parentNode, {MailboxNode? lastNode}) {
|
||||||
return parentNode.childrenItems
|
return parentNode.childrenItems
|
||||||
?.map((mailboxNode) => mailboxNode.hasChildren()
|
?.map((mailboxNode) => mailboxNode.hasChildren()
|
||||||
@@ -314,6 +360,7 @@ class MailboxView extends GetWidget<MailboxController> {
|
|||||||
).build()
|
).build()
|
||||||
: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode,
|
: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode,
|
||||||
allSelectMode: controller.currentSelectMode.value)
|
allSelectMode: controller.currentSelectMode.value)
|
||||||
|
..addOnLongPressSpamReport((mailboxNode) => _openBottomSheetSpamMenuAction(context, mailboxNode.item))
|
||||||
..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item))
|
..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item))
|
||||||
..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode)))
|
..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode)))
|
||||||
.build())
|
.build())
|
||||||
|
|||||||
@@ -408,9 +408,12 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
|
|||||||
MailboxActions.delete
|
MailboxActions.delete
|
||||||
];
|
];
|
||||||
|
|
||||||
if(mailbox.isSpam) {
|
if (mailbox.isSpam) {
|
||||||
mailboxActionsSupported.insert(1,
|
mailboxActionsSupported.insert(
|
||||||
controller.mailboxDashBoardController.enableSpamRepot ? MailboxActions.disableSpamReport : MailboxActions.enableSpamReport);
|
1,
|
||||||
|
controller.mailboxDashBoardController.enableSpamReport
|
||||||
|
? MailboxActions.disableSpamReport
|
||||||
|
: MailboxActions.enableSpamReport);
|
||||||
}
|
}
|
||||||
|
|
||||||
final listContextMenuItemAction = mailboxActionsSupported
|
final listContextMenuItemAction = mailboxActionsSupported
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ typedef OnOpenMailboxFolderClick = void Function(MailboxNode);
|
|||||||
typedef OnSelectMailboxFolderClick = void Function(MailboxNode);
|
typedef OnSelectMailboxFolderClick = void Function(MailboxNode);
|
||||||
typedef OnMenuActionClick = void Function(RelativeRect, MailboxNode);
|
typedef OnMenuActionClick = void Function(RelativeRect, MailboxNode);
|
||||||
typedef OnDragItemAccepted = void Function(List<PresentationEmail>, PresentationMailbox);
|
typedef OnDragItemAccepted = void Function(List<PresentationEmail>, PresentationMailbox);
|
||||||
|
typedef OnLongPressSpamReport = void Function(MailboxNode);
|
||||||
|
|
||||||
class MailBoxFolderTileBuilder {
|
class MailBoxFolderTileBuilder {
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ class MailBoxFolderTileBuilder {
|
|||||||
OnSelectMailboxFolderClick? _onSelectMailboxFolderClick;
|
OnSelectMailboxFolderClick? _onSelectMailboxFolderClick;
|
||||||
OnMenuActionClick? _onMenuActionClick;
|
OnMenuActionClick? _onMenuActionClick;
|
||||||
OnDragItemAccepted? _onDragItemAccepted;
|
OnDragItemAccepted? _onDragItemAccepted;
|
||||||
|
OnLongPressSpamReport? _onLongPressSpamReport;
|
||||||
|
|
||||||
bool isHoverItem = false;
|
bool isHoverItem = false;
|
||||||
|
|
||||||
@@ -72,6 +74,10 @@ class MailBoxFolderTileBuilder {
|
|||||||
_onDragItemAccepted = onDragItemAccepted;
|
_onDragItemAccepted = onDragItemAccepted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addOnLongPressSpamReport(OnLongPressSpamReport onLongPressSpamReport) {
|
||||||
|
_onLongPressSpamReport = onLongPressSpamReport;
|
||||||
|
}
|
||||||
|
|
||||||
Widget build() => DragTarget<List<PresentationEmail>>(
|
Widget build() => DragTarget<List<PresentationEmail>>(
|
||||||
builder: (context, _, __,) {
|
builder: (context, _, __,) {
|
||||||
return _buildMailboxItem();
|
return _buildMailboxItem();
|
||||||
@@ -117,6 +123,9 @@ class MailBoxFolderTileBuilder {
|
|||||||
child: Opacity(
|
child: Opacity(
|
||||||
opacity: _mailboxNode.isActivated ? 1.0 : 0.3,
|
opacity: _mailboxNode.isActivated ? 1.0 : 0.3,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
|
onLongPress: _mailboxNode.item.isSpam ? () {
|
||||||
|
_onLongPressSpamReport?.call(_mailboxNode);
|
||||||
|
} : null,
|
||||||
onTap: () => allSelectMode == SelectMode.ACTIVE
|
onTap: () => allSelectMode == SelectMode.ACTIVE
|
||||||
? _onSelectMailboxFolderClick?.call(_mailboxNode)
|
? _onSelectMailboxFolderClick?.call(_mailboxNode)
|
||||||
: _onOpenMailboxFolderClick?.call(_mailboxNode),
|
: _onOpenMailboxFolderClick?.call(_mailboxNode),
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
enum SpamReportState {
|
enum SpamReportState {
|
||||||
enabled,
|
enabled,
|
||||||
disabled,
|
disabled;
|
||||||
}
|
|
||||||
|
|
||||||
extension SpamReportStateExtension on SpamReportState {
|
|
||||||
|
|
||||||
String get keyValue {
|
String get keyValue {
|
||||||
switch(this) {
|
switch(this) {
|
||||||
case SpamReportState.enabled:
|
case SpamReportState.enabled:
|
||||||
return 'enabled';
|
return 'enabled';
|
||||||
case SpamReportState.disabled:
|
case SpamReportState.disabled:
|
||||||
return 'disabled';
|
return 'disabled';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -12,7 +12,7 @@ class DeleteLastTimeDismissedSpamReportedInteractor {
|
|||||||
Stream<Either<Failure, Success>> execute() async* {
|
Stream<Either<Failure, Success>> execute() async* {
|
||||||
try {
|
try {
|
||||||
yield Right<Failure, Success>(DeleteLastTimeDismissedSpamReportedLoading());
|
yield Right<Failure, Success>(DeleteLastTimeDismissedSpamReportedLoading());
|
||||||
await _spamReportRepository.deleteLastTimeDismissedSpamReported();
|
await _spamReportRepository.deleteLastTimeDismissedSpamReported();
|
||||||
yield Right<Failure, Success>(DeleteLastTimeDismissedSpamReportedSuccess());
|
yield Right<Failure, Success>(DeleteLastTimeDismissedSpamReportedSuccess());
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left<Failure, Success>(DeleteLastTimeDismissedSpamReportedFailure(e));
|
yield Left<Failure, Success>(DeleteLastTimeDismissedSpamReportedFailure(e));
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ class DeleteSpamReportStateInteractor {
|
|||||||
Stream<Either<Failure, Success>> execute() async* {
|
Stream<Either<Failure, Success>> execute() async* {
|
||||||
try {
|
try {
|
||||||
yield Right<Failure, Success>(DeleteSpamReportStateLoading());
|
yield Right<Failure, Success>(DeleteSpamReportStateLoading());
|
||||||
await _spamReportRepository.deleteSpamReportState();
|
await _spamReportRepository.deleteSpamReportState();
|
||||||
yield Right<Failure, Success>(DeleteSpamReportStateSuccess());
|
yield Right<Failure, Success>(DeleteSpamReportStateSuccess());
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left<Failure, Success>(DeleteSpamReportStateFailure(e));
|
yield Left<Failure, Success>(DeleteSpamReportStateFailure(e));
|
||||||
|
|||||||
+2
-2
@@ -1527,7 +1527,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
dispatchAction(OpenSpamMailboxAction(context, presentationMailbox));
|
dispatchAction(OpenSpamMailboxAction(context, presentationMailbox));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get enableSpamRepot => spamReportController.enableSpamReport;
|
bool get enableSpamReport => spamReportController.enableSpamReport;
|
||||||
|
|
||||||
void _showSpamReportbanner() {
|
void _showSpamReportbanner() {
|
||||||
if (spamReportController.enableSpamReport) {
|
if (spamReportController.enableSpamReport) {
|
||||||
@@ -1536,7 +1536,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void storeSpamReportStateAction() {
|
void storeSpamReportStateAction() {
|
||||||
final _storeSpamReportState = enableSpamRepot ? SpamReportState.disabled : SpamReportState.enabled;
|
final _storeSpamReportState = enableSpamReport ? SpamReportState.disabled : SpamReportState.enabled;
|
||||||
spamReportController.storeSpamReportStateAction(_storeSpamReportState);
|
spamReportController.storeSpamReportStateAction(_storeSpamReportState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class SpamReportBannerWidget extends StatelessWidget {
|
|||||||
width: 8,
|
width: 8,
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
AppLocalizations.of(context).countNewSpamEmails(5),
|
AppLocalizations.of(context).countNewSpamEmails(_spamReportController.numberOfUnreadSpamEmails),
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
color: AppColor.primaryColor,
|
color: AppColor.primaryColor,
|
||||||
|
|||||||
Reference in New Issue
Block a user