TF-825 Download email as EML file (#2854)

This commit is contained in:
Dat Vu
2024-05-16 15:50:01 +07:00
committed by GitHub
parent 175f285e51
commit ca4cf68f87
29 changed files with 153 additions and 26 deletions
@@ -20,6 +20,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:jmap_dart_client/jmap/mdn/disposition.dart';
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
import 'package:mime/mime.dart';
import 'package:model/email/eml_attachment.dart';
import 'package:model/model.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
@@ -28,6 +29,7 @@ import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/list_attachments_extension.dart';
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
import 'package:tmail_ui_user/features/email/domain/model/email_print.dart';
@@ -810,7 +812,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} else {
consumeState(Stream.value(
Left(DownloadAttachmentForWebFailure(
attachmentBlobId: attachment.blobId,
attachment: attachment,
exception: NotFoundSessionException()))
));
}
@@ -831,7 +833,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} else {
consumeState(Stream.value(
Left(ViewAttachmentForWebFailure(
attachmentBlobId: attachment.blobId,
attachment: attachment,
exception: NotFoundSessionException()))
));
}
@@ -876,12 +878,16 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
mailboxDashBoardController.deleteDownloadTask(failure.taskId!);
}
_updateAttachmentsViewState(failure.attachmentBlobId, Left(failure));
if (failure.attachment != null) {
_updateAttachmentsViewState(failure.attachment?.blobId, Left(failure));
}
if (currentOverlayContext != null && currentContext != null) {
appToast.showToastErrorMessage(
currentOverlayContext!,
AppLocalizations.of(currentContext!).attachment_download_failed);
failure.attachment is EMLAttachment
? AppLocalizations.of(currentContext!).downloadMessageAsEMLFailed
: AppLocalizations.of(currentContext!).attachment_download_failed);
}
}
@@ -1141,6 +1147,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
case EmailActionType.printAll:
_printEmail(context, presentationEmail);
break;
case EmailActionType.downloadMessageAsEML:
_downloadMessageAsEML(presentationEmail);
break;
default:
break;
}
@@ -1772,4 +1781,14 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
AppLocalizations.of(currentContext!).eventReplyWasSentUnsuccessfully);
}
}
void _downloadMessageAsEML(PresentationEmail presentationEmail) {
final emlAttachment = presentationEmail.createEMLAttachment();
if (emlAttachment.blobId == null) {
consumeState(Stream.value(Left(DownloadAttachmentForWebFailure(exception: NotFoundEmailBlobIdException()))));
return;
}
downloadAttachmentForWeb(emlAttachment);
}
}