TF-1363: [Presentation] Implement disable and enable spam report

This commit is contained in:
HuyNguyen
2023-01-16 17:32:02 +07:00
committed by Dat H. Pham
parent 7a85c15f98
commit 04fd640384
27 changed files with 388 additions and 199 deletions
+5
View File
@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.2407 15.4042C19.906 15.7389 19.906 16.2816 20.2407 16.6164C20.5754 16.9511 21.1182 16.9511 21.4529 16.6164L21.6581 16.4112C22.0599 16.0093 22.2857 15.4643 22.2857 14.896V9.10394C22.2857 8.53562 22.0599 7.99057 21.6581 7.58871L16.4112 2.34186C16.0094 1.94 15.4643 1.71423 14.896 1.71423H9.10398C8.53566 1.71423 7.99062 1.94 7.58875 2.34186L7.38356 2.54705C7.04883 2.88179 7.04883 3.4245 7.38356 3.75924C7.7183 4.09397 8.26101 4.09397 8.59575 3.75924L8.80094 3.55404C8.88131 3.47367 8.99032 3.42852 9.10398 3.42852H14.896C15.0097 3.42852 15.1187 3.47367 15.1991 3.55404L20.4459 8.80089C20.5263 8.88126 20.5714 8.99027 20.5714 9.10394V14.896C20.5714 15.0096 20.5263 15.1186 20.4459 15.199L20.2407 15.4042Z" fill="#007AFF"/>
<path d="M12.1052 14.4053L11.9999 14.4C11.4319 14.4 10.9715 14.8605 10.9715 15.4285C10.9715 15.961 11.3762 16.399 11.8948 16.4517L12 16.457C12.5681 16.457 13.0285 15.9965 13.0285 15.4285C13.0285 14.896 12.6238 14.458 12.1052 14.4053Z" fill="#007AFF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.35925 5.57136L2.34191 7.58871C1.94004 7.99057 1.71428 8.53562 1.71428 9.10394V14.896C1.71428 15.4643 1.94004 16.0093 2.34191 16.4112L7.58875 21.658C7.99062 22.0599 8.53566 22.2857 9.10398 22.2857H14.896C15.4643 22.2857 16.0094 22.0599 16.4112 21.658L18.4286 19.6407L19.2731 20.4852C19.6079 20.82 20.1506 20.82 20.4853 20.4852C20.82 20.1505 20.82 19.6078 20.4853 19.2731L12.8571 11.6448V7.71423C12.8571 7.24085 12.4733 6.85709 11.9999 6.85709C11.5266 6.85709 11.1428 7.24085 11.1428 7.71423V9.93055L4.72692 3.51467C4.39219 3.17994 3.84948 3.17994 3.51474 3.51467C3.18001 3.84941 3.18001 4.39212 3.51474 4.72685L4.35925 5.57136ZM5.57143 6.78355L17.2164 18.4285L15.1991 20.4459C15.1187 20.5262 15.0097 20.5714 14.896 20.5714H9.10398C8.99032 20.5714 8.88131 20.5262 8.80094 20.4459L3.55409 15.199C3.47372 15.1186 3.42857 15.0096 3.42857 14.896V9.10394C3.42857 8.99027 3.47372 8.88126 3.55409 8.80089L5.57143 6.78355Z" fill="#007AFF"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.896 1.71423C15.4643 1.71423 16.0093 1.94 16.4112 2.34186L21.658 7.58871C22.0599 7.99057 22.2857 8.53562 22.2857 9.10394V14.896C22.2857 15.4643 22.0599 16.0093 21.658 16.4112L16.4112 21.658C16.0093 22.0599 15.4643 22.2857 14.896 22.2857H9.10394C8.53562 22.2857 7.99057 22.0599 7.58871 21.658L2.34186 16.4112C1.94 16.0093 1.71423 15.4643 1.71423 14.896V9.10394C1.71423 8.53562 1.94 7.99057 2.34186 7.58871L7.58871 2.34186C7.99057 1.94 8.53562 1.71423 9.10394 1.71423H14.896ZM14.896 3.42852H9.10394C8.99027 3.42852 8.88126 3.47367 8.80089 3.55404L3.55404 8.80089C3.47367 8.88126 3.42852 8.99027 3.42852 9.10394V14.896C3.42852 15.0096 3.47367 15.1186 3.55404 15.199L8.80089 20.4459C8.88126 20.5262 8.99027 20.5714 9.10394 20.5714H14.896C15.0096 20.5714 15.1186 20.5262 15.199 20.4459L20.4459 15.199C20.5262 15.1186 20.5714 15.0096 20.5714 14.896V9.10394C20.5714 8.99027 20.5262 8.88126 20.4459 8.80089L15.199 3.55404C15.1186 3.47367 15.0096 3.42852 14.896 3.42852ZM11.9999 14.4L12.1052 14.4053C12.6238 14.458 13.0285 14.896 13.0285 15.4285C13.0285 15.9965 12.5681 16.457 12 16.457L11.8948 16.4517C11.3762 16.399 10.9715 15.961 10.9715 15.4285C10.9715 14.8605 11.4319 14.4 11.9999 14.4ZM11.9999 6.85709C12.4733 6.85709 12.8571 7.24085 12.8571 7.71423V11.9999C12.8571 12.4733 12.4733 12.8571 11.9999 12.8571C11.5266 12.8571 11.1428 12.4733 11.1428 11.9999V7.71423C11.1428 7.24085 11.5266 6.85709 11.9999 6.85709Z" fill="#007AFF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

