TF-3416 Handle open EML attachment in EML previewer on mobile

This commit is contained in:
dab246
2025-01-14 02:02:58 +07:00
committed by Dat H. Pham
parent 94e347f703
commit 27f64d97a8
5 changed files with 83 additions and 38 deletions
@@ -452,11 +452,8 @@ class EmailDataSourceImpl extends EmailDataSource {
final iconBase64Data = await _fileUtils.convertImageAssetToBase64(
attachment.getIcon(_imagePaths));
final link = attachment.isEMLFile && PlatformInfo.isWeb
? RouteUtils.createUrlWebLocationBar(
AppRoutes.emailEMLPreviewer,
previewId: attachment.blobId?.value,
).toString()
final link = attachment.isEMLFile
? _generateEMLAttachmentLink(attachment.blobId?.value)
: null;
final previewAttachment = PreviewAttachment(
@@ -501,6 +498,21 @@ class EmailDataSourceImpl extends EmailDataSource {
}).catchError(_exceptionThrower.throwException);
}
String _generateEMLAttachmentLink(String? blobId) {
if (blobId == null) return '';
if (PlatformInfo.isWeb) {
return RouteUtils.createUrlWebLocationBar(
AppRoutes.emailEMLPreviewer,
previewId: blobId,
).toString();
} else if (PlatformInfo.isMobile) {
return '${PreviewEmlFileUtils.emlPreviewerScheme}://$blobId';
} else {
return '';
}
}
Future<String> _transformEmailContent(
List<EmailContent> emailContents,
Map<String, String> mapCidImageDownloadUrl,
@@ -93,6 +93,7 @@ import 'package:tmail_ui_user/features/email/presentation/model/blob_calendar_ev
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
import 'package:tmail_ui_user/features/email/presentation/model/email_unsubscribe.dart';
import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart';
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_list/attachment_list_bottom_sheet_builder.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_list/attachment_list_dialog_builder.dart';
@@ -1919,7 +1920,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if (PlatformInfo.isWeb && PlatformInfo.isCanvasKit && attachment.isPDFFile) {
previewPDFFileAction(context, attachment);
} else if (attachment.isEMLFile) {
previewEMLFileAction(attachment, AppLocalizations.of(context));
previewEMLFileAction(attachment.blobId, AppLocalizations.of(context));
} else {
handleDownloadAttachmentAction(context, attachment);
}
@@ -1952,7 +1953,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
);
}
void previewEMLFileAction(Attachment attachment, AppLocalizations appLocalizations) {
void previewEMLFileAction(Id? blobId, AppLocalizations appLocalizations) {
SmartDialog.showLoading(
msg: appLocalizations.loadingPleaseWait,
maskColor: Colors.black38,
@@ -1963,15 +1964,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
return;
}
if (attachment.blobId == null) {
if (blobId == null) {
consumeState(Stream.value(Left(ParseEmailByBlobIdFailure(NotFoundBlobIdException([])))));
return;
}
consumeState(_parseEmailByBlobIdInteractor.execute(
accountId!,
attachment.blobId!,
));
consumeState(_parseEmailByBlobIdInteractor.execute(accountId!, blobId));
}
void _handleParseEmailByBlobIdSuccess(ParseEmailByBlobIdSuccess success) {
@@ -2033,30 +2031,51 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
return;
}
showModalBottomSheet(
context: currentContext!,
showDragHandle: true,
useSafeArea: true,
isScrollControlled: true,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20.0),
topRight: Radius.circular(20.0),
),
),
builder: (_) {
return DraggableScrollableSheet(
initialChildSize: 1.0,
builder: (__, ___) => EmailPreviewerDialogView(
emlPreviewer: success.emlPreviewer,
onMailtoDelegateAction: openMailToLink,
)
);
},
);
showModalSheetToPreviewEMLAttachment(
currentContext!,
success.emlPreviewer);
}
}
void showModalSheetToPreviewEMLAttachment(
BuildContext context,
EMLPreviewer emlPreviewer,
) {
showModalBottomSheet(
context: context,
showDragHandle: true,
useSafeArea: true,
isScrollControlled: true,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20.0),
topRight: Radius.circular(20.0),
),
),
builder: (_) {
return DraggableScrollableSheet(
initialChildSize: 1.0,
builder: (context, ___) => EmailPreviewerDialogView(
emlPreviewer: emlPreviewer,
onMailtoDelegateAction: openMailToLink,
onPreviewEMLDelegateAction: (uri) => _openEMLPreviewer(context, uri),
),
);
},
);
}
Future<void> _openEMLPreviewer(BuildContext context, Uri? uri) async {
log('SingleEmailController::_openEMLPreviewer:uri = $uri');
if (uri == null) return;
final blobId = uri.authority;
log('SingleEmailController::_openEMLPreviewer:blobId = $blobId');
if (blobId.isEmpty) return;
previewEMLFileAction(Id(blobId), AppLocalizations.of(context));
}
void handleMailToAttendees(CalendarOrganizer? organizer, List<CalendarAttendee>? attendees) {
final listEmailAddressAttendees = attendees
?.map((attendee) => EmailAddress(attendee.name?.name, attendee.mailto?.mailAddress.value))
@@ -9,11 +9,13 @@ class EmailPreviewerDialogView extends StatelessWidget {
final EMLPreviewer emlPreviewer;
final OnMailtoDelegateAction onMailtoDelegateAction;
final OnPreviewEMLDelegateAction onPreviewEMLDelegateAction;
const EmailPreviewerDialogView({
super.key,
required this.emlPreviewer,
required this.onMailtoDelegateAction,
required this.onPreviewEMLDelegateAction,
});
@override
@@ -26,6 +28,7 @@ class EmailPreviewerDialogView extends StatelessWidget {
initialWidth: context.width,
direction: AppUtils.getCurrentDirection(context),
onMailtoDelegateAction: onMailtoDelegateAction,
onPreviewEMLDelegateAction: onPreviewEMLDelegateAction,
),
),
);