TF-4050 Preview and download uploaded file in composer on web

This commit is contained in:
dab246
2025-11-07 01:12:20 +07:00
committed by Dat H. Pham
parent ecd3ac0295
commit 972b20ec16
72 changed files with 2438 additions and 1751 deletions
@@ -0,0 +1,47 @@
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/email/attachment.dart';
import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/features/download/domain/model/download_source_view.dart';
import 'package:tmail_ui_user/features/download/presentation/extensions/download_attachment_download_controller_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
extension HandleDownloadAttachmentExtension on MailboxDashBoardController {
void downloadMessageAsEML({
required PresentationEmail presentationEmail,
bool showBottomDownloadProgressBar = false,
}) =>
downloadController.downloadMessageAsEML(
presentationEmail: presentationEmail,
accountId: accountId.value,
session: sessionCurrent,
showBottomDownloadProgressBar: showBottomDownloadProgressBar,
);
void downloadAttachment({
required Attachment attachment,
bool previewerSupported = false,
bool showBottomDownloadProgressBar = false,
DownloadSourceView? sourceView,
}) =>
downloadController.downloadAttachment(
attachment: attachment,
accountId: accountId.value,
session: sessionCurrent,
previewerSupported: previewerSupported,
showBottomDownloadProgressBar: showBottomDownloadProgressBar,
sourceView: sourceView,
);
void downloadAllAttachments({
required String outputFileName,
required EmailId? emailId,
bool showBottomDownloadProgressBar = false,
}) =>
downloadController.downloadAllAttachments(
outputFileName: outputFileName,
emailId: emailId,
accountId: accountId.value,
session: sessionCurrent,
showBottomDownloadProgressBar: showBottomDownloadProgressBar,
);
}
@@ -1,37 +0,0 @@
import 'package:model/email/attachment.dart';
import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
extension HandleDownloadExtension on MailboxDashBoardController {
void downloadMessageAsEML(PresentationEmail presentationEmail) {
downloadController.downloadMessageAsEML(
presentationEmail: presentationEmail,
accountId: accountId.value,
session: sessionCurrent,
);
}
void downloadAttachmentForWeb({
required Attachment attachment,
bool previewerSupported = false,
}) {
downloadController.downloadAttachmentForWeb(
attachment: attachment,
accountId: accountId.value,
session: sessionCurrent,
previewerSupported: previewerSupported,
);
}
void downloadAllAttachmentsForWeb({
required String outputFileName,
PresentationEmail? currentEmail,
}) {
downloadController.downloadAllAttachmentsForWeb(
outputFileName: outputFileName,
currentEmail: currentEmail,
accountId: accountId.value,
session: sessionCurrent,
);
}
}
@@ -2,48 +2,53 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.dart';
import 'package:core/utils/app_logger.dart';
import 'package:flutter/cupertino.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:model/email/attachment.dart';
import 'package:tmail_ui_user/features/email/presentation/mixin/preview_attachment_mixin.dart';
import 'package:tmail_ui_user/features/download/domain/model/download_source_view.dart';
import 'package:tmail_ui_user/features/download/presentation/extensions/download_attachment_download_controller_extension.dart';
import 'package:tmail_ui_user/features/download/presentation/extensions/preview_attachment_download_controller_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_item_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_download_attachment_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
extension HandlePreviewAttachmentExtension on MailboxDashBoardController {
void previewAttachmentAction({
void previewAttachment({
required BuildContext context,
required Attachment attachment,
required OnDownloadAttachmentAction onDownloadAttachment,
required OnPreviewOrDownloadAttachmentAction onPreviewOrDownloadAction,
bool isDialogLoadingVisible = false,
DownloadSourceView? sourceView,
}) =>
downloadController.previewAttachmentAction(
downloadController.previewAttachment(
context: context,
attachment: attachment,
accountId: accountId.value,
session: sessionCurrent,
ownEmailAddress: ownEmailAddress.value,
controller: downloadController,
parseEmailInteractor: downloadController.parseEmailByBlobIdInteractor,
getHtmlInteractor:
downloadController.getHtmlContentFromAttachmentInteractor,
onDownloadAttachment: onDownloadAttachment,
sourceView: sourceView,
onPreviewOrDownloadAction: onPreviewOrDownloadAction,
isDialogLoadingVisible: isDialogLoadingVisible,
);
void previewEMLFileAction({
required AppLocalizations appLocalizations,
required Id? blobId,
void previewUploadFile({
required BuildContext context,
required UploadFileState uploadFile,
required OnPreviewOrDownloadAttachmentAction onPreviewOrDownloadAction,
bool isDialogLoadingVisible = false,
}) =>
downloadController.previewEMLFileAction(
appLocalizations: appLocalizations,
downloadController.previewUploadFile(
context: context,
uploadFile: uploadFile,
accountId: accountId.value,
session: sessionCurrent,
ownEmailAddress: ownEmailAddress.value,
blobId: blobId,
controller: downloadController,
parseEmailByBlobIdInteractor:
downloadController.parseEmailByBlobIdInteractor,
onPreviewOrDownloadAction: onPreviewOrDownloadAction,
isDialogLoadingVisible: isDialogLoadingVisible,
);
void showDialogToPreviewEMLAttachment({
@@ -51,24 +56,32 @@ extension HandlePreviewAttachmentExtension on MailboxDashBoardController {
required EMLPreviewer emlPreviewer,
required ImagePaths imagePaths,
required OnMailtoDelegateAction onMailtoAction,
required OnDownloadAttachmentDelegateAction onDownloadAction,
required OnPreviewEMLDelegateAction onPreviewAction,
required OnDownloadAttachmentFileAction onDownloadFileAction,
}) =>
downloadController.showDialogToPreviewEMLAttachment(
context: context,
emlPreviewer: emlPreviewer,
imagePaths: imagePaths,
onMailtoAction: onMailtoAction,
onDownloadAction: onDownloadAction,
onPreviewAction: onPreviewAction,
onPreviewAction: (uri) => downloadController.openEMLPreviewer(
appLocalizations: AppLocalizations.of(context),
uri: uri,
accountId: accountId.value,
session: sessionCurrent,
ownEmailAddress: ownEmailAddress.value,
),
onDownloadAction: (uri) async => downloadController.downloadAttachmentInEMLPreview(
uri: uri,
onDownloadAction: (attachment) => downloadAttachment(
attachment: attachment,
)
),
);
Future<void> openMailToLink(Uri? uri) async {
if (uri == null) return;
void openComposerFromMailToLink(Uri uri) {
final navigationRouter = RouteUtils.generateNavigationRouterFromMailtoLink(
uri.toString(),
);
log('$runtimeType::openMailToLink(): ${uri.toString()}');
log('$runtimeType::openComposerFromMailToLink(): ${uri.toString()}');
if (!RouteUtils.canOpenComposerFromNavigationRouter(navigationRouter)) {
return;
}