TF-2930 Fix inline attachment lost in draft emails

This commit is contained in:
dab246
2024-07-17 13:25:58 +07:00
committed by Dat H. Pham
parent 1fc3b76f94
commit b0ee2f24ba
14 changed files with 90 additions and 58 deletions
@@ -46,7 +46,7 @@ class TransformConfiguration {
const RemoveCollapsedSignatureButtonTransformer(), const RemoveCollapsedSignatureButtonTransformer(),
]); ]);
factory TransformConfiguration.forDraftsEmail() => TransformConfiguration.empty(); factory TransformConfiguration.forDraftsEmail() => TransformConfiguration.fromDomTransformers([const ImageTransformer()]);
factory TransformConfiguration.forPreviewEmailOnWeb() => TransformConfiguration.create( factory TransformConfiguration.forPreviewEmailOnWeb() => TransformConfiguration.create(
customDomTransformers: [ customDomTransformers: [
@@ -326,9 +326,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement
void _updateEditorContent(RestoreEmailInlineImagesSuccess success) { void _updateEditorContent(RestoreEmailInlineImagesSuccess success) {
richTextWebController?.editorController.setText(success.emailContent); richTextWebController?.editorController.setText(success.emailContent);
consumeState(Stream.value(Right(GetEmailContentSuccess( consumeState(Stream.value(Right(GetEmailContentSuccess(htmlEmailContent: success.emailContent))));
htmlEmailContent: success.emailContent,
attachments: []))));
} }
@override @override
@@ -582,6 +580,12 @@ class ComposerController extends BaseController with DragDropFileMixin implement
presentationEmail: arguments.sendingEmail!.presentationEmail, presentationEmail: arguments.sendingEmail!.presentationEmail,
actionType: EmailActionType.editSendingEmail actionType: EmailActionType.editSendingEmail
); );
final allAttachments = arguments.sendingEmail!.email.allAttachments;
_initAttachmentsAndInlineImages(
attachments: allAttachments.getListAttachmentsDisplayedOutside(
arguments.sendingEmail!.email.htmlBodyAttachments),
inlineImages: allAttachments.listAttachmentsDisplayedInContent);
_getEmailContentFromSendingEmail(arguments.sendingEmail!); _getEmailContentFromSendingEmail(arguments.sendingEmail!);
_emailIdEditing = arguments.sendingEmail!.presentationEmail.id!; _emailIdEditing = arguments.sendingEmail!.presentationEmail.id!;
break; break;
@@ -628,7 +632,9 @@ class ComposerController extends BaseController with DragDropFileMixin implement
presentationEmail: arguments.presentationEmail!, presentationEmail: arguments.presentationEmail!,
actionType: arguments.emailActionType actionType: arguments.emailActionType
); );
_initAttachments(arguments.attachments ?? []); _initAttachmentsAndInlineImages(
attachments: arguments.attachments,
inlineImages: arguments.inlineImages);
_transformHtmlEmailContent(arguments.emailContents); _transformHtmlEmailContent(arguments.emailContents);
break; break;
case EmailActionType.reopenComposerBrowser: case EmailActionType.reopenComposerBrowser:
@@ -644,9 +650,9 @@ class ComposerController extends BaseController with DragDropFileMixin implement
presentationEmail: arguments.presentationEmail!, presentationEmail: arguments.presentationEmail!,
actionType: EmailActionType.reopenComposerBrowser actionType: EmailActionType.reopenComposerBrowser
); );
_initAttachments( _initAttachmentsAndInlineImages(
arguments.attachments ?? [], attachments: arguments.attachments,
inlineAttachments: arguments.inlineImages); inlineImages: arguments.inlineImages);
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final downloadUrl = mailboxDashBoardController.sessionCurrent final downloadUrl = mailboxDashBoardController.sessionCurrent
@@ -690,13 +696,16 @@ class ComposerController extends BaseController with DragDropFileMixin implement
subjectEmailInputController.text = newSubject; subjectEmailInputController.text = newSubject;
} }
void _initAttachments(List<Attachment> attachments, {List<Attachment>? inlineAttachments}) { void _initAttachmentsAndInlineImages({
if (attachments.isNotEmpty) { List<Attachment>? attachments,
initialAttachments = attachments; List<Attachment>? inlineImages
}) {
if (attachments?.isNotEmpty == true) {
initialAttachments = attachments!;
uploadController.initializeUploadAttachments(attachments); uploadController.initializeUploadAttachments(attachments);
} }
if (inlineAttachments != null) { if (inlineImages?.isNotEmpty == true) {
uploadController.initializeUploadInlineAttachments(inlineAttachments); uploadController.initializeUploadInlineAttachments(inlineImages!);
} }
} }
@@ -1323,7 +1332,6 @@ class ComposerController extends BaseController with DragDropFileMixin implement
consumeState(Stream.value( consumeState(Stream.value(
Right(GetEmailContentSuccess( Right(GetEmailContentSuccess(
htmlEmailContent: sendingEmail.presentationEmail.emailContentList.asHtmlString, htmlEmailContent: sendingEmail.presentationEmail.emailContentList.asHtmlString,
attachments: sendingEmail.email.allAttachments,
emailCurrent: sendingEmail.email emailCurrent: sendingEmail.email
)) ))
)); ));
@@ -1346,32 +1354,17 @@ class ComposerController extends BaseController with DragDropFileMixin implement
} }
void _getEmailContentFromContentShared(String content) { void _getEmailContentFromContentShared(String content) {
consumeState(Stream.value( consumeState(Stream.value(Right(GetEmailContentSuccess(htmlEmailContent: content))));
Right(GetEmailContentSuccess(
htmlEmailContent: content,
attachments: [],
))
));
} }
void _getEmailContentFromMailtoUri(String content) { void _getEmailContentFromMailtoUri(String content) {
log('ComposerController::_getEmailContentFromMailtoUri:content: $content'); log('ComposerController::_getEmailContentFromMailtoUri:content: $content');
consumeState(Stream.value( consumeState(Stream.value(Right(GetEmailContentSuccess(htmlEmailContent: content))));
Right(GetEmailContentSuccess(
htmlEmailContent: content,
attachments: [],
))
));
} }
void _getEmailContentFromUnsubscribeMailtoLink(String content) { void _getEmailContentFromUnsubscribeMailtoLink(String content) {
log('ComposerController::_getEmailContentFromUnsubscribeMailtoLink:content: $content'); log('ComposerController::_getEmailContentFromUnsubscribeMailtoLink:content: $content');
consumeState(Stream.value( consumeState(Stream.value(Right(GetEmailContentSuccess(htmlEmailContent: content))));
Right(GetEmailContentSuccess(
htmlEmailContent: content,
attachments: [],
))
));
} }
void _getEmailContentFromEmailId({required EmailId emailId, bool isDraftEmail = false}) { void _getEmailContentFromEmailId({required EmailId emailId, bool isDraftEmail = false}) {
@@ -1389,12 +1382,16 @@ class ComposerController extends BaseController with DragDropFileMixin implement
} }
void _getEmailContentOffLineSuccess(GetEmailContentFromCacheSuccess success) { void _getEmailContentOffLineSuccess(GetEmailContentFromCacheSuccess success) {
_initAttachments(success.attachments); _initAttachmentsAndInlineImages(
attachments: success.attachments,
inlineImages: success.inlineImages);
emailContentsViewState.value = Right(success); emailContentsViewState.value = Right(success);
} }
void _getEmailContentSuccess(GetEmailContentSuccess success) { void _getEmailContentSuccess(GetEmailContentSuccess success) {
_initAttachments(success.attachments); _initAttachmentsAndInlineImages(
attachments: success.attachments,
inlineImages: success.inlineImages);
emailContentsViewState.value = Right(success); emailContentsViewState.value = Right(success);
} }
@@ -18,6 +18,7 @@ extension DetailedEmailExtension on DetailedEmail {
emailContentPath: emailContentPath, emailContentPath: emailContentPath,
messageId: messageId?.ids.toList(), messageId: messageId?.ids.toList(),
references: references?.ids.toList(), references: references?.ids.toList(),
inlineImages: inlineImages?.toHiveCache(),
); );
} }
@@ -36,6 +37,7 @@ extension DetailedEmailExtension on DetailedEmail {
emailContentPath: path, emailContentPath: path,
messageId: messageId, messageId: messageId,
references: references, references: references,
inlineImages: inlineImages,
); );
} }
} }
@@ -22,7 +22,8 @@ extension DetailedEmailHiveCacheExtension on DetailedEmailHiveCache {
: null, : null,
references: references != null references: references != null
? MessageIdsHeaderValue(references!.toSet()) ? MessageIdsHeaderValue(references!.toSet())
: null : null,
inlineImages: inlineImages?.toAttachment(),
); );
} }
} }
@@ -14,7 +14,8 @@ extension EmailExtension on Email {
keywords: keywords, keywords: keywords,
htmlEmailContent: htmlEmailContent, htmlEmailContent: htmlEmailContent,
messageId: messageId, messageId: messageId,
references: references references: references,
inlineImages: allAttachments.listAttachmentsDisplayedInContent,
); );
} }
} }
@@ -14,6 +14,7 @@ class DetailedEmail with EquatableMixin {
final DateTime createdTime; final DateTime createdTime;
final MessageIdsHeaderValue? messageId; final MessageIdsHeaderValue? messageId;
final MessageIdsHeaderValue? references; final MessageIdsHeaderValue? references;
final List<Attachment>? inlineImages;
DetailedEmail({ DetailedEmail({
required this.emailId, required this.emailId,
@@ -25,6 +26,7 @@ class DetailedEmail with EquatableMixin {
this.emailContentPath, this.emailContentPath,
this.messageId, this.messageId,
this.references, this.references,
this.inlineImages,
}); });
@override @override
@@ -38,5 +40,6 @@ class DetailedEmail with EquatableMixin {
emailContentPath, emailContentPath,
messageId, messageId,
references, references,
inlineImages,
]; ];
} }
@@ -7,12 +7,14 @@ class GetEmailContentLoading extends LoadingState {}
class GetEmailContentSuccess extends UIState { class GetEmailContentSuccess extends UIState {
final String htmlEmailContent; final String htmlEmailContent;
final List<Attachment> attachments; final List<Attachment>? attachments;
final List<Attachment>? inlineImages;
final Email? emailCurrent; final Email? emailCurrent;
GetEmailContentSuccess({ GetEmailContentSuccess({
required this.htmlEmailContent, required this.htmlEmailContent,
required this.attachments, this.attachments,
this.inlineImages,
this.emailCurrent this.emailCurrent
}); });
@@ -20,18 +22,21 @@ class GetEmailContentSuccess extends UIState {
List<Object?> get props => [ List<Object?> get props => [
htmlEmailContent, htmlEmailContent,
attachments, attachments,
inlineImages,
emailCurrent emailCurrent
]; ];
} }
class GetEmailContentFromCacheSuccess extends UIState { class GetEmailContentFromCacheSuccess extends UIState {
final String htmlEmailContent; final String htmlEmailContent;
final List<Attachment> attachments; final List<Attachment>? attachments;
final List<Attachment>? inlineImages;
final Email? emailCurrent; final Email? emailCurrent;
GetEmailContentFromCacheSuccess({ GetEmailContentFromCacheSuccess({
required this.htmlEmailContent, required this.htmlEmailContent,
required this.attachments, this.attachments,
this.inlineImages,
this.emailCurrent this.emailCurrent
}); });
@@ -39,6 +44,7 @@ class GetEmailContentFromCacheSuccess extends UIState {
List<Object?> get props => [ List<Object?> get props => [
htmlEmailContent, htmlEmailContent,
attachments, attachments,
inlineImages,
emailCurrent, emailCurrent,
]; ];
} }
@@ -47,9 +47,11 @@ class GetEmailContentInteractor {
) async* { ) async* {
try { try {
final email = await emailRepository.getEmailContent(session, accountId, emailId); final email = await emailRepository.getEmailContent(session, accountId, emailId);
final listAttachments = email.allAttachments.getListAttachmentsDisplayedOutside(email.htmlBodyAttachments);
final listInlineImages = email.allAttachments.listAttachmentsDisplayedInContent;
if (email.emailContentList.isNotEmpty) { if (email.emailContentList.isNotEmpty) {
final mapCidImageDownloadUrl = email.attachmentsWithCid.toMapCidImageDownloadUrl( final mapCidImageDownloadUrl = listInlineImages.toMapCidImageDownloadUrl(
accountId: accountId, accountId: accountId,
downloadUrl: baseDownloadUrl downloadUrl: baseDownloadUrl
); );
@@ -61,13 +63,15 @@ class GetEmailContentInteractor {
yield Right<Failure, Success>(GetEmailContentSuccess( yield Right<Failure, Success>(GetEmailContentSuccess(
htmlEmailContent: newEmailContents.asHtmlString, htmlEmailContent: newEmailContents.asHtmlString,
attachments: email.allAttachments.getListAttachmentsDisplayedOutside(email.htmlBodyAttachments), attachments: listAttachments,
inlineImages: listInlineImages,
emailCurrent: email emailCurrent: email
)); ));
} else { } else {
yield Right<Failure, Success>(GetEmailContentSuccess( yield Right<Failure, Success>(GetEmailContentSuccess(
htmlEmailContent: '', htmlEmailContent: '',
attachments: email.allAttachments.getListAttachmentsDisplayedOutside(email.htmlBodyAttachments), attachments: listAttachments,
inlineImages: listInlineImages,
emailCurrent: email emailCurrent: email
)); ));
} }
@@ -90,6 +94,7 @@ class GetEmailContentInteractor {
yield Right<Failure, Success>(GetEmailContentFromCacheSuccess( yield Right<Failure, Success>(GetEmailContentFromCacheSuccess(
htmlEmailContent: detailedEmail.htmlEmailContent ?? '', htmlEmailContent: detailedEmail.htmlEmailContent ?? '',
attachments: detailedEmail.attachments ?? [], attachments: detailedEmail.attachments ?? [],
inlineImages: detailedEmail.inlineImages ?? [],
emailCurrent: Email( emailCurrent: Email(
id: emailId, id: emailId,
headers: detailedEmail.headers, headers: detailedEmail.headers,
@@ -121,6 +126,7 @@ class GetEmailContentInteractor {
yield Right<Failure, Success>(GetEmailContentFromCacheSuccess( yield Right<Failure, Success>(GetEmailContentFromCacheSuccess(
htmlEmailContent: detailedEmail.htmlEmailContent ?? '', htmlEmailContent: detailedEmail.htmlEmailContent ?? '',
attachments: detailedEmail.attachments ?? [], attachments: detailedEmail.attachments ?? [],
inlineImages: detailedEmail.inlineImages ?? [],
emailCurrent: Email( emailCurrent: Email(
id: emailId, id: emailId,
headers: detailedEmail.headers, headers: detailedEmail.headers,
@@ -57,7 +57,7 @@ class GetListDetailedEmailByIdInteractor {
final listEmailContent = email.emailContentList; final listEmailContent = email.emailContentList;
if (listEmailContent.isNotEmpty) { if (listEmailContent.isNotEmpty) {
final mapCidImageDownloadUrl = email.attachmentsWithCid.toMapCidImageDownloadUrl( final mapCidImageDownloadUrl = email.allAttachments.listAttachmentsDisplayedInContent.toMapCidImageDownloadUrl(
accountId: accountId, accountId: accountId,
downloadUrl: baseDownloadUrl downloadUrl: baseDownloadUrl
); );
@@ -469,6 +469,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
GetEmailContentSuccess( GetEmailContentSuccess(
htmlEmailContent: emailLoaded.htmlContent, htmlEmailContent: emailLoaded.htmlContent,
attachments: emailLoaded.attachments, attachments: emailLoaded.attachments,
inlineImages: emailLoaded.inlineImages,
emailCurrent: emailLoaded.emailCurrent emailCurrent: emailLoaded.emailCurrent
) )
))); )));
@@ -501,22 +502,23 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
currentEmailLoaded.value = EmailLoaded( currentEmailLoaded.value = EmailLoaded(
htmlContent: success.htmlEmailContent, htmlContent: success.htmlEmailContent,
attachments: List.of(success.attachments), attachments: List.of(success.attachments ?? []),
inlineImages: List.of(success.inlineImages ?? []),
emailCurrent: success.emailCurrent, emailCurrent: success.emailCurrent,
); );
emailSupervisorController.pushEmailQueue(currentEmailLoaded.value!); emailSupervisorController.pushEmailQueue(currentEmailLoaded.value!);
if (success.emailCurrent?.id == currentEmail?.id) { if (success.emailCurrent?.id == currentEmail?.id) {
attachments.value = success.attachments; attachments.value = success.attachments ?? [];
attachmentsViewState.value = { attachmentsViewState.value = {
for (var attachment in attachments.where((item) => item.blobId != null)) for (var attachment in attachments.where((item) => item.blobId != null))
attachment.blobId!: Right(IdleDownloadAttachmentForWeb()) attachment.blobId!: Right(IdleDownloadAttachmentForWeb())
}; };
if (_canParseCalendarEvent(blobIds: success.attachments.calendarEventBlobIds)) { if (_canParseCalendarEvent(blobIds: success.attachments?.calendarEventBlobIds ?? {})) {
_parseCalendarEventAction( _parseCalendarEventAction(
accountId: mailboxDashBoardController.accountId.value!, accountId: mailboxDashBoardController.accountId.value!,
blobIds: success.attachments.calendarEventBlobIds, blobIds: success.attachments?.calendarEventBlobIds ?? {},
emailContents: success.htmlEmailContent emailContents: success.htmlEmailContent
); );
} else { } else {
@@ -545,22 +547,23 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
currentEmailLoaded.value = EmailLoaded( currentEmailLoaded.value = EmailLoaded(
htmlContent: success.htmlEmailContent, htmlContent: success.htmlEmailContent,
attachments: List.of(success.attachments), attachments: List.of(success.attachments ?? []),
inlineImages: List.of(success.inlineImages ?? []),
emailCurrent: success.emailCurrent, emailCurrent: success.emailCurrent,
); );
emailSupervisorController.pushEmailQueue(currentEmailLoaded.value!); emailSupervisorController.pushEmailQueue(currentEmailLoaded.value!);
if (success.emailCurrent?.id == currentEmail?.id) { if (success.emailCurrent?.id == currentEmail?.id) {
attachments.value = success.attachments; attachments.value = success.attachments ?? [];
attachmentsViewState.value = { attachmentsViewState.value = {
for (var attachment in attachments.where((item) => item.blobId != null)) for (var attachment in attachments.where((item) => item.blobId != null))
attachment.blobId!: Right(IdleDownloadAttachmentForWeb()) attachment.blobId!: Right(IdleDownloadAttachmentForWeb())
}; };
if (_canParseCalendarEvent(blobIds: success.attachments.calendarEventBlobIds)) { if (_canParseCalendarEvent(blobIds: success.attachments?.calendarEventBlobIds ?? {})) {
_parseCalendarEventAction( _parseCalendarEventAction(
accountId: mailboxDashBoardController.accountId.value!, accountId: mailboxDashBoardController.accountId.value!,
blobIds: success.attachments.calendarEventBlobIds, blobIds: success.attachments?.calendarEventBlobIds ?? {},
emailContents: success.htmlEmailContent emailContents: success.htmlEmailContent
); );
} else { } else {
@@ -1343,6 +1346,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
ComposerArguments.replyEmail( ComposerArguments.replyEmail(
presentationEmail: presentationEmail, presentationEmail: presentationEmail,
content: currentEmailLoaded.value?.htmlContent ?? '', content: currentEmailLoaded.value?.htmlContent ?? '',
inlineImages: currentEmailLoaded.value?.inlineImages ?? [],
mailboxRole: presentationEmail.mailboxContain?.role, mailboxRole: presentationEmail.mailboxContain?.role,
messageId: currentEmailLoaded.value?.emailCurrent?.messageId, messageId: currentEmailLoaded.value?.emailCurrent?.messageId,
references: currentEmailLoaded.value?.emailCurrent?.references, references: currentEmailLoaded.value?.emailCurrent?.references,
@@ -1354,6 +1358,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
ComposerArguments.replyAllEmail( ComposerArguments.replyAllEmail(
presentationEmail: presentationEmail, presentationEmail: presentationEmail,
content: currentEmailLoaded.value?.htmlContent ?? '', content: currentEmailLoaded.value?.htmlContent ?? '',
inlineImages: currentEmailLoaded.value?.inlineImages ?? [],
mailboxRole: presentationEmail.mailboxContain?.role, mailboxRole: presentationEmail.mailboxContain?.role,
messageId: currentEmailLoaded.value?.emailCurrent?.messageId, messageId: currentEmailLoaded.value?.emailCurrent?.messageId,
references: currentEmailLoaded.value?.emailCurrent?.references, references: currentEmailLoaded.value?.emailCurrent?.references,
@@ -1366,6 +1371,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
presentationEmail: presentationEmail, presentationEmail: presentationEmail,
content: currentEmailLoaded.value?.htmlContent ?? '', content: currentEmailLoaded.value?.htmlContent ?? '',
attachments: attachments, attachments: attachments,
inlineImages: currentEmailLoaded.value?.inlineImages ?? [],
messageId: currentEmailLoaded.value?.emailCurrent?.messageId, messageId: currentEmailLoaded.value?.emailCurrent?.messageId,
references: currentEmailLoaded.value?.emailCurrent?.references, references: currentEmailLoaded.value?.emailCurrent?.references,
) )
@@ -95,11 +95,9 @@ class ComposerArguments extends RouterArguments {
emailActionType: EmailActionType.reopenComposerBrowser, emailActionType: EmailActionType.reopenComposerBrowser,
presentationEmail: composerCache.email?.toPresentationEmail(), presentationEmail: composerCache.email?.toPresentationEmail(),
emailContents: composerCache.email?.emailContentList.asHtmlString, emailContents: composerCache.email?.emailContentList.asHtmlString,
attachments: composerCache.email?.allAttachments attachments: composerCache.email?.allAttachments.getListAttachmentsDisplayedOutside(composerCache.email?.htmlBodyAttachments ?? []),
.where((attachment) => attachment.disposition != ContentDisposition.inline)
.toList(),
selectedIdentity: composerCache.identity, selectedIdentity: composerCache.identity,
inlineImages: composerCache.email?.attachmentsWithCid, inlineImages: composerCache.email?.allAttachments.listAttachmentsDisplayedInContent,
readRecepientEnabled: composerCache.readReceipentEnabled, readRecepientEnabled: composerCache.readReceipentEnabled,
displayMode: composerCache.displayMode, displayMode: composerCache.displayMode,
); );
@@ -107,6 +105,7 @@ class ComposerArguments extends RouterArguments {
factory ComposerArguments.replyEmail({ factory ComposerArguments.replyEmail({
required PresentationEmail presentationEmail, required PresentationEmail presentationEmail,
required String content, required String content,
required List<Attachment> inlineImages,
Role? mailboxRole, Role? mailboxRole,
MessageIdsHeaderValue? messageId, MessageIdsHeaderValue? messageId,
MessageIdsHeaderValue? references, MessageIdsHeaderValue? references,
@@ -114,6 +113,7 @@ class ComposerArguments extends RouterArguments {
emailActionType: EmailActionType.reply, emailActionType: EmailActionType.reply,
presentationEmail: presentationEmail, presentationEmail: presentationEmail,
emailContents: content, emailContents: content,
inlineImages: inlineImages,
mailboxRole: mailboxRole, mailboxRole: mailboxRole,
messageId: messageId, messageId: messageId,
references: references, references: references,
@@ -122,6 +122,7 @@ class ComposerArguments extends RouterArguments {
factory ComposerArguments.replyAllEmail({ factory ComposerArguments.replyAllEmail({
required PresentationEmail presentationEmail, required PresentationEmail presentationEmail,
required String content, required String content,
required List<Attachment> inlineImages,
Role? mailboxRole, Role? mailboxRole,
MessageIdsHeaderValue? messageId, MessageIdsHeaderValue? messageId,
MessageIdsHeaderValue? references, MessageIdsHeaderValue? references,
@@ -129,6 +130,7 @@ class ComposerArguments extends RouterArguments {
emailActionType: EmailActionType.replyAll, emailActionType: EmailActionType.replyAll,
presentationEmail: presentationEmail, presentationEmail: presentationEmail,
emailContents: content, emailContents: content,
inlineImages: inlineImages,
mailboxRole: mailboxRole, mailboxRole: mailboxRole,
messageId: messageId, messageId: messageId,
references: references, references: references,
@@ -138,6 +140,7 @@ class ComposerArguments extends RouterArguments {
required PresentationEmail presentationEmail, required PresentationEmail presentationEmail,
required String content, required String content,
required List<Attachment> attachments, required List<Attachment> attachments,
required List<Attachment> inlineImages,
MessageIdsHeaderValue? messageId, MessageIdsHeaderValue? messageId,
MessageIdsHeaderValue? references, MessageIdsHeaderValue? references,
}) => ComposerArguments( }) => ComposerArguments(
@@ -145,6 +148,7 @@ class ComposerArguments extends RouterArguments {
presentationEmail: presentationEmail, presentationEmail: presentationEmail,
emailContents: content, emailContents: content,
attachments: attachments, attachments: attachments,
inlineImages: inlineImages,
mailboxRole: presentationEmail.mailboxContain?.role, mailboxRole: presentationEmail.mailboxContain?.role,
messageId: messageId, messageId: messageId,
references: references, references: references,
@@ -5,11 +5,13 @@ import 'package:model/email/attachment.dart';
class EmailLoaded with EquatableMixin { class EmailLoaded with EquatableMixin {
final String htmlContent; final String htmlContent;
final List<Attachment> attachments; final List<Attachment> attachments;
final List<Attachment> inlineImages;
final Email? emailCurrent; final Email? emailCurrent;
EmailLoaded({ EmailLoaded({
required this.htmlContent, required this.htmlContent,
required this.attachments, required this.attachments,
required this.inlineImages,
this.emailCurrent, this.emailCurrent,
}); });
@@ -17,6 +19,7 @@ class EmailLoaded with EquatableMixin {
List<Object?> get props => [ List<Object?> get props => [
htmlContent, htmlContent,
attachments, attachments,
inlineImages,
emailCurrent emailCurrent
]; ];
} }
@@ -35,6 +35,9 @@ class DetailedEmailHiveCache extends HiveObject with EquatableMixin {
@HiveField(7) @HiveField(7)
final List<String>? references; final List<String>? references;
@HiveField(8)
final List<AttachmentHiveCache>? inlineImages;
DetailedEmailHiveCache({ DetailedEmailHiveCache({
required this.emailId, required this.emailId,
required this.timeSaved, required this.timeSaved,
@@ -44,6 +47,7 @@ class DetailedEmailHiveCache extends HiveObject with EquatableMixin {
this.keywords, this.keywords,
this.messageId, this.messageId,
this.references, this.references,
this.inlineImages,
}); });
@override @override
@@ -56,5 +60,6 @@ class DetailedEmailHiveCache extends HiveObject with EquatableMixin {
keywords, keywords,
messageId, messageId,
references, references,
inlineImages,
]; ];
} }
@@ -151,8 +151,6 @@ extension EmailExtension on Email {
List<Attachment> get allAttachments => attachments?.map((item) => item.toAttachment()).toList() ?? []; List<Attachment> get allAttachments => attachments?.map((item) => item.toAttachment()).toList() ?? [];
List<Attachment> get attachmentsWithCid => allAttachments.where((attachment) => attachment.hasCid()).toList();
PresentationMailbox? findMailboxContain(Map<MailboxId, PresentationMailbox> mapMailbox) { PresentationMailbox? findMailboxContain(Map<MailboxId, PresentationMailbox> mapMailbox) {
final newMailboxIds = mailboxIds; final newMailboxIds = mailboxIds;
newMailboxIds?.removeWhere((key, value) => !value); newMailboxIds?.removeWhere((key, value) => !value);