From 36e08e56d21a27bea1672551fa6dee611355bfd2 Mon Sep 17 00:00:00 2001 From: HuyNguyen Date: Tue, 23 May 2023 18:06:32 +0700 Subject: [PATCH] TF-1869: GetEmailFromCache when click to notification on foreground (cherry picked from commit adf16e17070f4e62b3757228a7b9cf6becda828b) --- .../bindings/mailbox_dashboard_bindings.dart | 3 +- .../usecases/get_email_by_id_interactor.dart | 54 ++++++++++++++++++- .../thread/presentation/thread_bindings.dart | 3 +- 3 files changed, 57 insertions(+), 3 deletions(-) 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 78f0183ef..4a8fd8035 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -303,7 +303,8 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => GetAppDashboardConfigurationInteractor( Get.find())); Get.lazyPut(() => GetEmailByIdInteractor( - Get.find())); + Get.find(), + Get.find())); Get.lazyPut(() => UpdateAuthenticationAccountInteractor(Get.find())); Get.lazyPut(() => StoreSpamReportInteractor( Get.find())); diff --git a/lib/features/thread/domain/usecases/get_email_by_id_interactor.dart b/lib/features/thread/domain/usecases/get_email_by_id_interactor.dart index 88f0915d5..50d63304a 100644 --- a/lib/features/thread/domain/usecases/get_email_by_id_interactor.dart +++ b/lib/features/thread/domain/usecases/get_email_by_id_interactor.dart @@ -1,17 +1,23 @@ +import 'dart:io'; + import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/build_utils.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/extensions/email_extension.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'; import 'package:tmail_ui_user/features/thread/domain/state/get_email_by_id_state.dart'; class GetEmailByIdInteractor { final ThreadRepository _threadRepository; + final EmailRepository _emailRepository; - GetEmailByIdInteractor(this._threadRepository); + GetEmailByIdInteractor(this._threadRepository, this._emailRepository); Stream> execute( Session session, @@ -23,10 +29,56 @@ class GetEmailByIdInteractor { ) async* { try { yield Right(GetEmailByIdLoading()); + if (!BuildUtils.isWeb) { + yield* _tryToGetEmailFromCache(session, accountId, emailId, properties: properties); + } else { + yield* _getEmailByIdFromServer(session, accountId, emailId, properties: properties); + } + } catch (e) { + yield Left(GetEmailByIdFailure(e)); + } + } + + Stream> _getEmailByIdFromServer( + Session session, + AccountId accountId, + EmailId emailId, + { + Properties? properties, + } + ) async* { + try { final email = await _threadRepository.getEmailById(session, accountId, emailId, properties: properties); yield Right(GetEmailByIdSuccess(email)); } catch (e) { yield Left(GetEmailByIdFailure(e)); } + + } + + Stream> _tryToGetEmailFromCache( + Session session, + AccountId accountId, + EmailId emailId, + { + Properties? properties, + } + ) async* { + try { + + final email = await _emailRepository.getEmailFromCache(session, accountId, emailId); + + if (email != null) { + yield Right(GetEmailByIdSuccess(email.toPresentationEmail())); + } else { + yield* _getEmailByIdFromServer(session, accountId, emailId, properties: properties); + } + } catch (e) { + if (e is PathNotFoundException) { + yield* _getEmailByIdFromServer(session, accountId, emailId, properties: properties); + } else { + yield Left(GetEmailByIdFailure(e)); + } + } } } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_bindings.dart b/lib/features/thread/presentation/thread_bindings.dart index da31dff51..8a357b001 100644 --- a/lib/features/thread/presentation/thread_bindings.dart +++ b/lib/features/thread/presentation/thread_bindings.dart @@ -2,6 +2,7 @@ import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/caching/clients/state_cache_client.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_datasource_impl.dart'; import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart'; @@ -59,7 +60,7 @@ class ThreadBindings extends BaseBindings { Get.lazyPut(() => LoadMoreEmailsInMailboxInteractor(Get.find())); Get.lazyPut(() => SearchEmailInteractor(Get.find())); Get.lazyPut(() => SearchMoreEmailInteractor(Get.find())); - Get.lazyPut(() => GetEmailByIdInteractor(Get.find())); + Get.lazyPut(() => GetEmailByIdInteractor(Get.find(), Get.find())); } @override