diff --git a/assets/images/ic_spam_report_disable.svg b/assets/images/ic_spam_report_disable.svg new file mode 100644 index 000000000..43638788e --- /dev/null +++ b/assets/images/ic_spam_report_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/ic_spam_report_enable.svg b/assets/images/ic_spam_report_enable.svg new file mode 100644 index 000000000..8ccdad2ee --- /dev/null +++ b/assets/images/ic_spam_report_enable.svg @@ -0,0 +1,3 @@ + + + diff --git a/configurations/env.fcm b/configurations/env.fcm index 847e2b365..341f7206d 100644 --- a/configurations/env.fcm +++ b/configurations/env.fcm @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index 51ef0576c..b07ec2046 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -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; diff --git a/env.file b/env.file index bed9b10e3..6c44a3be4 100644 --- a/env.file +++ b/env.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 diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index f7f3abe78..45b4dfbe2 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -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; } diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 19f5c180c..9676df84c 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -408,6 +408,11 @@ class MailboxView extends GetWidget 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 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)), ), diff --git a/lib/features/mailbox/presentation/model/mailbox_actions.dart b/lib/features/mailbox/presentation/model/mailbox_actions.dart index 3b33869ab..9d15554f2 100644 --- a/lib/features/mailbox/presentation/model/mailbox_actions.dart +++ b/lib/features/mailbox/presentation/model/mailbox_actions.dart @@ -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,7 +138,9 @@ extension MailboxActionsExtension on MailboxActions { ContextMenuItemState getContextMenuItemState(PresentationMailbox mailbox) { switch(this) { case MailboxActions.openInNewTab: - return ContextMenuItemState.activated; + case MailboxActions.disableSpamReport: + case MailboxActions.enableSpamReport: + return ContextMenuItemState.activated; case MailboxActions.markAsRead: return mailbox.getCountUnReadEmails().isNotEmpty ? ContextMenuItemState.activated diff --git a/lib/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart b/lib/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart index 36505981e..1319a4022 100644 --- a/lib/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart +++ b/lib/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart @@ -23,5 +23,5 @@ abstract class SpamReportDataSource { Future storeSpamReportState(SpamReportState spamReportState); - Future deletestoreSpamReportState(); + Future deleteSpamReportState(); } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/data/datasource_impl/share_preference_spam_report_data_source_impl.dart b/lib/features/mailbox_dashboard/data/datasource_impl/share_preference_spam_report_data_source_impl.dart index 9d36f13e5..24f839d43 100644 --- a/lib/features/mailbox_dashboard/data/datasource_impl/share_preference_spam_report_data_source_impl.dart +++ b/lib/features/mailbox_dashboard/data/datasource_impl/share_preference_spam_report_data_source_impl.dart @@ -51,7 +51,7 @@ class SharePreferenceSpamReportDataSourceImpl extends SpamReportDataSource { } @override - Future deletestoreSpamReportState() { + Future deleteSpamReportState() { return Future.sync(() async { return await _sharePreferenceSpamReportDataSource.deleteLastTimeDismissedSpamReported(); }).catchError((error) { diff --git a/lib/features/mailbox_dashboard/data/datasource_impl/spam_report_datasource_impl.dart b/lib/features/mailbox_dashboard/data/datasource_impl/spam_report_datasource_impl.dart index 9f00ce1f2..545cf5266 100644 --- a/lib/features/mailbox_dashboard/data/datasource_impl/spam_report_datasource_impl.dart +++ b/lib/features/mailbox_dashboard/data/datasource_impl/spam_report_datasource_impl.dart @@ -47,7 +47,7 @@ class SpamReportDataSourceImpl extends SpamReportDataSource { } @override - Future deletestoreSpamReportState() { + Future deleteSpamReportState() { throw UnimplementedError(); } diff --git a/lib/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart b/lib/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart index 7b8c8a282..9f80ce4a5 100644 --- a/lib/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart +++ b/lib/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart @@ -42,7 +42,7 @@ class SharePreferenceSpamReportDataSource extends SpamReportDataSource { } @override - Future deletestoreSpamReportState() async { + Future deleteSpamReportState() async { return await _sharedPreferences.remove(MailboxDashboardConstant.keySpamReportState); } diff --git a/lib/features/mailbox_dashboard/data/repository/spam_report_repository_impl.dart b/lib/features/mailbox_dashboard/data/repository/spam_report_repository_impl.dart index a7756c487..e62408ac4 100644 --- a/lib/features/mailbox_dashboard/data/repository/spam_report_repository_impl.dart +++ b/lib/features/mailbox_dashboard/data/repository/spam_report_repository_impl.dart @@ -52,7 +52,7 @@ class SpamReportRepositoryImpl extends SpamReportRepository { } @override - Future deletestoreSpamReportState() { - return mapDataSource[DataSourceType.local]!.deletestoreSpamReportState(); + Future deleteSpamReportState() { + return mapDataSource[DataSourceType.local]!.deleteSpamReportState(); } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/repository/spam_report_repository.dart b/lib/features/mailbox_dashboard/domain/repository/spam_report_repository.dart index f9cec94d3..f814a0fa0 100644 --- a/lib/features/mailbox_dashboard/domain/repository/spam_report_repository.dart +++ b/lib/features/mailbox_dashboard/domain/repository/spam_report_repository.dart @@ -23,5 +23,5 @@ abstract class SpamReportRepository { Future storeSpamReportState(SpamReportState spamReportState); - Future deletestoreSpamReportState(); + Future deleteSpamReportState(); } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/state/store_spam_report_state.dart b/lib/features/mailbox_dashboard/domain/state/store_spam_report_state.dart index 5a2bb2390..318082d88 100644 --- a/lib/features/mailbox_dashboard/domain/state/store_spam_report_state.dart +++ b/lib/features/mailbox_dashboard/domain/state/store_spam_report_state.dart @@ -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 { - - StoreSpamReportStateSuccess(); + final SpamReportState spamReportState; + + StoreSpamReportStateSuccess(this.spamReportState); @override List get props => []; 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 1f9f74703..7844845b0 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.deletestoreSpamReportState(); + await _spamReportRepository.deleteSpamReportState(); yield Right(DeleteSpamReportStateSuccess()); } catch (e) { yield Left(DeleteSpamReportStateFailure(e)); diff --git a/lib/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart index af4a2c714..6fc7aa7f1 100644 --- a/lib/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart +++ b/lib/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart @@ -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> execute() async* { try { diff --git a/lib/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart index 398af4e9f..a978c6cb7 100644 --- a/lib/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart +++ b/lib/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart @@ -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; diff --git a/lib/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart index 56cfbca37..209872d52 100644 --- a/lib/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart +++ b/lib/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart @@ -15,7 +15,7 @@ class StoreSpamReportStateInteractor { try { yield Right(StoreSpamReportStateLoading()); await _spamReportRepository.storeSpamReportState(spamReportState); - yield Right(StoreSpamReportStateSuccess()); + yield Right(StoreSpamReportStateSuccess(spamReportState)); } catch (e) { yield Left(StoreSpamReportStateFailure(e)); } diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index a2cec5d3c..661d22607 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -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(), Get.find(), + Get.find(), + Get.find() )); Get.put(MailboxDashBoardController( Get.find(), @@ -287,6 +291,10 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find())); Get.lazyPut(() => GetUnreadSpamMailboxInteractor( Get.find())); + Get.lazyPut(() => StoreSpamReportStateInteractor( + Get.find())); + Get.lazyPut(() => GetSpamReportStateInteractor( + Get.find())); } @override 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 a3df4473c..9333337ab 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -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(); diff --git a/lib/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart index 54dd18ced..01fc3e0b9 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart @@ -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(); + final _spamReportState = Rxn(SpamReportState.enabled); - SpamReportController(this._storeSpamReportInteractor, this._getNumberOfUnreadSpamEmailsInteractor); + SpamReportController( + this._storeSpamReportInteractor, + this._getNumberOfUnreadSpamEmailsInteractor, + this._storeSpamReportStateInteractor, + this._getSpamReportStateInteractor); @override void onDone() { @@ -31,9 +43,15 @@ class SpamReportController extends BaseController { if(success is GetUnreadSpamMailboxSuccess){ _presentationSpamMailbox.value = success.unreadSpamMailbox.toPresentationMailbox(); log('SpamReportController::GetNumberOfUnreadSpamEmailsSuccess():success $success'); - } else if(success is StoreLastTimeDismissedSpamReportSuccess){ + } 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'); } }, ); @@ -43,8 +61,9 @@ class SpamReportController extends BaseController { _storeLastTimeDismissedSpamReportedAction(); } - void getUnreadSpamMailboxAction(AccountId accountId){ + 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(); dismissSpamReportAction(); _mailboxDashBoardController.openSpamMailboxAction(context, _presentationSpamMailbox.value!); } + + void storeSpamReportStateAction(SpamReportState spamReportState) { + consumeState(_storeSpamReportStateInteractor.execute(spamReportState)); + } + + void getSpamReportStateAction() { + consumeState(_getSpamReportStateInteractor.execute()); + } } diff --git a/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart index 7845a4e67..1b0faea2d 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart @@ -15,7 +15,7 @@ class SpamReportBannerWebWidget extends StatelessWidget { final _spamReportController = Get.find(); final _imagePaths = Get.find(); return Obx(() { - if (_spamReportController.notShowSpamReportBanner) { + if (!_spamReportController.enableSpamReport || _spamReportController.notShowSpamReportBanner) { return const SizedBox( height: 8, ); 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 292e2c4a0..16dadee5f 100644 --- a/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart +++ b/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart @@ -15,7 +15,7 @@ class SpamReportBannerWidget extends StatelessWidget { final _imagePaths = Get.find(); return Obx(() { - if (_spamReportController.notShowSpamReportBanner) { + if (!_spamReportController.enableSpamReport || _spamReportController.notShowSpamReportBanner) { return const SizedBox.shrink(); } return Container( diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 6a0160bf7..7ed6f3713 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -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', + ); + } } \ No newline at end of file diff --git a/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart b/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart index 3aa58ed33..a11c90529 100644 --- a/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart +++ b/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart @@ -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 - ], { - #limit: limit, - #sort: sort, - #emailFilter: emailFilter, - #propertiesCreated: propertiesCreated, - #propertiesUpdated: propertiesUpdated - }), - returnValue: Stream<_i4.EmailsResponse>.empty()) - as _i3.Stream<_i4.EmailsResponse>); + Invocation.method( + #getAllEmail, + [accountId], + { + #limit: limit, + #sort: sort, + #emailFilter: emailFilter, + #propertiesCreated: propertiesCreated, + #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, [ - accountId, - currentState - ], { - #sort: sort, - #emailFilter: emailFilter, - #propertiesCreated: propertiesCreated, - #propertiesUpdated: propertiesUpdated - }), - returnValue: Stream<_i4.EmailsResponse>.empty()) - as _i3.Stream<_i4.EmailsResponse>); + Invocation.method( + #refreshChanges, + [ + accountId, + currentState, + ], + { + #sort: sort, + #emailFilter: emailFilter, + #propertiesCreated: propertiesCreated, + #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> 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 - ], { - #limit: limit, - #sort: sort, - #filter: filter, - #properties: properties - }), - returnValue: Future>.value(<_i12.Email>[])) - as _i3.Future>); + Invocation.method( + #loadMoreEmails, + [emailRequest], + ), + returnValue: Stream<_i5.EmailsResponse>.empty(), + ) as _i4.Stream<_i5.EmailsResponse>); @override - _i3.Future> emptyTrashFolder( - _i5.AccountId? accountId, _i14.MailboxId? trashMailboxId) => + _i4.Future> searchEmails( + _i6.AccountId? accountId, { + _i7.UnsignedInt? limit, + Set<_i8.Comparator>? sort, + _i14.Filter? filter, + _i10.Properties? properties, + }) => (super.noSuchMethod( - Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]), - returnValue: Future>.value(<_i12.EmailId>[])) - as _i3.Future>); -} \ No newline at end of file + Invocation.method( + #searchEmails, + [accountId], + { + #limit: limit, + #sort: sort, + #filter: filter, + #properties: properties, + }, + ), + returnValue: Future>.value(<_i13.Email>[]), + ) as _i4.Future>); + @override + _i4.Future> emptyTrashFolder( + _i6.AccountId? accountId, + _i15.MailboxId? trashMailboxId, + ) => + (super.noSuchMethod( + Invocation.method( + #emptyTrashFolder, + [ + accountId, + trashMailboxId, + ], + ), + returnValue: Future>.value(<_i13.EmailId>[]), + ) as _i4.Future>); + @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>); +} diff --git a/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart b/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart index d55f1162c..5753dd7d0 100644 --- a/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart +++ b/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart @@ -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 - ], { - #limit: limit, - #sort: sort, - #emailFilter: emailFilter, - #propertiesCreated: propertiesCreated, - #propertiesUpdated: propertiesUpdated - }), - returnValue: Stream<_i4.EmailsResponse>.empty()) - as _i3.Stream<_i4.EmailsResponse>); + Invocation.method( + #getAllEmail, + [accountId], + { + #limit: limit, + #sort: sort, + #emailFilter: emailFilter, + #propertiesCreated: propertiesCreated, + #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, [ - accountId, - currentState - ], { - #sort: sort, - #emailFilter: emailFilter, - #propertiesCreated: propertiesCreated, - #propertiesUpdated: propertiesUpdated - }), - returnValue: Stream<_i4.EmailsResponse>.empty()) - as _i3.Stream<_i4.EmailsResponse>); + Invocation.method( + #refreshChanges, + [ + accountId, + currentState, + ], + { + #sort: sort, + #emailFilter: emailFilter, + #propertiesCreated: propertiesCreated, + #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> 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 - ], { - #limit: limit, - #sort: sort, - #filter: filter, - #properties: properties - }), - returnValue: Future>.value(<_i12.Email>[])) - as _i3.Future>); + Invocation.method( + #loadMoreEmails, + [emailRequest], + ), + returnValue: Stream<_i5.EmailsResponse>.empty(), + ) as _i4.Stream<_i5.EmailsResponse>); @override - _i3.Future> emptyTrashFolder( - _i5.AccountId? accountId, _i14.MailboxId? trashMailboxId) => + _i4.Future> searchEmails( + _i6.AccountId? accountId, { + _i7.UnsignedInt? limit, + Set<_i8.Comparator>? sort, + _i14.Filter? filter, + _i10.Properties? properties, + }) => (super.noSuchMethod( - Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]), - returnValue: Future>.value(<_i12.EmailId>[])) - as _i3.Future>); -} \ No newline at end of file + Invocation.method( + #searchEmails, + [accountId], + { + #limit: limit, + #sort: sort, + #filter: filter, + #properties: properties, + }, + ), + returnValue: Future>.value(<_i13.Email>[]), + ) as _i4.Future>); + @override + _i4.Future> emptyTrashFolder( + _i6.AccountId? accountId, + _i15.MailboxId? trashMailboxId, + ) => + (super.noSuchMethod( + Invocation.method( + #emptyTrashFolder, + [ + accountId, + trashMailboxId, + ], + ), + returnValue: Future>.value(<_i13.EmailId>[]), + ) as _i4.Future>); + @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>); +}