TF-1961 Transform html email content in composer
(cherry picked from commit f5470c130744242195b265a0ea4aad044ad8e740)
This commit is contained in:
@@ -360,22 +360,33 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
|
||||
void _getEmailContentAction(EmailId emailId) async {
|
||||
final session = mailboxDashBoardController.sessionCurrent;
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl(jmapUrl: _dynamicUrlInterceptors.jmapUrl);
|
||||
final emailLoaded = emailSupervisorController.getEmailInQueueByEmailId(emailId);
|
||||
|
||||
if (emailLoaded != null) {
|
||||
consumeState(Stream.value(Right<Failure, Success>(
|
||||
GetEmailContentSuccess(
|
||||
emailContent: emailLoaded.originalContent,
|
||||
emailContentDisplayed: emailLoaded.displayedContent,
|
||||
htmlEmailContent: emailLoaded.htmlContent,
|
||||
attachments: emailLoaded.attachments,
|
||||
emailCurrent: emailLoaded.emailCurrent
|
||||
)
|
||||
)));
|
||||
} else if (session != null && accountId != null && baseDownloadUrl != null) {
|
||||
consumeState(_getEmailContentInteractor.execute(session, accountId, emailId, baseDownloadUrl));
|
||||
} else {
|
||||
final session = mailboxDashBoardController.sessionCurrent;
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
if (session != null && accountId != null) {
|
||||
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl(jmapUrl: _dynamicUrlInterceptors.jmapUrl) ?? '';
|
||||
TransformConfiguration transformConfiguration = PlatformInfo.isWeb
|
||||
? TransformConfiguration.forPreviewEmailPlatformWeb()
|
||||
: TransformConfiguration.standardConfiguration;
|
||||
|
||||
consumeState(_getEmailContentInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
emailId,
|
||||
baseDownloadUrl,
|
||||
transformConfiguration
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -387,8 +398,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
emailSupervisorController.popEmailQueue(success.emailCurrent?.id);
|
||||
|
||||
_currentEmailLoaded = EmailLoaded(
|
||||
originalContent: success.emailContent,
|
||||
displayedContent: success.emailContent,
|
||||
htmlContent: success.htmlEmailContent,
|
||||
attachments: List.of(success.attachments),
|
||||
emailCurrent: success.emailCurrent,
|
||||
);
|
||||
@@ -401,10 +411,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
_parseCalendarEventAction(
|
||||
accountId: mailboxDashBoardController.accountId.value!,
|
||||
blobIds: success.attachments.calendarEventBlobIds,
|
||||
emailContents: success.emailContent
|
||||
emailContents: success.htmlEmailContent
|
||||
);
|
||||
} else {
|
||||
emailContents.value = success.emailContent;
|
||||
emailContents.value = success.htmlEmailContent;
|
||||
}
|
||||
|
||||
final isShowMessageReadReceipt = success.emailCurrent?.hasReadReceipt(mailboxDashBoardController.mapMailboxById) == true;
|
||||
@@ -422,8 +432,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
emailSupervisorController.popEmailQueue(success.emailCurrent?.id);
|
||||
|
||||
_currentEmailLoaded = EmailLoaded(
|
||||
originalContent: success.emailContent,
|
||||
displayedContent: success.emailContentDisplayed,
|
||||
htmlContent: success.htmlEmailContent,
|
||||
attachments: List.of(success.attachments),
|
||||
emailCurrent: success.emailCurrent,
|
||||
);
|
||||
@@ -436,10 +445,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
_parseCalendarEventAction(
|
||||
accountId: mailboxDashBoardController.accountId.value!,
|
||||
blobIds: success.attachments.calendarEventBlobIds,
|
||||
emailContents: success.emailContent
|
||||
emailContents: success.htmlEmailContent
|
||||
);
|
||||
} else {
|
||||
emailContents.value = success.emailContentDisplayed;
|
||||
emailContents.value = success.htmlEmailContent;
|
||||
}
|
||||
|
||||
if (PlatformInfo.isMobile) {
|
||||
@@ -449,7 +458,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
attachments: success.attachments,
|
||||
headers: currentEmail?.emailHeader?.toSet(),
|
||||
keywords: currentEmail?.keywords,
|
||||
htmlEmailContent: success.emailContentDisplayed
|
||||
htmlEmailContent: success.htmlEmailContent
|
||||
);
|
||||
|
||||
_storeOpenedEmailAction(
|
||||
@@ -978,13 +987,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
|
||||
void composeEmailFromEmailAddress(EmailAddress emailAddress) {
|
||||
popBack();
|
||||
|
||||
final arguments = ComposerArguments(
|
||||
emailActionType: EmailActionType.composeFromEmailAddress,
|
||||
emailAddress: emailAddress,
|
||||
mailboxRole: mailboxDashBoardController.selectedMailbox.value?.role);
|
||||
|
||||
mailboxDashBoardController.goToComposer(arguments);
|
||||
mailboxDashBoardController.goToComposer(ComposerArguments.fromEmailAddress(emailAddress));
|
||||
}
|
||||
|
||||
void openMailToLink(Uri? uri) {
|
||||
@@ -993,12 +996,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
log('SingleEmailController::openMailToLink(): address: $address');
|
||||
if (address.isNotEmpty) {
|
||||
final emailAddress = EmailAddress(null, address);
|
||||
final arguments = ComposerArguments(
|
||||
emailActionType: EmailActionType.composeFromEmailAddress,
|
||||
emailAddress: emailAddress,
|
||||
mailboxRole: mailboxDashBoardController.selectedMailbox.value?.role);
|
||||
|
||||
mailboxDashBoardController.goToComposer(arguments);
|
||||
mailboxDashBoardController.goToComposer(ComposerArguments.fromEmailAddress(emailAddress));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1158,19 +1156,43 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
}
|
||||
|
||||
void pressEmailAction(EmailActionType emailActionType) {
|
||||
if (emailActionType == EmailActionType.compose) {
|
||||
mailboxDashBoardController.goToComposer(ComposerArguments());
|
||||
} else {
|
||||
final arguments = ComposerArguments(
|
||||
emailActionType: emailActionType,
|
||||
presentationEmail: mailboxDashBoardController.selectedEmail.value!,
|
||||
emailContents: _currentEmailLoaded?.originalContent,
|
||||
attachments: emailActionType == EmailActionType.forward ? attachments : null,
|
||||
mailboxRole: mailboxDashBoardController.selectedMailbox.value?.role
|
||||
);
|
||||
|
||||
mailboxDashBoardController.goToComposer(arguments);
|
||||
void pressEmailAction(
|
||||
EmailActionType emailActionType,
|
||||
PresentationEmail presentationEmail
|
||||
) {
|
||||
switch(emailActionType) {
|
||||
case EmailActionType.compose:
|
||||
mailboxDashBoardController.goToComposer(ComposerArguments());
|
||||
break;
|
||||
case EmailActionType.reply:
|
||||
mailboxDashBoardController.goToComposer(
|
||||
ComposerArguments.replyEmail(
|
||||
presentationEmail: presentationEmail,
|
||||
content: _currentEmailLoaded?.htmlContent ?? '',
|
||||
mailboxRole: presentationEmail.mailboxContain?.role
|
||||
)
|
||||
);
|
||||
break;
|
||||
case EmailActionType.replyAll:
|
||||
mailboxDashBoardController.goToComposer(
|
||||
ComposerArguments.replyAllEmail(
|
||||
presentationEmail: presentationEmail,
|
||||
content: _currentEmailLoaded?.htmlContent ?? '',
|
||||
mailboxRole: presentationEmail.mailboxContain?.role
|
||||
)
|
||||
);
|
||||
break;
|
||||
case EmailActionType.forward:
|
||||
mailboxDashBoardController.goToComposer(
|
||||
ComposerArguments.forwardEmail(
|
||||
presentationEmail: presentationEmail,
|
||||
content: _currentEmailLoaded?.htmlContent ?? '',
|
||||
attachments: attachments
|
||||
)
|
||||
);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1276,7 +1298,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
|
||||
void _handleParseCalendarEventFailure(ParseCalendarEventFailure failure) {
|
||||
emailLoadedViewState.value = Left<Failure, Success>(failure);
|
||||
emailContents.value = _currentEmailLoaded?.displayedContent;
|
||||
emailContents.value = _currentEmailLoaded?.htmlContent;
|
||||
}
|
||||
|
||||
void _enableScrollPageView() {
|
||||
@@ -1289,11 +1311,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
|
||||
void openNewComposerAction(String mailTo) {
|
||||
final emailAddress = EmailAddress(mailTo, mailTo);
|
||||
final arguments = ComposerArguments(
|
||||
emailActionType: EmailActionType.composeFromEmailAddress,
|
||||
emailAddress: emailAddress,
|
||||
mailboxRole: mailboxDashBoardController.selectedMailbox.value?.role
|
||||
);
|
||||
mailboxDashBoardController.goToComposer(arguments);
|
||||
mailboxDashBoardController.goToComposer(ComposerArguments.fromEmailAddress(emailAddress));
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/composer_cache.dart';
|
||||
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
|
||||
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
||||
|
||||
@@ -26,6 +27,84 @@ class ComposerArguments extends RouterArguments {
|
||||
this.sendingEmail
|
||||
});
|
||||
|
||||
factory ComposerArguments.fromSendingEmail(SendingEmail sendingEmail) =>
|
||||
ComposerArguments(
|
||||
emailActionType: EmailActionType.editSendingEmail,
|
||||
sendingEmail: sendingEmail
|
||||
);
|
||||
|
||||
factory ComposerArguments.fromContentShared(String content) =>
|
||||
ComposerArguments(
|
||||
emailActionType: EmailActionType.composeFromContentShared,
|
||||
emailContents: content
|
||||
);
|
||||
|
||||
factory ComposerArguments.fromFileShared(List<SharedMediaFile> filesShared) =>
|
||||
ComposerArguments(
|
||||
emailActionType: EmailActionType.composeFromFileShared,
|
||||
listSharedMediaFile: filesShared
|
||||
);
|
||||
|
||||
factory ComposerArguments.fromEmailAddress(EmailAddress emailAddress) =>
|
||||
ComposerArguments(
|
||||
emailActionType: EmailActionType.composeFromEmailAddress,
|
||||
emailAddress: emailAddress
|
||||
);
|
||||
|
||||
factory ComposerArguments.editDraftEmail(PresentationEmail presentationEmail) =>
|
||||
ComposerArguments(
|
||||
emailActionType: EmailActionType.editDraft,
|
||||
presentationEmail: presentationEmail
|
||||
);
|
||||
|
||||
factory ComposerArguments.fromSessionStorageBrowser(ComposerCache composerCache) =>
|
||||
ComposerArguments(
|
||||
emailActionType: EmailActionType.reopenComposerBrowser,
|
||||
presentationEmail: PresentationEmail(
|
||||
id: composerCache.id,
|
||||
subject: composerCache.subject,
|
||||
from: composerCache.from,
|
||||
to: composerCache.to,
|
||||
cc: composerCache.cc,
|
||||
bcc: composerCache.bcc,
|
||||
),
|
||||
emailContents: composerCache.emailContentList.asHtmlString,
|
||||
);
|
||||
|
||||
factory ComposerArguments.replyEmail({
|
||||
required PresentationEmail presentationEmail,
|
||||
required String content,
|
||||
Role? mailboxRole,
|
||||
}) => ComposerArguments(
|
||||
emailActionType: EmailActionType.reply,
|
||||
presentationEmail: presentationEmail,
|
||||
emailContents: content,
|
||||
mailboxRole: mailboxRole
|
||||
);
|
||||
|
||||
factory ComposerArguments.replyAllEmail({
|
||||
required PresentationEmail presentationEmail,
|
||||
required String content,
|
||||
Role? mailboxRole,
|
||||
}) => ComposerArguments(
|
||||
emailActionType: EmailActionType.replyAll,
|
||||
presentationEmail: presentationEmail,
|
||||
emailContents: content,
|
||||
mailboxRole: mailboxRole
|
||||
);
|
||||
|
||||
factory ComposerArguments.forwardEmail({
|
||||
required PresentationEmail presentationEmail,
|
||||
required String content,
|
||||
required List<Attachment> attachments,
|
||||
}) => ComposerArguments(
|
||||
emailActionType: EmailActionType.forward,
|
||||
presentationEmail: presentationEmail,
|
||||
emailContents: content,
|
||||
attachments: attachments,
|
||||
mailboxRole: presentationEmail.mailboxContain?.role
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
emailActionType,
|
||||
|
||||
@@ -3,22 +3,19 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/email/attachment.dart';
|
||||
|
||||
class EmailLoaded with EquatableMixin {
|
||||
final String originalContent;
|
||||
final String displayedContent;
|
||||
final String htmlContent;
|
||||
final List<Attachment> attachments;
|
||||
final Email? emailCurrent;
|
||||
|
||||
EmailLoaded({
|
||||
required this.originalContent,
|
||||
required this.displayedContent,
|
||||
required this.htmlContent,
|
||||
required this.attachments,
|
||||
this.emailCurrent,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
originalContent,
|
||||
displayedContent,
|
||||
htmlContent,
|
||||
attachments,
|
||||
emailCurrent
|
||||
];
|
||||
|
||||
@@ -9,7 +9,10 @@ import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/extensions/presentation_email_extension.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
|
||||
typedef OnPressEmailActionClick = void Function(EmailActionType emailActionType);
|
||||
typedef OnPressEmailActionClick = void Function(
|
||||
EmailActionType emailActionType,
|
||||
PresentationEmail presentationEmail
|
||||
);
|
||||
|
||||
class BottomBarMailWidgetBuilder extends StatelessWidget {
|
||||
|
||||
@@ -60,7 +63,7 @@ class BottomBarMailWidgetBuilder extends StatelessWidget {
|
||||
color: AppColor.colorTextButton
|
||||
),
|
||||
verticalDirection: responsiveUtils.isPortraitMobile(context),
|
||||
onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.replyAll),
|
||||
onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.replyAll, _presentationEmail),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
@@ -79,7 +82,7 @@ class BottomBarMailWidgetBuilder extends StatelessWidget {
|
||||
color: AppColor.colorTextButton
|
||||
),
|
||||
verticalDirection: responsiveUtils.isPortraitMobile(context),
|
||||
onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.reply),
|
||||
onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.reply, _presentationEmail),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
@@ -98,7 +101,7 @@ class BottomBarMailWidgetBuilder extends StatelessWidget {
|
||||
color: AppColor.colorTextButton
|
||||
),
|
||||
verticalDirection: responsiveUtils.isPortraitMobile(context),
|
||||
onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.forward),
|
||||
onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.forward, _presentationEmail),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
@@ -117,7 +120,7 @@ class BottomBarMailWidgetBuilder extends StatelessWidget {
|
||||
color: AppColor.colorTextButton
|
||||
),
|
||||
verticalDirection: responsiveUtils.isPortraitMobile(context),
|
||||
onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.compose),
|
||||
onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.compose, _presentationEmail),
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user