@@ -3,13 +3,21 @@ import 'dart:async';
3
3
import 'dart:convert' ;
4
4
import 'dart:typed_data' ;
5
5
6
+ import 'package:core/data/model/preview_attachment.dart' ;
6
7
import 'package:core/data/network/download/downloaded_response.dart' ;
8
+ import 'package:core/domain/extensions/datetime_extension.dart' ;
9
+ import 'package:core/presentation/extensions/html_extension.dart' ;
10
+ import 'package:core/presentation/resources/image_paths.dart' ;
7
11
import 'package:core/presentation/state/failure.dart' ;
8
12
import 'package:core/presentation/state/success.dart' ;
13
+ import 'package:core/utils/file_utils.dart' ;
14
+ import 'package:core/utils/preview_eml_file_utils.dart' ;
9
15
import 'package:dartz/dartz.dart' ;
10
16
import 'package:dio/dio.dart' ;
11
17
import 'package:email_recovery/email_recovery/email_recovery_action.dart' ;
12
18
import 'package:email_recovery/email_recovery/email_recovery_action_id.dart' ;
19
+ import 'package:filesize/filesize.dart' ;
20
+ import 'package:get/get.dart' ;
13
21
import 'package:jmap_dart_client/jmap/account_id.dart' ;
14
22
import 'package:jmap_dart_client/jmap/core/error/set_error.dart' ;
15
23
import 'package:jmap_dart_client/jmap/core/id.dart' ;
@@ -22,6 +30,8 @@ import 'package:model/download/download_task_id.dart';
22
30
import 'package:model/email/attachment.dart' ;
23
31
import 'package:model/email/mark_star_action.dart' ;
24
32
import 'package:model/email/read_actions.dart' ;
33
+ import 'package:model/extensions/list_email_address_extension.dart' ;
34
+ import 'package:model/extensions/presentation_email_extension.dart' ;
25
35
import 'package:tmail_ui_user/features/caching/utils/local_storage_manager.dart' ;
26
36
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart' ;
27
37
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart' ;
@@ -30,6 +40,8 @@ import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
30
40
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart' ;
31
41
import 'package:tmail_ui_user/features/email/domain/model/preview_email_eml_request.dart' ;
32
42
import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart' ;
43
+ import 'package:tmail_ui_user/features/email/domain/model/view_entire_message_request.dart' ;
44
+ import 'package:tmail_ui_user/features/email/presentation/extensions/attachment_extension.dart' ;
33
45
import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart' ;
34
46
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart' ;
35
47
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart' ;
@@ -38,10 +50,14 @@ import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
38
50
class EmailLocalStorageDataSourceImpl extends EmailDataSource {
39
51
40
52
final LocalStorageManager _localStorageManager;
53
+ final PreviewEmlFileUtils _previewEmlFileUtils;
41
54
final ExceptionThrower _exceptionThrower;
55
+ final ImagePaths _imagePaths = Get .find <ImagePaths >();
56
+ final FileUtils _fileUtils = Get .find <FileUtils >();
42
57
43
58
EmailLocalStorageDataSourceImpl (
44
59
this ._localStorageManager,
60
+ this ._previewEmlFileUtils,
45
61
this ._exceptionThrower,
46
62
);
47
63
@@ -273,4 +289,76 @@ class EmailLocalStorageDataSourceImpl extends EmailDataSource {
273
289
Future <DownloadedResponse > exportAllAttachments (AccountId accountId, EmailId emailId, String baseDownloadAllUrl, String outputFileName, AccountRequest accountRequest, {CancelToken ? cancelToken}) {
274
290
throw UnimplementedError ();
275
291
}
292
+
293
+ @override
294
+ Future <String > generateEntireMessageAsDocument (ViewEntireMessageRequest entireMessageRequest) {
295
+ return Future .sync (() async {
296
+ final email = entireMessageRequest.presentationEmail;
297
+ final appLocalizations = entireMessageRequest.appLocalizations;
298
+ final locale = entireMessageRequest.locale.toLanguageTag ();
299
+ final listAttachments = entireMessageRequest.attachments;
300
+ final emailContentEscaped = entireMessageRequest.emailContent;
301
+
302
+ final sender = email.from? .isNotEmpty == true
303
+ ? email.from! .first
304
+ : null ;
305
+
306
+ final receiveTime = email.getReceivedAt (
307
+ locale,
308
+ pattern: email.receivedAt? .value.toLocal ().toPatternForPrinting (locale)
309
+ );
310
+
311
+ final sentTime = email.getSentAt (
312
+ locale,
313
+ pattern: email.sentAt? .value.toLocal ().toPatternForPrinting (locale)
314
+ );
315
+
316
+ final List <PreviewAttachment > listPreviewAttachment = [];
317
+
318
+ if (listAttachments.isNotEmpty) {
319
+ await Future .forEach <Attachment >(listAttachments, (attachment) async {
320
+ final iconBase64Data = await _fileUtils.convertImageAssetToBase64 (
321
+ attachment.getIcon (_imagePaths));
322
+
323
+ final previewAttachment = PreviewAttachment (
324
+ iconBase64Data: iconBase64Data,
325
+ name: attachment.name.escapeLtGtHtmlString (),
326
+ size: filesize (attachment.size? .value),
327
+ link: attachment.hyperLink,
328
+ );
329
+
330
+ listPreviewAttachment.add (previewAttachment);
331
+ });
332
+ }
333
+
334
+ final attachmentIconBase64Data = email.hasAttachment == true
335
+ ? await _fileUtils.convertImageAssetToBase64 (_imagePaths.icAttachment)
336
+ : '' ;
337
+
338
+ final htmlDocument = _previewEmlFileUtils.generatePreviewEml (
339
+ appName: appLocalizations.app_name,
340
+ userName: entireMessageRequest.userName.value,
341
+ subjectPrefix: appLocalizations.subject,
342
+ subject: email.subject? .escapeLtGtHtmlString () ?? '' ,
343
+ emailContent: emailContentEscaped,
344
+ senderName: sender? .name.escapeLtGtHtmlString () ?? '' ,
345
+ senderEmailAddress: sender? .email ?? '' ,
346
+ dateTime: receiveTime.isNotEmpty ? receiveTime : sentTime,
347
+ fromPrefix: appLocalizations.from_email_address_prefix,
348
+ toPrefix: appLocalizations.to_email_address_prefix,
349
+ ccPrefix: appLocalizations.cc_email_address_prefix,
350
+ bccPrefix: appLocalizations.bcc_email_address_prefix,
351
+ replyToPrefix: appLocalizations.replyToEmailAddressPrefix,
352
+ titleAttachment: appLocalizations.attachments.toLowerCase (),
353
+ attachmentIcon: attachmentIconBase64Data,
354
+ toAddress: email.to? .listEmailAddressToString (isFullEmailAddress: true ),
355
+ ccAddress: email.cc? .listEmailAddressToString (isFullEmailAddress: true ),
356
+ bccAddress: email.bcc? .listEmailAddressToString (isFullEmailAddress: true ),
357
+ replyToAddress: email.replyTo? .listEmailAddressToString (isFullEmailAddress: true ),
358
+ listAttachment: listPreviewAttachment,
359
+ );
360
+
361
+ return htmlDocument;
362
+ }).catchError (_exceptionThrower.throwException);
363
+ }
276
364
}
0 commit comments