diff --git a/assets/images/ic_info_circle_outline.svg b/assets/images/ic_info_circle_outline.svg index a5805cd1a..120dea5c4 100644 --- a/assets/images/ic_info_circle_outline.svg +++ b/assets/images/ic_info_circle_outline.svg @@ -1,8 +1,3 @@ - - - - - diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 9a9ff6502..f7f3abe78 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -269,6 +269,8 @@ class MailboxController extends BaseMailboxController { refreshMailboxChanges(); } mailboxDashBoardController.clearMailboxUIAction(); + } else if (action is OpenSpamMailboxAction){ + openMailbox(action.context, action.presentationMailbox); } }); } diff --git a/lib/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart b/lib/features/mailbox_dashboard/data/datasource_impl/share_preference_spam_report_data_source_impl.dart similarity index 91% rename from lib/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart rename to lib/features/mailbox_dashboard/data/datasource_impl/share_preference_spam_report_data_source_impl.dart index 81a9f9b8d..04af11486 100644 --- a/lib/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart +++ b/lib/features/mailbox_dashboard/data/datasource_impl/share_preference_spam_report_data_source_impl.dart @@ -6,11 +6,11 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/share_prefer import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/unread_spam_emails_response.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; -class LocalSpamReportDataSourceImpl extends SpamReportDataSource { +class SharePreferenceSpamReportDataSourceImpl extends SpamReportDataSource { final SharePreferenceSpamReportDataSource _sharePreferenceSpamReportDataSource; final ExceptionThrower _exceptionThrower; - LocalSpamReportDataSourceImpl(this._sharePreferenceSpamReportDataSource, this._exceptionThrower); + SharePreferenceSpamReportDataSourceImpl(this._sharePreferenceSpamReportDataSource, this._exceptionThrower); @override Future getLastTimeDismissedSpamReported() async { return Future.sync(() async { 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 20707ba3f..35bf7f15d 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 @@ -27,7 +27,7 @@ class SpamReportDataSourceImpl extends SpamReportDataSource { } ) { return Future.sync(() async { - final _unreadSpamEmailsResponse = await _spamReportApi.findNumberOfUnreadSpamEmails( + final _unreadSpamEmailsResponse = await _spamReportApi.getUnreadSpamEmailbox( accountId, mailboxFilterCondition: mailboxFilterCondition, limit: limit); return _unreadSpamEmailsResponse; }).catchError((error) { 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 4d749551c..b187bc286 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 @@ -20,7 +20,7 @@ class SharePreferenceSpamReportDataSource extends SpamReportDataSource { @override Future storeLastTimeDismissedSpamReported(DateTime lastTimeDismissedSpamReported) async { - final _timeStamp = lastTimeDismissedSpamReported.microsecondsSinceEpoch; + final _timeStamp = lastTimeDismissedSpamReported.millisecondsSinceEpoch; return await _sharedPreferences.setInt(MailboxDashboardConstant.keyLastTimeDismissedSpamReported,_timeStamp); } diff --git a/lib/features/mailbox_dashboard/data/network/spam_report_api.dart b/lib/features/mailbox_dashboard/data/network/spam_report_api.dart index b9daa4ea8..ff536b83f 100644 --- a/lib/features/mailbox_dashboard/data/network/spam_report_api.dart +++ b/lib/features/mailbox_dashboard/data/network/spam_report_api.dart @@ -1,4 +1,3 @@ - import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/request/reference_path.dart'; @@ -12,10 +11,11 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/unread_spa class SpamReportApi { final HttpClient _httpClient; + static const int _deafaultLimit = 1; SpamReportApi(this._httpClient); - Future findNumberOfUnreadSpamEmails( + Future getUnreadSpamEmailbox( AccountId accountId, { MailboxFilterCondition? mailboxFilterCondition, @@ -24,11 +24,11 @@ class SpamReportApi { ) async { final processingInvocation = ProcessingInvocation(); final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation); + final spamReportQueryMethod = QueryMailboxMethod(accountId)..addLimit(limit ?? UnsignedInt(_deafaultLimit)); - final spamReportQueryMethod = QueryMailboxMethod(accountId)..addLimit(limit ?? UnsignedInt(1)); + if(mailboxFilterCondition != null) spamReportQueryMethod.addFilters(mailboxFilterCondition); final spamReportQueryMethodInvocation = requestBuilder.invocation(spamReportQueryMethod); - final getMailBoxMethod = GetMailboxMethod(accountId) ..addReferenceIds(processingInvocation.createResultReference( spamReportQueryMethodInvocation.methodCallId, @@ -42,11 +42,10 @@ class SpamReportApi { final _mailboxResponse = result .parse(getMailboxInvocation.methodCallId, GetMailboxResponse.deserialize); - - final _unreadSpamEmailNumber = _mailboxResponse?.list.first.unreadEmails?.value.value.toInt(); return Future.sync(() async { - return UnreadSpamEmailsResponse(unreadSpamEmailNumber: _unreadSpamEmailNumber); + final _unreadSpamMailbox = _mailboxResponse?.list.first; + return UnreadSpamEmailsResponse(unreadSpamMailbox: _unreadSpamMailbox); }).catchError((error) { throw error; }); 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 24ccb8c0c..0472115af 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 @@ -27,7 +27,7 @@ class SpamReportRepositoryImpl extends SpamReportRepository { } @override - Future findNumberOfUnreadSpamEmails( + Future getUnreadSpamMailbox( AccountId accountId, { MailboxFilterCondition? mailboxFilterCondition, @@ -35,6 +35,8 @@ class SpamReportRepositoryImpl extends SpamReportRepository { } ) { return mapDataSource[DataSourceType.network]!.findNumberOfUnreadSpamEmails( - accountId, mailboxFilterCondition: mailboxFilterCondition, limit: limit); + accountId, + mailboxFilterCondition: mailboxFilterCondition, + limit: limit); } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/model/unread_spam_emails_response.dart b/lib/features/mailbox_dashboard/domain/model/unread_spam_emails_response.dart index a96933643..9f51c9574 100644 --- a/lib/features/mailbox_dashboard/domain/model/unread_spam_emails_response.dart +++ b/lib/features/mailbox_dashboard/domain/model/unread_spam_emails_response.dart @@ -1,13 +1,14 @@ import 'package:equatable/equatable.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; class UnreadSpamEmailsResponse with EquatableMixin { - final int? unreadSpamEmailNumber; + final Mailbox? unreadSpamMailbox; UnreadSpamEmailsResponse({ - this.unreadSpamEmailNumber, + this.unreadSpamMailbox, }); @override - List get props => [unreadSpamEmailNumber]; + List get props => [unreadSpamMailbox]; } \ 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 76fd2f00e..aa84b6bc3 100644 --- a/lib/features/mailbox_dashboard/domain/repository/spam_report_repository.dart +++ b/lib/features/mailbox_dashboard/domain/repository/spam_report_repository.dart @@ -10,7 +10,7 @@ abstract class SpamReportRepository { Future deleteLastTimeDismissedSpamReported(); - Future findNumberOfUnreadSpamEmails( + Future getUnreadSpamMailbox( AccountId accountId, { MailboxFilterCondition? mailboxFilterCondition, diff --git a/lib/features/mailbox_dashboard/domain/state/get_number_of_unread_spam_emails_state.dart b/lib/features/mailbox_dashboard/domain/state/get_number_of_unread_spam_emails_state.dart index f575b9068..e5d3a19a1 100644 --- a/lib/features/mailbox_dashboard/domain/state/get_number_of_unread_spam_emails_state.dart +++ b/lib/features/mailbox_dashboard/domain/state/get_number_of_unread_spam_emails_state.dart @@ -1,15 +1,16 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; -class GetNumberOfUnreadSpamEmailsLoading extends UIState {} +class GetUnreadSpamMailboxLoading extends UIState {} -class GetNumberOfUnreadSpamEmailsSuccess extends UIState { - final int unreadSpamEmailNumber; +class GetUnreadSpamMailboxSuccess extends UIState { + final Mailbox unreadSpamMailbox; - GetNumberOfUnreadSpamEmailsSuccess(this.unreadSpamEmailNumber); + GetUnreadSpamMailboxSuccess(this.unreadSpamMailbox); @override - List get props => [unreadSpamEmailNumber]; + List get props => [unreadSpamMailbox]; } class InvalidSpamReportCondition extends FeatureFailure { @@ -17,10 +18,10 @@ class InvalidSpamReportCondition extends FeatureFailure { List get props => []; } -class GetNumberOfUnreadSpamEmailsFailure extends FeatureFailure { +class GetUnreadSpamMailboxFailure extends FeatureFailure { final dynamic exception; - GetNumberOfUnreadSpamEmailsFailure(this.exception); + GetUnreadSpamMailboxFailure(this.exception); @override List get props => [exception]; diff --git a/lib/features/mailbox_dashboard/domain/usecases/get_number_of_unread_spam_emails_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart similarity index 61% rename from lib/features/mailbox_dashboard/domain/usecases/get_number_of_unread_spam_emails_interactor.dart rename to lib/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart index b4e41b208..398af4e9f 100644 --- a/lib/features/mailbox_dashboard/domain/usecases/get_number_of_unread_spam_emails_interactor.dart +++ b/lib/features/mailbox_dashboard/domain/usecases/get_unread_spam_mailbox_interactor.dart @@ -8,11 +8,11 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox_filter_condition.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_number_of_unread_spam_emails_state.dart'; -class GetNumberOfUnreadSpamEmails { +class GetUnreadSpamMailboxInteractor { static const int conditionsForDisplayingSpamReportBanner = 4; final SpamReportRepository _spamReportRepository; - GetNumberOfUnreadSpamEmails(this._spamReportRepository); + GetUnreadSpamMailboxInteractor(this._spamReportRepository); Stream> execute( AccountId accountId, @@ -22,22 +22,22 @@ class GetNumberOfUnreadSpamEmails { } ) async* { try { - yield Right(GetNumberOfUnreadSpamEmailsLoading()); - + yield Right(GetUnreadSpamMailboxLoading()); final _lastTimeDissmissedSpamReported = await _spamReportRepository.getLastTimeDismissedSpamReported(); + final _timeLast = DateTime.now().difference(_lastTimeDissmissedSpamReported); - final _checkTimeCondition = (_lastTimeDissmissedSpamReported.hour - DateTime.now().hour) > conditionsForDisplayingSpamReportBanner; + final _checkTimeCondition = (_timeLast.inHours > 0) && (_timeLast.inHours > conditionsForDisplayingSpamReportBanner); if (_checkTimeCondition) { - final _response = await _spamReportRepository.findNumberOfUnreadSpamEmails(accountId, mailboxFilterCondition: mailboxFilterCondition, limit: limit); - final _unreadSpamEmailNumber = _response.unreadSpamEmailNumber ?? 0; + final _response = await _spamReportRepository.getUnreadSpamMailbox(accountId, mailboxFilterCondition: mailboxFilterCondition, limit: limit); + final _unreadSpamMailbox = _response.unreadSpamMailbox; - yield Right(GetNumberOfUnreadSpamEmailsSuccess(_unreadSpamEmailNumber)); + yield Right(GetUnreadSpamMailboxSuccess(_unreadSpamMailbox!)); } else { yield Left(InvalidSpamReportCondition()); } } catch (e) { - yield Left(GetNumberOfUnreadSpamEmailsFailure(e)); + yield Left(GetUnreadSpamMailboxFailure(e)); } } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart index 000d9017a..cdd62b45a 100644 --- a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart +++ b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart'; @@ -123,4 +124,14 @@ class SearchEmailByQueryAction extends DashBoardAction { @override List get props => [navigationRouter]; +} +class OpenSpamMailboxAction extends DashBoardAction { + + final BuildContext context; + final PresentationMailbox presentationMailbox; + + OpenSpamMailboxAction(this.context, this.presentationMailbox); + + @override + List get props => [context, presentationMailbox]; } \ No newline at end of file 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 08ccfd9f1..a2cec5d3c 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -58,10 +58,12 @@ import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.d import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/search_datasource.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/session_storage_composer_datasource.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/share_preference_spam_report_data_source_impl.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/session_storage_composer_datasoure_impl.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/spam_report_datasource_impl.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/network/spam_report_api.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/composer_cache_repository_impl.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/search_repository_impl.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/spam_report_repository_impl.dart'; @@ -71,11 +73,13 @@ 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_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'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart'; 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/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'; @@ -127,7 +131,11 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), )); - Get.put(SpamReportController()); + + Get.put(SpamReportController( + Get.find(), + Get.find(), + )); Get.put(MailboxDashBoardController( Get.find(), Get.find(), @@ -160,7 +168,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); - Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override @@ -199,7 +207,11 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), )); Get.lazyPut(() => SessionStorageComposerDatasourceImpl()); - Get.lazyPut(() => LocalSpamReportDataSourceImpl( + Get.lazyPut(() => SpamReportDataSourceImpl( + Get.find(), + Get.find(), + )); + Get.lazyPut(() => SharePreferenceSpamReportDataSourceImpl( Get.find(), Get.find(), )); @@ -271,6 +283,10 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => GetEmailByIdInteractor( Get.find())); Get.lazyPut(() => UpdateAuthenticationAccountInteractor(Get.find())); + Get.lazyPut(() => StoreSpamReportInteractor( + Get.find())); + Get.lazyPut(() => GetUnreadSpamMailboxInteractor( + Get.find())); } @override @@ -314,7 +330,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => SpamReportRepositoryImpl( { DataSourceType.network: Get.find(), - DataSourceType.local: Get.find() + DataSourceType.local: Get.find() }, )); } 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 d5bb3a201..a3df4473c 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -416,6 +416,7 @@ class MailboxDashBoardController extends ReloadableController { } else { dispatchRoute(DashboardRoutes.thread); } + spamReportController.getUnreadSpamMailboxAction(accountId.value!); } else { dispatchRoute(DashboardRoutes.thread); reload(); @@ -1520,6 +1521,10 @@ class MailboxDashBoardController extends ReloadableController { void updateEmailList(List newEmailList) { emailsInCurrentMailbox.value = newEmailList; } + + void openSpamMailboxAction(BuildContext context, PresentationMailbox presentationMailbox){ + dispatchAction(OpenSpamMailboxAction(context, presentationMailbox)); + } @override void onClose() { 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 2fa550314..54dd18ced 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart @@ -1,14 +1,64 @@ -import 'package:get/get_rx/get_rx.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +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/state/get_number_of_unread_spam_emails_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/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/presentation/controller/mailbox_dashboard_controller.dart'; class SpamReportController extends BaseController { + final StoreSpamReportInteractor _storeSpamReportInteractor; + final GetUnreadSpamMailboxInteractor _getNumberOfUnreadSpamEmailsInteractor; - final dismissedSpamReported = RxBool(false); + final _presentationSpamMailbox = Rxn(); + + SpamReportController(this._storeSpamReportInteractor, this._getNumberOfUnreadSpamEmailsInteractor); @override - void onDone() {} - + void onDone() { + viewState.value.fold( + (failure) { + logError('SpamReportController::onDone(): failure: $failure'); + }, + (success) { + if(success is GetUnreadSpamMailboxSuccess){ + _presentationSpamMailbox.value = success.unreadSpamMailbox.toPresentationMailbox(); + log('SpamReportController::GetNumberOfUnreadSpamEmailsSuccess():success $success'); + } else if(success is StoreLastTimeDismissedSpamReportSuccess){ + _presentationSpamMailbox.value = null; + log('SpamReportController::StoreLastTimeDismissedSpamReportSuccess():success $success'); + } + }, + ); + } + void dismissSpamReportAction() { - dismissedSpamReported.value = true; + _storeLastTimeDismissedSpamReportedAction(); + } + + void getUnreadSpamMailboxAction(AccountId accountId){ + final _mailboxFilterCondition = MailboxFilterCondition(role: Role('Spam')); + consumeState(_getNumberOfUnreadSpamEmailsInteractor.execute(accountId,mailboxFilterCondition: _mailboxFilterCondition)); + } + + void _storeLastTimeDismissedSpamReportedAction() { + consumeState(_storeSpamReportInteractor.execute(DateTime.now())); + } + + bool get notShowSpamReportBanner => _presentationSpamMailbox.value == null; + + int get numberOfUnreadSpamEmails => (_presentationSpamMailbox.value?.unreadEmails?.value.value ?? 0).toInt(); + + void openMailbox(BuildContext context) { + final _mailboxDashBoardController = Get.find(); + dismissSpamReportAction(); + _mailboxDashBoardController.openSpamMailboxAction(context, _presentationSpamMailbox.value!); } } diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 37a80773f..fee76777b 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/ad import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/download/download_task_item_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/top_bar_thread_selection.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; @@ -42,7 +43,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { final SearchController searchController = Get.find(); final AppGridDashboardController appGridDashboardController = Get.find(); final mailBoxDashboardController = Get.find(); - final spamReportController = Get.find(); + final SpamReportController spamReportController = Get.find(); @override Widget build(BuildContext context) { @@ -107,7 +108,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { children: [ SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeMenu), Expanded(child: Column(children: [ - _buildSpamReportBoxWebWidget(context), + const SpamReportBannerWebWidget(), _buildEmptyTrashButton(context), const QuotasWarningBannerWidget( margin: EdgeInsets.only(right: 16, top: 8), @@ -695,76 +696,4 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { } }); } - - Widget _buildSpamReportBoxWebWidget(BuildContext context) { - return Obx(() { - if (spamReportController.dismissedSpamReported.value) { - return const SizedBox( - height: 8, - ); - } - return Container( - height: 84, - margin: const EdgeInsets.only(right: 16, top: 16), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), - color: AppColor.colorSpamReportBox.withOpacity(0.12)), - child: Stack( - alignment: AlignmentDirectional.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: [ - SvgPicture.asset( - imagePaths.icInfoCircleOutline, - width: 28, - height: 28, - color: AppColor.primaryColor, - ), - const SizedBox( - width: 8, - ), - Text( - AppLocalizations.of(context).countNewSpamEmails(5), - style: const TextStyle( - fontSize: 16, - color: AppColor.primaryColor, - fontWeight: FontWeight.w500), - ), - ], - ), - Padding( - padding: const EdgeInsets.only( - left: 32, - ), - child: buildTextButton( - AppLocalizations.of(context).showDetails, - height: 36, - width: 115, - textStyle: const TextStyle( - fontSize: 15, - color: AppColor.primaryColor, - fontWeight: FontWeight.w400), - backgroundColor: AppColor.colorCreateNewIdentityButton, - radius: 10, - ), - ), - ], - ), - Positioned( - top: 16, - right: 16, - child: buildSVGIconButton( - icon: imagePaths.icCloseComposer, - onTap: () => spamReportController.dismissSpamReportAction(), - ), - ), - ], - ), - ); - }); - } } \ No newline at end of file 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 new file mode 100644 index 000000000..7845a4e67 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart @@ -0,0 +1,87 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/views/button/icon_button_web.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class SpamReportBannerWebWidget extends StatelessWidget { + const SpamReportBannerWebWidget({ Key? key }) : super(key: key); + + @override + Widget build(BuildContext context){ + final _spamReportController = Get.find(); + final _imagePaths = Get.find(); + return Obx(() { + if (_spamReportController.notShowSpamReportBanner) { + return const SizedBox( + height: 8, + ); + } + return Container( + height: 84, + margin: const EdgeInsets.only(right: 16, top: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), + color: AppColor.colorSpamReportBox.withOpacity(0.12)), + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + SvgPicture.asset( + _imagePaths.icInfoCircleOutline, + width: 28, + height: 28, + color: AppColor.primaryColor, + ), + const SizedBox(width: 8), + Text( + AppLocalizations.of(context).countNewSpamEmails( + _spamReportController.numberOfUnreadSpamEmails), + style: const TextStyle( + fontSize: 16, + color: AppColor.primaryColor, + fontWeight: FontWeight.w500), + ), + ], + ), + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: buildTextButton( + AppLocalizations.of(context).showDetails, + height: 36, + width: 115, + textStyle: const TextStyle( + fontSize: 15, + color: AppColor.primaryColor, + fontWeight: FontWeight.w400), + backgroundColor: AppColor.colorCreateNewIdentityButton, + radius: 10, + onTap: () => _spamReportController.openMailbox(context), + ), + ), + ], + ), + Positioned( + top: 16, + right: 16, + child: buildSVGIconButton( + icon: _imagePaths.icCloseComposer, + onTap: () => _spamReportController.dismissSpamReportAction(), + ), + ), + ], + ), + ); + }); + } +} \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 409b3f4c5..f91b7a1ec 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -34,7 +34,6 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read 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/search_controller.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart'; import 'package:tmail_ui_user/features/search/presentation/search_email_bindings.dart'; @@ -118,10 +117,6 @@ class ThreadController extends BaseController with EmailActionController { SearchQuery? get searchQuery => searchController.searchEmailFilter.value.text; - RxList get emailList => mailboxDashBoardController.emailsInCurrentMailbox; - - SpamReportController get spamReportController => mailboxDashBoardController.spamReportController; - ThreadController( this._getEmailsInMailboxInteractor, this._refreshChangesEmailsInMailboxInteractor, diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index ca5fe5ca6..9cfc450c5 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -24,6 +24,7 @@ import 'package:tmail_ui_user/features/thread/presentation/widgets/bottom_bar_th import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart' if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/filter_message_cupertino_action_sheet_action_builder.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/spam_report_banner_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -61,7 +62,7 @@ class ThreadView extends GetWidget ... [ _buildAppBarNormal(context), _buildSearchBarView(context), - _buildSpamReportBoxWidget(context), + const SpamReportBannerWidget(), const QuotasWarningBannerWidget(), _buildVacationNotificationMessage(context), ], @@ -655,101 +656,4 @@ class ThreadView extends GetWidget }); }); } - - Widget _buildSpamReportBoxWidget(BuildContext context) { - return Obx(() { - if (controller.spamReportController.dismissedSpamReported.value) { - return const SizedBox.shrink(); - } - return Container( - height: 124, - margin: const EdgeInsets.only(right: 16, top: 16, left: 16), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), - color: AppColor.colorSpamReportBox.withOpacity(0.12)), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.only(top: 24), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - _imagePaths.icInfoCircleOutline, - width: 28, - height: 28, - color: AppColor.primaryColor, - ), - const SizedBox( - width: 8, - ), - Text( - AppLocalizations.of(context).countNewSpamEmails(5), - style: const TextStyle( - fontSize: 16, - color: AppColor.primaryColor, - fontWeight: FontWeight.w500), - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), - child: Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: _spamReportButtonAction( - context, - AppLocalizations.of(context).showDetails, - AppColor.primaryColor, - () {}), - ), - const SizedBox( - width: 8, - ), - Expanded( - child: _spamReportButtonAction( - context, - AppLocalizations.of(context).dismiss, - AppColor.textFieldErrorBorderColor, - () => controller.spamReportController - .dismissSpamReportAction()), - ), - ], - ), - ), - ), - ], - ), - ); - }); - } - - Widget _spamReportButtonAction(BuildContext context, String title, Color colorText, Function()? onTap) { - return GestureDetector( - onTap: onTap, - child: Container( - height: 36, - width: double.infinity, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: AppColor.colorCreateNewIdentityButton), - child: Expanded( - child: Center( - child: Text( - title, - style: TextStyle( - fontSize: 15, - color: colorText, - fontWeight: FontWeight.w400), - ), - ), - ), - ), - ); - } } \ No newline at end of file diff --git a/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart b/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart new file mode 100644 index 000000000..292e2c4a0 --- /dev/null +++ b/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart @@ -0,0 +1,109 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class SpamReportBannerWidget extends StatelessWidget { + const SpamReportBannerWidget({ Key? key }) : super(key: key); + + @override + Widget build(BuildContext context){ + final _spamReportController = Get.find(); + final _imagePaths = Get.find(); + + return Obx(() { + if (_spamReportController.notShowSpamReportBanner) { + return const SizedBox.shrink(); + } + return Container( + height: 124, + margin: const EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), + color: AppColor.colorSpamReportBox.withOpacity(0.12)), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only(top: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + _imagePaths.icInfoCircleOutline, + width: 28, + height: 28, + color: AppColor.primaryColor, + ), + const SizedBox( + width: 8, + ), + Text( + AppLocalizations.of(context).countNewSpamEmails(5), + style: const TextStyle( + fontSize: 16, + color: AppColor.primaryColor, + fontWeight: FontWeight.w500), + ), + ], + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: _spamReportButtonAction( + context, + AppLocalizations.of(context).showDetails, + AppColor.primaryColor, + () => _spamReportController.openMailbox(context)), + ), + const SizedBox( + width: 8, + ), + Expanded( + child: _spamReportButtonAction( + context, + AppLocalizations.of(context).dismiss, + AppColor.textFieldErrorBorderColor, + () => _spamReportController + .dismissSpamReportAction()), + ), + ], + ), + ), + ), + ], + ), + ); + }); + } + + Widget _spamReportButtonAction(BuildContext context, String title, Color colorText, Function()? onTap) { + return GestureDetector( + onTap: onTap, + child: Container( + height: 36, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppColor.colorCreateNewIdentityButton), + child: Center( + child: Text( + title, + style: TextStyle( + fontSize: 15, color: colorText, fontWeight: FontWeight.w400), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index 853939ee9..91cfcaed1 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/login/data/local/encryption_key_cache_man import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/push_notification/data/local/fcm_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; @@ -68,6 +69,7 @@ class LocalBindings extends Bindings { Get.find(), Get.find(), )); + Get.put(SharePreferenceSpamReportDataSource(Get.find())); } void _bindingException() { diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index edbad5029..6d4576a97 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -17,6 +17,7 @@ import 'package:tmail_ui_user/features/login/data/network/config/authorization_i import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; import 'package:tmail_ui_user/features/login/data/utils/library_platform/app_auth_plugin/app_auth_plugin.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/network/spam_report_api.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/forwarding_api.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/identity_api.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/rule_filter_api.dart'; @@ -90,6 +91,7 @@ class NetworkBindings extends Bindings { Get.put(ForwardingAPI(Get.find())); Get.put(QuotasAPI(Get.find())); Get.put(FcmApi(Get.find())); + Get.put(SpamReportApi(Get.find())); } void _bindingConnection() {