diff --git a/lib/features/composer/presentation/widgets/web/web_editor_widget.dart b/lib/features/composer/presentation/widgets/web/web_editor_widget.dart index f85878d6a..a8b28e4fc 100644 --- a/lib/features/composer/presentation/widgets/web/web_editor_widget.dart +++ b/lib/features/composer/presentation/widgets/web/web_editor_widget.dart @@ -119,6 +119,7 @@ class _WebEditorState extends State { shouldEnsureVisible: true, hint: '', darkMode: false, + cacheHTMLAssetOffline: true, initialText: widget.content, customBodyCssStyle: HtmlUtils.customCssStyleHtmlEditor( direction: widget.direction, diff --git a/lib/features/identity_creator/presentation/identity_creator_view.dart b/lib/features/identity_creator/presentation/identity_creator_view.dart index 44a982878..a41cc0623 100644 --- a/lib/features/identity_creator/presentation/identity_creator_view.dart +++ b/lib/features/identity_creator/presentation/identity_creator_view.dart @@ -504,6 +504,7 @@ class IdentityCreatorView extends GetWidget shouldEnsureVisible: true, hint: '', darkMode: false, + cacheHTMLAssetOffline: true, initialText: initContent.isEmpty ? null : initContent, disableDragAndDrop: true, spellCheck: true, diff --git a/lib/features/manage_account/presentation/vacation/vacation_view.dart b/lib/features/manage_account/presentation/vacation/vacation_view.dart index b1439a0e3..d1f68cf4f 100644 --- a/lib/features/manage_account/presentation/vacation/vacation_view.dart +++ b/lib/features/manage_account/presentation/vacation/vacation_view.dart @@ -480,6 +480,7 @@ class VacationView extends GetWidget with RichTextButtonMixi htmlEditorOptions: html_editor_browser.HtmlEditorOptions( hint: '', darkMode: false, + cacheHTMLAssetOffline: true, initialText: controller.vacationMessageHtmlText, spellCheck: true, customBodyCssStyle: HtmlUtils.customCssStyleHtmlEditor(direction: AppUtils.getCurrentDirection(context)) diff --git a/lib/main.dart b/lib/main.dart index af3d00786..bb5eb473b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,6 +16,7 @@ import 'package:tmail_ui_user/main/pages/app_pages.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart'; +import 'package:tmail_ui_user/main/utils/asset_preloader.dart'; import 'package:url_strategy/url_strategy.dart'; import 'package:worker_manager/worker_manager.dart'; @@ -33,7 +34,9 @@ Future runTmail() async { MainBindings().dependencies(), HiveCacheConfig.instance.setUp(), Executor().warmUp(log: BuildUtils.isDebugMode), - AppUtils.loadEnvFile() + AppUtils.loadEnvFile(), + if (PlatformInfo.isWeb) + AssetPreloader.preloadHtmlEditorAssets(), ]); await HiveCacheConfig.instance.initializeEncryptionKey(); diff --git a/lib/main/utils/app_config.dart b/lib/main/utils/app_config.dart index d93afa747..1e0a7b07b 100644 --- a/lib/main/utils/app_config.dart +++ b/lib/main/utils/app_config.dart @@ -7,10 +7,13 @@ import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.d import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class AppConfig { + const AppConfig._(); + static const int defaultMinInputLengthAutocomplete = 3; static const int warningAttachmentFileSizeInMegabytes = 10; static const int defaultLimitAutocomplete = 8; + static const String envFileName = 'env.file'; static const String appDashboardConfigurationPath = "configurations/app_dashboard.json"; static const String appFCMConfigurationPath = "configurations/env.fcm"; static const String iOSKeychainSharingGroupId = 'KUT463DS29.com.linagora.ios.teammail.shared'; diff --git a/lib/main/utils/app_utils.dart b/lib/main/utils/app_utils.dart index 6c329c12b..2afe30ba9 100644 --- a/lib/main/utils/app_utils.dart +++ b/lib/main/utils/app_utils.dart @@ -11,17 +11,16 @@ import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:url_launcher/url_launcher.dart'; class AppUtils { - - static const String envFileName = 'env.file'; + const AppUtils._(); static Future loadEnvFile() async { - await dotenv.load(fileName: envFileName); + await dotenv.load(fileName: AppConfig.envFileName); final mapEnvData = Map.from(dotenv.env); try { - await AppUtils.loadFcmConfigFileToEnv(currentMapEnvData: mapEnvData); + await loadFcmConfigFileToEnv(currentMapEnvData: mapEnvData); } catch (e) { logError('AppUtils::loadEnvFile:loadFcmConfigFileToEnv: Exception = $e'); - await dotenv.load(fileName: envFileName); + await dotenv.load(fileName: AppConfig.envFileName); } } diff --git a/lib/main/utils/asset_preloader.dart b/lib/main/utils/asset_preloader.dart new file mode 100644 index 000000000..e2ee5a61f --- /dev/null +++ b/lib/main/utils/asset_preloader.dart @@ -0,0 +1,23 @@ + +import 'package:core/utils/app_logger.dart'; +import 'package:html_editor_enhanced/utils/html_editor_constants.dart'; +import 'package:html_editor_enhanced/utils/html_editor_utils.dart'; + +class AssetPreloader { + const AssetPreloader._(); + + static Future preloadHtmlEditorAssets() async { + try { + await Future.wait([ + HtmlEditorUtils.loadAsset(HtmlEditorConstants.summernoteHtmlAssetPath), + HtmlEditorUtils.loadAsset(HtmlEditorConstants.jqueryAssetPath), + HtmlEditorUtils.loadAsset(HtmlEditorConstants.summernoteCSSAssetPath), + HtmlEditorUtils.loadAsset(HtmlEditorConstants.summernoteJSAssetPath), + HtmlEditorUtils.loadAsset(HtmlEditorConstants.summernoteFontEOTAssetPath), + HtmlEditorUtils.loadAsset(HtmlEditorConstants.summernoteFontTTFAssetPath), + ]); + } catch (e) { + logError('AssetPreloader::preloadHtmlEditorAssets:Exception = $e'); + } + } +} \ No newline at end of file