+6 -23
View File
@@ -1,23 +1,6 @@
FIREBASE_ANDROID_API_KEY=AIzaSyDPn3T4BMShrcedtqzA-8Lh3Fsm1EGB7S8
FIREBASE_ANDROID_APP_ID=1:611786135906:android:6fa64d94eb8f8603e3743b
FIREBASE_ANDROID_MESSAGING_SENDER_ID=611786135906
FIREBASE_ANDROID_PROJECT_ID=fir-jmap-poc
FIREBASE_ANDROID_DATABASE_URL=https://fir-jmap-poc-default-rtdb.asia-southeast1.firebasedatabase.app
FIREBASE_ANDROID_STORAGE_BUCKET=fir-jmap-poc.appspot.com
FIREBASE_IOS_API_KEY=AIzaSyA_fAC-6rVLsQtj8AXxRRYjwsOHCKPTm6w
FIREBASE_IOS_APP_ID=1:611786135906:ios:d8b0899dc058dd2ae3743b
FIREBASE_IOS_MESSAGING_SENDER_ID=611786135906
FIREBASE_IOS_PROJECT_ID=fir-jmap-poc
FIREBASE_IOS_DATABASE_URL=https://fir-jmap-poc-default-rtdb.asia-southeast1.firebasedatabase.app
FIREBASE_IOS_STORAGE_BUCKET=fir-jmap-poc.appspot.com
FIREBASE_IOS_CLIENT_ID=611786135906-2nqn5c537eer6c95rcujmlfmldbkqfqb.apps.googleusercontent.com
FIREBASE_IOS_BUNDLE_ID=com.linagora.ios.teammail
FIREBASE_WEB_API_KEY=AIzaSyABpxntIXA2u_uFFMT4wvHYMgVm7UZPMrM
FIREBASE_WEB_APP_ID=1:611786135906:web:22d98cfd47b4fddde3743b
FIREBASE_WEB_MESSAGING_SENDER_ID=611786135906
FIREBASE_WEB_PROJECT_ID=fir-jmap-poc
FIREBASE_WEB_DATABASE_URL=https://fir-jmap-poc-default-rtdb.asia-southeast1.firebasedatabase.app
FIREBASE_WEB_STORAGE_BUCKET=fir-jmap-poc.appspot.com
FIREBASE_WEB_AUTH_DOMAIN=fir-jmap-poc.firebaseapp.com
FIREBASE_ANDROID_API_KEY=example
FIREBASE_ANDROID_APP_ID=example
FIREBASE_ANDROID_MESSAGING_SENDER_ID=example
FIREBASE_ANDROID_PROJECT_ID=example
FIREBASE_ANDROID_DATABASE_URL=https://example.com
FIREBASE_ANDROID_STORAGE_BUCKET=example.com
@@ -164,6 +164,8 @@ class ImagePaths {
String get icPageNotFound => _getImagePath('ic_page_not_found.svg');
String get icOpenInNewTab => _getImagePath('ic_open_in_new_tab.svg');
String get icInfoCircleOutline => _getImagePath('ic_info_circle_outline.svg');
String get icSpamReportDisable => _getImagePath('ic_spam_report_disable.svg');
String get icSpamReportEnable => _getImagePath('ic_spam_report_enable.svg');
String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
+1 -1
View File
@@ -1,4 +1,4 @@
SERVER_URL=https://gateway.upn.integration-open-paas.org
SERVER_URL=http://localhost/
DOMAIN_REDIRECT_URL=http://localhost:3000
WEB_OIDC_CLIENT_ID=teammail-web
APP_GRID_AVAILABLE=supported
@@ -57,6 +57,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_na
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
@@ -1120,6 +1121,12 @@ class MailboxController extends BaseMailboxController {
case MailboxActions.openInNewTab:
openMailboxInNewTabAction(mailbox);
break;
case MailboxActions.disableSpamReport:
case MailboxActions.enableSpamReport:
final _currentSpamReportState = mailboxDashBoardController.enableSpamRepot;
final _storeSpamReportState = _currentSpamReportState ? SpamReportState.disabled : SpamReportState.enabled;
mailboxDashBoardController.storeSpamReportStateAction(_storeSpamReportState);
return;
default:
break;
}
@@ -408,6 +408,11 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
MailboxActions.delete
];
if(mailbox.isSpam) {
mailboxActionsSupported.insert(1,
controller.mailboxDashBoardController.enableSpamRepot ? MailboxActions.disableSpamReport : MailboxActions.enableSpamReport);
}
final listContextMenuItemAction = mailboxActionsSupported
.map((action) => ContextMenuItemMailboxAction(
action,
@@ -488,7 +493,7 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
styleName: TextStyle(
fontWeight: FontWeight.normal,
fontSize: 17,
color: contextMenuItem.action.getColorContextMenuIcon()),
color: contextMenuItem.action.getColorContextMenuTitle()),
onCallbackAction: () =>
controller.handleMailboxAction(context, contextMenuItem.action, mailbox)),
),
@@ -14,7 +14,9 @@ enum MailboxActions {
move,
markAsRead,
selectForRuleAction,
openInNewTab
openInNewTab,
disableSpamReport,
enableSpamReport
}
extension MailboxActionsExtension on MailboxActions {
@@ -38,6 +40,10 @@ extension MailboxActionsExtension on MailboxActions {
switch(this) {
case MailboxActions.openInNewTab:
return AppLocalizations.of(context).openInNewTab;
case MailboxActions.disableSpamReport:
return AppLocalizations.of(context).disableSpamReport;
case MailboxActions.enableSpamReport:
return AppLocalizations.of(context).enableSpamReport;
case MailboxActions.markAsRead:
return AppLocalizations.of(context).mark_as_read;
case MailboxActions.move:
@@ -55,6 +61,10 @@ extension MailboxActionsExtension on MailboxActions {
switch(this) {
case MailboxActions.openInNewTab:
return imagePaths.icOpenInNewTab;
case MailboxActions.disableSpamReport:
return imagePaths.icSpamReportDisable;
case MailboxActions.enableSpamReport:
return imagePaths.icSpamReportEnable;
case MailboxActions.markAsRead:
return imagePaths.icRead;
case MailboxActions.move:
@@ -68,10 +78,22 @@ extension MailboxActionsExtension on MailboxActions {
}
}
Color getColorContextMenuTitle() {
switch(this) {
case MailboxActions.delete:
return AppColor.colorActionDeleteConfirmDialog;
default:
return Colors.black;
}
}
Color getColorContextMenuIcon() {
switch(this) {
case MailboxActions.delete:
return AppColor.colorActionDeleteConfirmDialog;
case MailboxActions.disableSpamReport:
case MailboxActions.enableSpamReport:
return AppColor.primaryColor;
default:
return Colors.black;
}
@@ -116,6 +138,8 @@ extension MailboxActionsExtension on MailboxActions {
ContextMenuItemState getContextMenuItemState(PresentationMailbox mailbox) {
switch(this) {
case MailboxActions.openInNewTab:
case MailboxActions.disableSpamReport:
case MailboxActions.enableSpamReport:
return ContextMenuItemState.activated;
case MailboxActions.markAsRead:
return mailbox.getCountUnReadEmails().isNotEmpty
@@ -23,5 +23,5 @@ abstract class SpamReportDataSource {
Future<void> storeSpamReportState(SpamReportState spamReportState);
Future<void> deletestoreSpamReportState();
Future<void> deleteSpamReportState();
}
@@ -51,7 +51,7 @@ class SharePreferenceSpamReportDataSourceImpl extends SpamReportDataSource {
}
@override
Future<void> deletestoreSpamReportState() {
Future<void> deleteSpamReportState() {
return Future.sync(() async {
return await _sharePreferenceSpamReportDataSource.deleteLastTimeDismissedSpamReported();
}).catchError((error) {
@@ -47,7 +47,7 @@ class SpamReportDataSourceImpl extends SpamReportDataSource {
}
@override
Future<void> deletestoreSpamReportState() {
Future<void> deleteSpamReportState() {
throw UnimplementedError();
}
@@ -42,7 +42,7 @@ class SharePreferenceSpamReportDataSource extends SpamReportDataSource {
}
@override
Future<bool> deletestoreSpamReportState() async {
Future<bool> deleteSpamReportState() async {
return await _sharedPreferences.remove(MailboxDashboardConstant.keySpamReportState);
}
@@ -52,7 +52,7 @@ class SpamReportRepositoryImpl extends SpamReportRepository {
}
@override
Future<void> deletestoreSpamReportState() {
return mapDataSource[DataSourceType.local]!.deletestoreSpamReportState();
Future<void> deleteSpamReportState() {
return mapDataSource[DataSourceType.local]!.deleteSpamReportState();
}
}
@@ -23,5 +23,5 @@ abstract class SpamReportRepository {
Future<void> storeSpamReportState(SpamReportState spamReportState);
Future<void> deletestoreSpamReportState();
Future<void> deleteSpamReportState();
}
@@ -1,11 +1,13 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
class StoreSpamReportStateLoading extends UIState {}
class StoreSpamReportStateSuccess extends UIState {
final SpamReportState spamReportState;
StoreSpamReportStateSuccess();
StoreSpamReportStateSuccess(this.spamReportState);
@override
List<Object> get props => [];
@@ -12,7 +12,7 @@ class DeleteSpamReportStateInteractor {
Stream<Either<Failure, Success>> execute() async* {
try {
yield Right<Failure, Success>(DeleteSpamReportStateLoading());
await _spamReportRepository.deletestoreSpamReportState();
await _spamReportRepository.deleteSpamReportState();
yield Right<Failure, Success>(DeleteSpamReportStateSuccess());
} catch (e) {
yield Left<Failure, Success>(DeleteSpamReportStateFailure(e));
@@ -1,15 +1,13 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/spam_report_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_spam_report_state.dart';
class StoreSpamReportStateInteractor {
class GetSpamReportStateInteractor {
final SpamReportRepository _spamReportRepository;
StoreSpamReportStateInteractor(this._spamReportRepository);
GetSpamReportStateInteractor(this._spamReportRepository);
Stream<Either<Failure, Success>> execute() async* {
try {
@@ -28,7 +28,7 @@ class GetUnreadSpamMailboxInteractor {
final _checkTimeCondition = (_timeLast.inHours > 0) && (_timeLast.inHours > conditionsForDisplayingSpamReportBanner);
if (_checkTimeCondition) {
if (true) {
final _response = await _spamReportRepository.getUnreadSpamMailbox(accountId, mailboxFilterCondition: mailboxFilterCondition, limit: limit);
final _unreadSpamMailbox = _response.unreadSpamMailbox;
@@ -15,7 +15,7 @@ class StoreSpamReportStateInteractor {
try {
yield Right<Failure, Success>(StoreSpamReportStateLoading());
await _spamReportRepository.storeSpamReportState(spamReportState);
yield Right<Failure, Success>(StoreSpamReportStateSuccess());
yield Right<Failure, Success>(StoreSpamReportStateSuccess(spamReportState));
} catch (e) {
yield Left<Failure, Success>(StoreSpamReportStateFailure(e));
}
@@ -73,6 +73,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/spam_
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_app_dashboard_configuration_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_composer_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_on_web_interactor.dart';
@@ -80,6 +81,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_composer_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart';
@@ -135,6 +137,8 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.put(SpamReportController(
Get.find<StoreSpamReportInteractor>(),
Get.find<GetUnreadSpamMailboxInteractor>(),
Get.find<StoreSpamReportStateInteractor>(),
Get.find<GetSpamReportStateInteractor>()
));
Get.put(MailboxDashBoardController(
Get.find<LogoutOidcInteractor>(),
@@ -287,6 +291,10 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.find<SpamReportRepository>()));
Get.lazyPut(() => GetUnreadSpamMailboxInteractor(
Get.find<SpamReportRepository>()));
Get.lazyPut(() => StoreSpamReportStateInteractor(
Get.find<SpamReportRepository>()));
Get.lazyPut(() => GetSpamReportStateInteractor(
Get.find<SpamReportRepository>()));
}
@override
@@ -47,6 +47,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read
import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_app_dashboard_configuration_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_composer_cache_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
@@ -416,7 +417,7 @@ class MailboxDashBoardController extends ReloadableController {
} else {
dispatchRoute(DashboardRoutes.thread);
}
spamReportController.getUnreadSpamMailboxAction(accountId.value!);
_showSpamReportbanner();
} else {
dispatchRoute(DashboardRoutes.thread);
reload();
@@ -1526,6 +1527,18 @@ class MailboxDashBoardController extends ReloadableController {
dispatchAction(OpenSpamMailboxAction(context, presentationMailbox));
}
bool get enableSpamRepot => spamReportController.enableSpamReport;
void _showSpamReportbanner() {
if (spamReportController.enableSpamReport) {
spamReportController.getUnreadSpamMailboxAction(accountId.value!);
}
}
void storeSpamReportStateAction(SpamReportState spamReportState) {
spamReportController.storeSpamReportStateAction(spamReportState);
}
@override
void onClose() {
_emailReceiveManager.closeEmailReceiveManagerStream();
@@ -7,19 +7,31 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox_filter_condition.dart
import 'package:model/extensions/mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_number_of_unread_spam_emails_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_spam_report_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/store_last_time_dismissed_spam_reported_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/store_spam_report_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
class SpamReportController extends BaseController {
final StoreSpamReportInteractor _storeSpamReportInteractor;
final GetUnreadSpamMailboxInteractor _getNumberOfUnreadSpamEmailsInteractor;
final StoreSpamReportStateInteractor _storeSpamReportStateInteractor;
final GetSpamReportStateInteractor _getSpamReportStateInteractor;
final _presentationSpamMailbox = Rxn<PresentationMailbox>();
final _spamReportState = Rxn<SpamReportState>(SpamReportState.enabled);
SpamReportController(this._storeSpamReportInteractor, this._getNumberOfUnreadSpamEmailsInteractor);
SpamReportController(
this._storeSpamReportInteractor,
this._getNumberOfUnreadSpamEmailsInteractor,
this._storeSpamReportStateInteractor,
this._getSpamReportStateInteractor);
@override
void onDone() {
@@ -34,6 +46,12 @@ class SpamReportController extends BaseController {
} else if (success is StoreLastTimeDismissedSpamReportSuccess) {
_presentationSpamMailbox.value = null;
log('SpamReportController::StoreLastTimeDismissedSpamReportSuccess():success $success');
} else if (success is GetSpamReportStateSuccess) {
_spamReportState.value = success.spamReportState;
log('SpamReportController::GetSpamReportStateSuccess():success $success');
} else if (success is StoreSpamReportStateSuccess) {
_spamReportState.value = success.spamReportState;
log('SpamReportController::StoreSpamReportStateSuccess():success $success');
}
},
);
@@ -45,6 +63,7 @@ class SpamReportController extends BaseController {
void getUnreadSpamMailboxAction(AccountId accountId) {
final _mailboxFilterCondition = MailboxFilterCondition(role: Role('Spam'));
getSpamReportStateAction();
consumeState(_getNumberOfUnreadSpamEmailsInteractor.execute(accountId,mailboxFilterCondition: _mailboxFilterCondition));
}
@@ -56,9 +75,19 @@ class SpamReportController extends BaseController {
int get numberOfUnreadSpamEmails => (_presentationSpamMailbox.value?.unreadEmails?.value.value ?? 0).toInt();
bool get enableSpamReport => _spamReportState.value == SpamReportState.enabled;
void openMailbox(BuildContext context) {
final _mailboxDashBoardController = Get.find<MailboxDashBoardController>();
dismissSpamReportAction();
_mailboxDashBoardController.openSpamMailboxAction(context, _presentationSpamMailbox.value!);
}
void storeSpamReportStateAction(SpamReportState spamReportState) {
consumeState(_storeSpamReportStateInteractor.execute(spamReportState));
}
void getSpamReportStateAction() {
consumeState(_getSpamReportStateInteractor.execute());
}
}
@@ -15,7 +15,7 @@ class SpamReportBannerWebWidget extends StatelessWidget {
final _spamReportController = Get.find<SpamReportController>();
final _imagePaths = Get.find<ImagePaths>();
return Obx(() {
if (_spamReportController.notShowSpamReportBanner) {
if (!_spamReportController.enableSpamReport || _spamReportController.notShowSpamReportBanner) {
return const SizedBox(
height: 8,
);
@@ -15,7 +15,7 @@ class SpamReportBannerWidget extends StatelessWidget {
final _imagePaths = Get.find<ImagePaths>();
return Obx(() {
if (_spamReportController.notShowSpamReportBanner) {
if (!_spamReportController.enableSpamReport || _spamReportController.notShowSpamReportBanner) {
return const SizedBox.shrink();
}
return Container(
@@ -2669,4 +2669,18 @@ class AppLocalizations {
name: 'dismiss',
);
}
String get disableSpamReport {
return Intl.message(
'Disable Spam report',
name: 'disableSpamReport',
);
}
String get enableSpamReport {
return Intl.message(
'Enable Spam report',
name: 'enableSpamReport',
);
}
}
@@ -3,25 +3,26 @@
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i3;
import 'dart:async' as _i4;
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i13;
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i9;
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart' as _i7;
import 'package:jmap_dart_client/jmap/core/state.dart' as _i10;
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i6;
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i12;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i14;
import 'package:jmap_dart_client/jmap/account_id.dart' as _i6;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i14;
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i10;
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart' as _i8;
import 'package:jmap_dart_client/jmap/core/state.dart' as _i11;
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i7;
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i13;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i15;
import 'package:mockito/mockito.dart' as _i1;
import 'package:model/email/presentation_email.dart' as _i2;
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'
as _i8;
as _i9;
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
as _i4;
as _i5;
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart'
as _i11;
as _i12;
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
as _i2;
as _i3;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
@@ -33,80 +34,127 @@ import 'package:tmail_ui_user/features/thread/domain/repository/thread_repositor
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
class _FakePresentationEmail_0 extends _i1.Fake
implements _i2.PresentationEmail {}
/// A class which mocks [ThreadRepository].
///
/// See the documentation for Mockito's code generation for more information.
class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
class MockThreadRepository extends _i1.Mock implements _i3.ThreadRepository {
MockThreadRepository() {
_i1.throwOnMissingStub(this);
}
@override
_i3.Stream<_i4.EmailsResponse> getAllEmail(_i5.AccountId? accountId,
{_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort,
_i8.EmailFilter? emailFilter,
_i9.Properties? propertiesCreated,
_i9.Properties? propertiesUpdated}) =>
_i4.Stream<_i5.EmailsResponse> getAllEmail(
_i6.AccountId? accountId, {
_i7.UnsignedInt? limit,
Set<_i8.Comparator>? sort,
_i9.EmailFilter? emailFilter,
_i10.Properties? propertiesCreated,
_i10.Properties? propertiesUpdated,
}) =>
(super.noSuchMethod(
Invocation.method(#getAllEmail, [
accountId
], {
Invocation.method(
#getAllEmail,
[accountId],
{
#limit: limit,
#sort: sort,
#emailFilter: emailFilter,
#propertiesCreated: propertiesCreated,
#propertiesUpdated: propertiesUpdated
}),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
#propertiesUpdated: propertiesUpdated,
},
),
returnValue: Stream<_i5.EmailsResponse>.empty(),
) as _i4.Stream<_i5.EmailsResponse>);
@override
_i3.Stream<_i4.EmailsResponse> refreshChanges(
_i5.AccountId? accountId, _i10.State? currentState,
{Set<_i7.Comparator>? sort,
_i8.EmailFilter? emailFilter,
_i9.Properties? propertiesCreated,
_i9.Properties? propertiesUpdated}) =>
_i4.Stream<_i5.EmailsResponse> refreshChanges(
_i6.AccountId? accountId,
_i11.State? currentState, {
Set<_i8.Comparator>? sort,
_i9.EmailFilter? emailFilter,
_i10.Properties? propertiesCreated,
_i10.Properties? propertiesUpdated,
}) =>
(super.noSuchMethod(
Invocation.method(#refreshChanges, [
Invocation.method(
#refreshChanges,
[
accountId,
currentState
], {
currentState,
],
{
#sort: sort,
#emailFilter: emailFilter,
#propertiesCreated: propertiesCreated,
#propertiesUpdated: propertiesUpdated
}),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
#propertiesUpdated: propertiesUpdated,
},
),
returnValue: Stream<_i5.EmailsResponse>.empty(),
) as _i4.Stream<_i5.EmailsResponse>);
@override
_i3.Stream<_i4.EmailsResponse> loadMoreEmails(
_i11.GetEmailRequest? emailRequest) =>
(super.noSuchMethod(Invocation.method(#loadMoreEmails, [emailRequest]),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
@override
_i3.Future<List<_i12.Email>> searchEmails(_i5.AccountId? accountId,
{_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort,
_i13.Filter? filter,
_i9.Properties? properties}) =>
_i4.Stream<_i5.EmailsResponse> loadMoreEmails(
_i12.GetEmailRequest? emailRequest) =>
(super.noSuchMethod(
Invocation.method(#searchEmails, [
accountId
], {
Invocation.method(
#loadMoreEmails,
[emailRequest],
),
returnValue: Stream<_i5.EmailsResponse>.empty(),
) as _i4.Stream<_i5.EmailsResponse>);
@override
_i4.Future<List<_i13.Email>> searchEmails(
_i6.AccountId? accountId, {
_i7.UnsignedInt? limit,
Set<_i8.Comparator>? sort,
_i14.Filter? filter,
_i10.Properties? properties,
}) =>
(super.noSuchMethod(
Invocation.method(
#searchEmails,
[accountId],
{
#limit: limit,
#sort: sort,
#filter: filter,
#properties: properties
}),
returnValue: Future<List<_i12.Email>>.value(<_i12.Email>[]))
as _i3.Future<List<_i12.Email>>);
#properties: properties,
},
),
returnValue: Future<List<_i13.Email>>.value(<_i13.Email>[]),
) as _i4.Future<List<_i13.Email>>);
@override
_i3.Future<List<_i12.EmailId>> emptyTrashFolder(
_i5.AccountId? accountId, _i14.MailboxId? trashMailboxId) =>
_i4.Future<List<_i13.EmailId>> emptyTrashFolder(
_i6.AccountId? accountId,
_i15.MailboxId? trashMailboxId,
) =>
(super.noSuchMethod(
Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]),
returnValue: Future<List<_i12.EmailId>>.value(<_i12.EmailId>[]))
as _i3.Future<List<_i12.EmailId>>);
Invocation.method(
#emptyTrashFolder,
[
accountId,
trashMailboxId,
],
),
returnValue: Future<List<_i13.EmailId>>.value(<_i13.EmailId>[]),
) as _i4.Future<List<_i13.EmailId>>);
@override
_i4.Future<_i2.PresentationEmail> getEmailById(
_i6.AccountId? accountId,
_i13.EmailId? emailId, {
_i10.Properties? properties,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEmailById,
[
accountId,
emailId,
],
{#properties: properties},
),
returnValue:
Future<_i2.PresentationEmail>.value(_FakePresentationEmail_0()),
) as _i4.Future<_i2.PresentationEmail>);
}
@@ -3,25 +3,26 @@
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i3;
import 'dart:async' as _i4;
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i13;
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i9;
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart' as _i7;
import 'package:jmap_dart_client/jmap/core/state.dart' as _i10;
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i6;
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i12;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i14;
import 'package:jmap_dart_client/jmap/account_id.dart' as _i6;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i14;
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i10;
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart' as _i8;
import 'package:jmap_dart_client/jmap/core/state.dart' as _i11;
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i7;
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i13;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i15;
import 'package:mockito/mockito.dart' as _i1;
import 'package:model/email/presentation_email.dart' as _i2;
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'
as _i8;
as _i9;
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
as _i4;
as _i5;
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart'
as _i11;
as _i12;
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
as _i2;
as _i3;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
@@ -33,80 +34,127 @@ import 'package:tmail_ui_user/features/thread/domain/repository/thread_repositor
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
class _FakePresentationEmail_0 extends _i1.Fake
implements _i2.PresentationEmail {}
/// A class which mocks [ThreadRepository].
///
/// See the documentation for Mockito's code generation for more information.
class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
class MockThreadRepository extends _i1.Mock implements _i3.ThreadRepository {
MockThreadRepository() {
_i1.throwOnMissingStub(this);
}
@override
_i3.Stream<_i4.EmailsResponse> getAllEmail(_i5.AccountId? accountId,
{_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort,
_i8.EmailFilter? emailFilter,
_i9.Properties? propertiesCreated,
_i9.Properties? propertiesUpdated}) =>
_i4.Stream<_i5.EmailsResponse> getAllEmail(
_i6.AccountId? accountId, {
_i7.UnsignedInt? limit,
Set<_i8.Comparator>? sort,
_i9.EmailFilter? emailFilter,
_i10.Properties? propertiesCreated,
_i10.Properties? propertiesUpdated,
}) =>
(super.noSuchMethod(
Invocation.method(#getAllEmail, [
accountId
], {
Invocation.method(
#getAllEmail,
[accountId],
{
#limit: limit,
#sort: sort,
#emailFilter: emailFilter,
#propertiesCreated: propertiesCreated,
#propertiesUpdated: propertiesUpdated
}),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
#propertiesUpdated: propertiesUpdated,
},
),
returnValue: Stream<_i5.EmailsResponse>.empty(),
) as _i4.Stream<_i5.EmailsResponse>);
@override
_i3.Stream<_i4.EmailsResponse> refreshChanges(
_i5.AccountId? accountId, _i10.State? currentState,
{Set<_i7.Comparator>? sort,
_i8.EmailFilter? emailFilter,
_i9.Properties? propertiesCreated,
_i9.Properties? propertiesUpdated}) =>
_i4.Stream<_i5.EmailsResponse> refreshChanges(
_i6.AccountId? accountId,
_i11.State? currentState, {
Set<_i8.Comparator>? sort,
_i9.EmailFilter? emailFilter,
_i10.Properties? propertiesCreated,
_i10.Properties? propertiesUpdated,
}) =>
(super.noSuchMethod(
Invocation.method(#refreshChanges, [
Invocation.method(
#refreshChanges,
[
accountId,
currentState
], {
currentState,
],
{
#sort: sort,
#emailFilter: emailFilter,
#propertiesCreated: propertiesCreated,
#propertiesUpdated: propertiesUpdated
}),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
#propertiesUpdated: propertiesUpdated,
},
),
returnValue: Stream<_i5.EmailsResponse>.empty(),
) as _i4.Stream<_i5.EmailsResponse>);
@override
_i3.Stream<_i4.EmailsResponse> loadMoreEmails(
_i11.GetEmailRequest? emailRequest) =>
(super.noSuchMethod(Invocation.method(#loadMoreEmails, [emailRequest]),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
@override
_i3.Future<List<_i12.Email>> searchEmails(_i5.AccountId? accountId,
{_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort,
_i13.Filter? filter,
_i9.Properties? properties}) =>
_i4.Stream<_i5.EmailsResponse> loadMoreEmails(
_i12.GetEmailRequest? emailRequest) =>
(super.noSuchMethod(
Invocation.method(#searchEmails, [
accountId
], {
Invocation.method(
#loadMoreEmails,
[emailRequest],
),
returnValue: Stream<_i5.EmailsResponse>.empty(),
) as _i4.Stream<_i5.EmailsResponse>);
@override
_i4.Future<List<_i13.Email>> searchEmails(
_i6.AccountId? accountId, {
_i7.UnsignedInt? limit,
Set<_i8.Comparator>? sort,
_i14.Filter? filter,
_i10.Properties? properties,
}) =>
(super.noSuchMethod(
Invocation.method(
#searchEmails,
[accountId],
{
#limit: limit,
#sort: sort,
#filter: filter,
#properties: properties
}),
returnValue: Future<List<_i12.Email>>.value(<_i12.Email>[]))
as _i3.Future<List<_i12.Email>>);
#properties: properties,
},
),
returnValue: Future<List<_i13.Email>>.value(<_i13.Email>[]),
) as _i4.Future<List<_i13.Email>>);
@override
_i3.Future<List<_i12.EmailId>> emptyTrashFolder(
_i5.AccountId? accountId, _i14.MailboxId? trashMailboxId) =>
_i4.Future<List<_i13.EmailId>> emptyTrashFolder(
_i6.AccountId? accountId,
_i15.MailboxId? trashMailboxId,
) =>
(super.noSuchMethod(
Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]),
returnValue: Future<List<_i12.EmailId>>.value(<_i12.EmailId>[]))
as _i3.Future<List<_i12.EmailId>>);
Invocation.method(
#emptyTrashFolder,
[
accountId,
trashMailboxId,
],
),
returnValue: Future<List<_i13.EmailId>>.value(<_i13.EmailId>[]),
) as _i4.Future<List<_i13.EmailId>>);
@override
_i4.Future<_i2.PresentationEmail> getEmailById(
_i6.AccountId? accountId,
_i13.EmailId? emailId, {
_i10.Properties? properties,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEmailById,
[
accountId,
emailId,
],
{#properties: properties},
),
returnValue:
Future<_i2.PresentationEmail>.value(_FakePresentationEmail_0()),
) as _i4.Future<_i2.PresentationEmail>);
}