TF-3416 Implement preview EML attachment

This commit is contained in:
dab246
2025-01-13 10:02:50 +07:00
committed by Dat H. Pham
parent 7cbdfddb6d
commit d304083b2e
54 changed files with 1489 additions and 148 deletions
@@ -7,12 +7,14 @@ import 'package:core/utils/application_manager.dart';
import 'package:core/utils/config/app_config_loader.dart';
import 'package:core/utils/file_utils.dart';
import 'package:core/utils/platform_info.dart';
import 'package:core/utils/preview_eml_file_utils.dart';
import 'package:core/utils/print_utils.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart';
import 'package:tmail_ui_user/features/caching/utils/local_storage_manager.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/utils/sending_queue_isolate_manager.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
@@ -72,6 +74,7 @@ class CoreBindings extends Bindings {
if (PlatformInfo.isIOS) {
Get.put(IOSNotificationManager());
}
Get.put(PreviewEmlFileUtils());
}
void _bindingIsolate() {
@@ -88,5 +91,6 @@ class CoreBindings extends Bindings {
accessibility: KeychainAccessibility.first_unlock_this_device
)
));
Get.put(LocalStorageManager());
}
}
@@ -4294,4 +4294,17 @@ class AppLocalizations {
);
}
String get parseEmailByBlobIdFailed {
return Intl.message(
'Cannot parse email by blob id',
name: 'parseEmailByBlobIdFailed',
);
}
String get previewEmailFromEMLFileFailed {
return Intl.message(
'Cannot preview this eml file',
name: 'previewEmailFromEMLFileFailed',
);
}
}
+10
View File
@@ -8,6 +8,7 @@ import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart'
import 'package:tmail_ui_user/features/contact/presentation/contact_bindings.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_bindings.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_view.dart' deferred as destination_picker;
import 'package:tmail_ui_user/features/email_previewer/email_previewer_bindings.dart';
import 'package:tmail_ui_user/features/email_recovery/presentation/email_recovery_bindings.dart';
import 'package:tmail_ui_user/features/home/presentation/home_bindings.dart';
import 'package:tmail_ui_user/features/home/presentation/home_view.dart';
@@ -36,6 +37,7 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_view.dart' deferred as search_mailbox_view;
import 'package:tmail_ui_user/features/mailto/presentation/mailto_url_view.dart' deferred as mailto_url_view;
import 'package:tmail_ui_user/features/email_recovery/presentation/email_recovery_view.dart' deferred as email_recovery;
import 'package:tmail_ui_user/features/email_previewer/email_previewer_view.dart' deferred as email_previewer_view;
class AppPages {
static final pages = [
@@ -82,6 +84,14 @@ class AppPages {
contact_view.loadLibrary,
() => contact_view.ContactView()),
binding: ContactBindings()),
GetPage(
name: AppRoutes.emailEMLPreviewer,
page: () => DeferredWidget(
email_previewer_view.loadLibrary,
() => email_previewer_view.EmailPreviewerView(),
),
binding: EmailPreviewerBindings(),
),
unknownRoutePage,
if (PlatformInfo.isMobile)
...[
+1
View File
@@ -16,4 +16,5 @@ abstract class AppRoutes {
static const searchMailbox = '/search_mailbox';
static const mailtoURL = '/mailto';
static const emailRecovery = '/email_recovery';
static const emailEMLPreviewer = '/mail/eml/preview';
}
+17 -1
View File
@@ -83,12 +83,22 @@ abstract class RouteUtils {
return servicePath;
}
static ServicePath _createEmailEMLPreviewerServicePath(String route, {String? previewId}) {
ServicePath servicePath = ServicePath(route);
if (previewId?.trim().isNotEmpty == true) {
servicePath = servicePath.withQueryParameters([
StringQueryParameter(paramID, previewId!)
]);
}
return servicePath;
}
static ServicePath _createServicePath(String route) {
ServicePath servicePath = ServicePath(route);
return servicePath;
}
static Uri createUrlWebLocationBar(String route, {NavigationRouter? router}) {
static Uri createUrlWebLocationBar(String route, {NavigationRouter? router, String? previewId}) {
if (route == AppRoutes.dashboard) {
final servicePath = _createDashboardServicePath(
'$baseOriginUrl$route',
@@ -98,6 +108,12 @@ abstract class RouteUtils {
} else if (route == AppRoutes.settings) {
final servicePath = _createSettingServicePath('$baseOriginUrl$route', router: router);
return Uri.parse(servicePath.path);
} else if (route == AppRoutes.emailEMLPreviewer) {
final servicePath = _createEmailEMLPreviewerServicePath(
'$baseOriginUrl$route',
previewId: previewId,
);
return Uri.parse(servicePath.path);
} else {
final servicePath = _createServicePath('$baseOriginUrl$route');
return Uri.parse(servicePath.path);
+6
View File
@@ -5,6 +5,8 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:model/email/email_action_type.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/state/parse_email_by_blob_id_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/preview_email_from_eml_file_state.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart';
@@ -84,6 +86,10 @@ class ToastManager {
} else {
message = AppLocalizations.of(currentContext!).createTwakeIdFailed;
}
} else if (failure is ParseEmailByBlobIdFailure) {
message = AppLocalizations.of(currentContext!).parseEmailByBlobIdFailed;
} else if (failure is PreviewEmailFromEmlFileFailure) {
message = AppLocalizations.of(currentContext!).previewEmailFromEMLFileFailed;
}
if (message?.isNotEmpty == true) {