diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index edd79e591..f873f8048 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -71,6 +71,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i import 'package:tmail_ui_user/features/email/domain/usecases/transform_html_email_content_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; +import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.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/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart'; @@ -335,9 +336,10 @@ class ComposerController extends BaseController with DragDropFileMixin implement _handlePickFileFailure(failure); } else if (failure is LocalImagePickerFailure) { _handlePickImageFailure(failure); - } else if (failure is GetEmailContentFailure || - failure is TransformHtmlEmailContentFailure || - failure is RestoreEmailInlineImagesFailure) { + } else if (failure is GetEmailContentFailure) { + _handleGetEmailContentFailure(failure); + } else if (failure is TransformHtmlEmailContentFailure + || failure is RestoreEmailInlineImagesFailure) { emailContentsViewState.value = Left(failure); } else if (failure is GetAllIdentitiesFailure) { if (identitySelected.value == null) { @@ -564,9 +566,8 @@ class ComposerController extends BaseController with DragDropFileMixin implement presentationEmail: arguments.presentationEmail!, actionType: EmailActionType.editDraft ); - _getEmailContentFromEmailId( + _getEmailContentOfEmailDrafts( emailId: arguments.presentationEmail!.id!, - isDraftEmail: arguments.presentationEmail!.isDraft ); _emailIdEditing = arguments.presentationEmail!.id!; break; @@ -688,7 +689,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement if (composerArguments.value?.emailActionType == EmailActionType.reopenComposerBrowser) { log('ComposerController::_initEmail: hasRequestReadReceipt = ${arguments.hasRequestReadReceipt}'); hasRequestReadReceipt.value = arguments.hasRequestReadReceipt ?? false; - } else { + } else if (composerArguments.value?.emailActionType != EmailActionType.editDraft) { _getAlwaysReadReceiptSetting(); } } @@ -1376,18 +1377,22 @@ class ComposerController extends BaseController with DragDropFileMixin implement consumeState(Stream.value(Right(GetEmailContentSuccess(htmlEmailContent: content)))); } - void _getEmailContentFromEmailId({required EmailId emailId, bool isDraftEmail = false}) { + void _getEmailContentOfEmailDrafts({required EmailId emailId}) { final session = mailboxDashBoardController.sessionCurrent; final accountId = mailboxDashBoardController.accountId.value; - if (session != null && accountId != null) { - consumeState(_getEmailContentInteractor.execute( - session, - accountId, - emailId, - mailboxDashBoardController.baseDownloadUrl, - TransformConfiguration.forDraftsEmail() - )); + + if (session == null || accountId == null) { + consumeState(Stream.value(Left(GetEmailContentFailure(NotFoundSessionException())))); + return; } + + consumeState(_getEmailContentInteractor.execute( + session, + accountId, + emailId, + mailboxDashBoardController.baseDownloadUrl, + TransformConfiguration.forDraftsEmail() + )); } void _getEmailContentOffLineSuccess(GetEmailContentFromCacheSuccess success) { @@ -1395,6 +1400,10 @@ class ComposerController extends BaseController with DragDropFileMixin implement attachments: success.attachments, inlineImages: success.inlineImages); emailContentsViewState.value = Right(success); + + if (composerArguments.value?.emailActionType == EmailActionType.editDraft) { + _setUpRequestReadReceiptForDraftEmail(success.emailCurrent); + } } void _getEmailContentSuccess(GetEmailContentSuccess success) { @@ -1402,6 +1411,10 @@ class ComposerController extends BaseController with DragDropFileMixin implement attachments: success.attachments, inlineImages: success.inlineImages); emailContentsViewState.value = Right(success); + + if (composerArguments.value?.emailActionType == EmailActionType.editDraft) { + _setUpRequestReadReceiptForDraftEmail(success.emailCurrent); + } } void _transformHtmlEmailContent(String? emailContent) { @@ -2308,6 +2321,21 @@ class ComposerController extends BaseController with DragDropFileMixin implement ccRecipientState.value = isEnabled ? PrefixRecipientState.disabled : PrefixRecipientState.enabled; bccRecipientState.value = isEnabled ? PrefixRecipientState.disabled : PrefixRecipientState.enabled; } + + void _handleGetEmailContentFailure(GetEmailContentFailure failure) { + emailContentsViewState.value = Left(failure); + if (composerArguments.value?.emailActionType == EmailActionType.editDraft) { + _getAlwaysReadReceiptSetting(); + } + } + + void _setUpRequestReadReceiptForDraftEmail(Email? email) { + if (email?.hasRequestReadReceipt == true) { + hasRequestReadReceipt.value = true; + } else { + _getAlwaysReadReceiptSetting(); + } + } @override Future onBeforeReconnect() async { diff --git a/model/lib/extensions/email_extension.dart b/model/lib/extensions/email_extension.dart index 26df00cd0..45910b46c 100644 --- a/model/lib/extensions/email_extension.dart +++ b/model/lib/extensions/email_extension.dart @@ -28,6 +28,8 @@ extension EmailExtension on Email { String get listUnsubscribe => headers.listUnsubscribe; + bool get hasRequestReadReceipt => headers.readReceiptHasBeenRequested; + bool get hasListUnsubscribe => listUnsubscribe.isNotEmpty; bool hasReadReceipt(Map mapMailbox) {