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/lib/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart b/lib/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart new file mode 100644 index 000000000..27c4274fb --- /dev/null +++ b/lib/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart @@ -0,0 +1,7 @@ +abstract class SpamReportDataSource { + Future storeLastTimeDismissedSpamReported(DateTime lastTimeDismissedSpamReported); + + Future getLastTimeDismissedSpamReported(); + + Future deleteLastTimeDismissedSpamReported(); +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart b/lib/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart new file mode 100644 index 000000000..4383c7df1 --- /dev/null +++ b/lib/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart @@ -0,0 +1,36 @@ +import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/spam_report_cache_manager.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; + +class LocalSpamReportDataSourceImpl extends SpamReportDataSource { + final SpamReportCacheManager _spamReportCacheManager; + final ExceptionThrower _exceptionThrower; + + LocalSpamReportDataSourceImpl(this._spamReportCacheManager, this._exceptionThrower); + @override + Future getLastTimeDismissedSpamReported() async { + return Future.sync(() async { + return await _spamReportCacheManager.getlastTimeDismissedSpamReported(); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } + + @override + Future storeLastTimeDismissedSpamReported(DateTime lastTimeDismissedSpamReported) async { + return Future.sync(() async { + return await _spamReportCacheManager.storelastTimeDismissedSpamReported(lastTimeDismissedSpamReported); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } + + @override + Future deleteLastTimeDismissedSpamReported() { + return Future.sync(() async { + return await _spamReportCacheManager.deleteLastTimeDismissedSpamReported(); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } +} diff --git a/lib/features/mailbox_dashboard/data/local/spam_report_cache_manager.dart b/lib/features/mailbox_dashboard/data/local/spam_report_cache_manager.dart new file mode 100644 index 000000000..4fdc4af63 --- /dev/null +++ b/lib/features/mailbox_dashboard/data/local/spam_report_cache_manager.dart @@ -0,0 +1,23 @@ +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/utils/mailbox_dashboard_constant.dart'; + +class SpamReportCacheManager { + final SharedPreferences _sharedPreferences; + + SpamReportCacheManager(this._sharedPreferences); + + Future getlastTimeDismissedSpamReported() async { + final _timeStamp = _sharedPreferences.getInt(MailboxDashboardConstant.keyLastTimeDismissedSpamReported) ?? 0; + final _lastTimeDismissedSpamReported = DateTime.fromMillisecondsSinceEpoch(_timeStamp); + return _lastTimeDismissedSpamReported; + } + + Future storelastTimeDismissedSpamReported(DateTime lastTimeDismissedSpamReported) async { + final _timeStamp = lastTimeDismissedSpamReported.microsecondsSinceEpoch; + return await _sharedPreferences.setInt(MailboxDashboardConstant.keyLastTimeDismissedSpamReported,_timeStamp); + } + + Future deleteLastTimeDismissedSpamReported() async { + return await _sharedPreferences.remove(MailboxDashboardConstant.keyLastTimeDismissedSpamReported); + } +} \ No newline at end of file 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 new file mode 100644 index 000000000..b81fab46c --- /dev/null +++ b/lib/features/mailbox_dashboard/data/repository/spam_report_repository_impl.dart @@ -0,0 +1,24 @@ +import 'package:core/data/model/source_type/data_source_type.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/spam_report_datasource.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/spam_report_repository.dart'; + +class SpamReportRepositoryImpl extends SpamReportRepository { + final Map mapDataSource; + + SpamReportRepositoryImpl(this.mapDataSource); + + @override + Future getLastTimeDismissedSpamReported() async { + return await mapDataSource[DataSourceType.local]!.getLastTimeDismissedSpamReported(); + } + + @override + Future storeLastTimeDismissedSpamReported(DateTime lastTimeDismissedSpamReported) { + return mapDataSource[DataSourceType.local]!.storeLastTimeDismissedSpamReported(lastTimeDismissedSpamReported); + } + + @override + Future deleteLastTimeDismissedSpamReported() { + return mapDataSource[DataSourceType.local]!.deleteLastTimeDismissedSpamReported(); + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/exceptions/spam_report_exception.dart b/lib/features/mailbox_dashboard/domain/exceptions/spam_report_exception.dart new file mode 100644 index 000000000..344665221 --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/exceptions/spam_report_exception.dart @@ -0,0 +1,2 @@ + +class NotFoundLastTimeDismissedSpamReportException implements Exception {} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/model/spam_report.dart b/lib/features/mailbox_dashboard/domain/model/spam_report.dart new file mode 100644 index 000000000..a029700cd --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/model/spam_report.dart @@ -0,0 +1,11 @@ +import 'package:equatable/equatable.dart'; + +class SpamReport with EquatableMixin { + + final DateTime lastTimeDismissedSpamReported; + + SpamReport(this.lastTimeDismissedSpamReported); + + @override + List get props => [lastTimeDismissedSpamReported]; +} \ 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 new file mode 100644 index 000000000..6a735d4fb --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/repository/spam_report_repository.dart @@ -0,0 +1,7 @@ +abstract class SpamReportRepository { + Future storeLastTimeDismissedSpamReported(DateTime lastTimeDismissedSpamReported); + + Future getLastTimeDismissedSpamReported(); + + Future deleteLastTimeDismissedSpamReported(); +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/state/get_last_time_dismissed_spam_reported_state.dart b/lib/features/mailbox_dashboard/domain/state/get_last_time_dismissed_spam_reported_state.dart new file mode 100644 index 000000000..3f73d874e --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/state/get_last_time_dismissed_spam_reported_state.dart @@ -0,0 +1,22 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class GetLastTimeDismissedSpamReportedLoading extends UIState {} + +class GetLastTimeDismissedSpamReportedSuccess extends UIState { + final DateTime lastTimeDismissedSpamReported; + + GetLastTimeDismissedSpamReportedSuccess(this.lastTimeDismissedSpamReported); + + @override + List get props => []; +} + +class GetLastTimeDismissedSpamReportedFailure extends FeatureFailure { + final dynamic exception; + + GetLastTimeDismissedSpamReportedFailure(this.exception); + + @override + List get props => [exception]; +} \ 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 new file mode 100644 index 000000000..b5841631f --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/state/store_spam_report_state.dart @@ -0,0 +1,21 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class StoreSpamReportLoading extends UIState {} + +class StoreSpamReportSuccess extends UIState { + + StoreSpamReportSuccess(); + + @override + List get props => []; +} + +class StoreSpamReportFailure extends FeatureFailure { + final dynamic exception; + + StoreSpamReportFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/usecases/get_spam_report_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/get_spam_report_interactor.dart new file mode 100644 index 000000000..9773dd350 --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/usecases/get_spam_report_interactor.dart @@ -0,0 +1,22 @@ +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_last_time_dismissed_spam_reported_state.dart'; + +class GetSpamReportInteractor { + final SpamReportRepository _spamReportRepository; + + GetSpamReportInteractor(this._spamReportRepository); + + Stream> execute() async* { + try { + yield Right(GetLastTimeDismissedSpamReportedLoading()); + final _lastTimeDismissedSpamReported = await _spamReportRepository.getLastTimeDismissedSpamReported(); + yield Right(GetLastTimeDismissedSpamReportedSuccess(_lastTimeDismissedSpamReported)); + } catch (e) { + yield Left(GetLastTimeDismissedSpamReportedFailure(e)); + } + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/usecases/store_spam_report_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/store_spam_report_interactor.dart new file mode 100644 index 000000000..76145c43c --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/usecases/store_spam_report_interactor.dart @@ -0,0 +1,21 @@ +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/store_spam_report_state.dart'; + +class StoreSpamReportInteractor { + final SpamReportRepository _spamReportRepository; + + StoreSpamReportInteractor(this._spamReportRepository); + + Stream> execute(DateTime lastTimeDismissedSpamReported) async* { + try { + yield Right(StoreSpamReportLoading()); + await _spamReportRepository.storeLastTimeDismissedSpamReported(lastTimeDismissedSpamReported); + yield Right(StoreSpamReportSuccess()); + } catch (e) { + yield Left(StoreSpamReportFailure(e)); + } + } +} \ 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 962033367..4d3643191 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -57,12 +57,17 @@ import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dar import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; 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/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/local/spam_report_cache_manager.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'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/composer_cache_repository.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/spam_report_repository.dart'; 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'; @@ -153,6 +158,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override @@ -191,6 +197,10 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), )); Get.lazyPut(() => SessionStorageComposerDatasourceImpl()); + Get.lazyPut(() => LocalSpamReportDataSourceImpl( + Get.find(), + Get.find(), + )); } @override @@ -271,6 +281,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override @@ -298,6 +309,12 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => AccountRepositoryImpl(Get.find())); Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find())); Get.lazyPut(() => ComposerCacheRepositoryImpl(Get.find())); + Get.lazyPut(() => SpamReportRepositoryImpl( + { + DataSourceType.network: Get.find(), + DataSourceType.local: Get.find() + }, + )); } void deleteController() { diff --git a/lib/features/mailbox_dashboard/utils/mailbox_dashboard_constant.dart b/lib/features/mailbox_dashboard/utils/mailbox_dashboard_constant.dart new file mode 100644 index 000000000..d3c4c6db4 --- /dev/null +++ b/lib/features/mailbox_dashboard/utils/mailbox_dashboard_constant.dart @@ -0,0 +1,3 @@ +class MailboxDashboardConstant { + static const String keyLastTimeDismissedSpamReported = 'KEY_LAST_TIME_DISMISSED_SPAM_REPORTED'; +} \ No newline at end of file diff --git a/lib/features/thread/domain/repository/thread_repository.dart b/lib/features/thread/domain/repository/thread_repository.dart index 806186a75..f82e836cc 100644 --- a/lib/features/thread/domain/repository/thread_repository.dart +++ b/lib/features/thread/domain/repository/thread_repository.dart @@ -54,8 +54,4 @@ abstract class ThreadRepository { ); Future getEmailById(AccountId accountId, EmailId emailId, {Properties? properties}); - - Future storelastTimeDismissedSpamReport(DateTime lastTimeDismissedSpamReport); - - Future getlastTimeDismissedSpamReport(); } \ No newline at end of file diff --git a/lib/features/thread/domain/state/get_last_time_dismissed_spam_reported_state.dart b/lib/features/thread/domain/state/get_last_time_dismissed_spam_reported_state.dart deleted file mode 100644 index b5246a9e8..000000000 --- a/lib/features/thread/domain/state/get_last_time_dismissed_spam_reported_state.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; - -class GetLastTimeDismissedSpamReportLoading extends UIState {} - -class GetLastTimeDismissedSpamReportSuccess extends UIState { - final DateTime lastTimeDismissedSpamReport; - - GetLastTimeDismissedSpamReportSuccess(this.lastTimeDismissedSpamReport); - - @override - List get props => []; -} - -class GetLastTimeDismissedSpamReportFailure extends FeatureFailure { - final dynamic exception; - - GetLastTimeDismissedSpamReportFailure(this.exception); - - @override - List get props => [exception]; -} \ No newline at end of file diff --git a/lib/features/thread/domain/state/store_last_time_dismissed_spam_report_state.dart b/lib/features/thread/domain/state/store_last_time_dismissed_spam_report_state.dart deleted file mode 100644 index 7a9509984..000000000 --- a/lib/features/thread/domain/state/store_last_time_dismissed_spam_report_state.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; - -class StoreLastTimeDismissedSpamReportLoading extends UIState {} - -class StoreLastTimeDismissedSpamReportSuccess extends UIState { - - StoreLastTimeDismissedSpamReportSuccess(); - - @override - List get props => []; -} - -class StoreLastTimeDismissedSpamReportFailure extends FeatureFailure { - final dynamic exception; - - StoreLastTimeDismissedSpamReportFailure(this.exception); - - @override - List get props => [exception]; -} \ No newline at end of file diff --git a/lib/features/thread/domain/usecases/get_last_time_dismissed_spam_reported_interactor.dart b/lib/features/thread/domain/usecases/get_last_time_dismissed_spam_reported_interactor.dart deleted file mode 100644 index 0baffdc35..000000000 --- a/lib/features/thread/domain/usecases/get_last_time_dismissed_spam_reported_interactor.dart +++ /dev/null @@ -1,23 +0,0 @@ -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/thread/domain/repository/thread_repository.dart'; -import 'package:tmail_ui_user/features/thread/domain/state/get_last_time_dismissed_spam_reported_state.dart'; - -class GetLastTimeDismissedSpamReportInteractor { - final ThreadRepository _threadRepository; - - GetLastTimeDismissedSpamReportInteractor(this._threadRepository); - - Stream> execute( - DateTime lastTimeDismissedSpamReport) async* { - try { - yield Right(GetLastTimeDismissedSpamReportLoading()); - final lastTimeDismissedSpamReport = await _threadRepository.getlastTimeDismissedSpamReport(); - yield Right( - GetLastTimeDismissedSpamReportSuccess(lastTimeDismissedSpamReport)); - } catch (e) { - yield Left(GetLastTimeDismissedSpamReportFailure(e)); - } - } -} \ No newline at end of file diff --git a/lib/features/thread/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart b/lib/features/thread/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart deleted file mode 100644 index 34b51f702..000000000 --- a/lib/features/thread/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart +++ /dev/null @@ -1,21 +0,0 @@ -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/thread/domain/repository/thread_repository.dart'; -import 'package:tmail_ui_user/features/thread/domain/state/store_last_time_dismissed_spam_report_state.dart'; - -class StoreLastTimeDismissedSpamReportInteractor { - final ThreadRepository _threadRepository; - - StoreLastTimeDismissedSpamReportInteractor(this._threadRepository); - - Stream> execute(DateTime lastTimeDismissedSpamReport) async* { - try { - yield Right(StoreLastTimeDismissedSpamReportLoading()); - await _threadRepository.storelastTimeDismissedSpamReport(lastTimeDismissedSpamReport); - yield Right(StoreLastTimeDismissedSpamReportSuccess()); - } catch (e) { - yield Left(StoreLastTimeDismissedSpamReportFailure(e)); - } - } -} \ No newline at end of file