TF-3601 Fix preview EML file with long content in iOS

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-03-31 03:45:05 +07:00
committed by Dat H. Pham
parent d01618c32e
commit 1c97c8a189
3 changed files with 203 additions and 15 deletions
@@ -0,0 +1,102 @@
import 'dart:async';
import 'package:core/data/constants/constant.dart';
import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.dart';
import 'package:core/utils/html/html_interaction.dart';
import 'package:core/utils/html/html_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:url_launcher/url_launcher.dart' as launcher;
import 'package:url_launcher/url_launcher_string.dart';
class IosHtmlContentViewerWidget extends StatefulWidget {
final String contentHtml;
final TextDirection? direction;
final bool useDefaultFont;
final OnMailtoDelegateAction? onMailtoDelegateAction;
final OnPreviewEMLDelegateAction? onPreviewEMLDelegateAction;
final OnDownloadAttachmentDelegateAction? onDownloadAttachmentDelegateAction;
const IosHtmlContentViewerWidget({
Key? key,
required this.contentHtml,
this.direction,
this.useDefaultFont = false,
this.onMailtoDelegateAction,
this.onPreviewEMLDelegateAction,
this.onDownloadAttachmentDelegateAction,
}) : super(key: key);
@override
State<StatefulWidget> createState() => _IosHtmlContentViewerWidgetState();
}
class _IosHtmlContentViewerWidgetState extends State<IosHtmlContentViewerWidget> {
@override
Widget build(BuildContext context) {
return InAppWebView(
initialSettings: InAppWebViewSettings(transparentBackground: true),
onWebViewCreated: _onWebViewCreated,
shouldOverrideUrlLoading: _shouldOverrideUrlLoading,
gestureRecognizers: {
Factory<LongPressGestureRecognizer>(() => LongPressGestureRecognizer()),
},
);
}
Future<void> _onWebViewCreated(InAppWebViewController controller) async {
await controller.loadData(data: HtmlUtils.generateHtmlDocument(
content: widget.contentHtml,
direction: widget.direction,
javaScripts: HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage,
useDefaultFont: widget.useDefaultFont,
));
}
Future<NavigationActionPolicy?> _shouldOverrideUrlLoading(
InAppWebViewController controller,
NavigationAction navigationAction
) async {
final url = navigationAction.request.url?.toString();
if (url == null) {
return NavigationActionPolicy.CANCEL;
}
if (navigationAction.isForMainFrame && url == 'about:blank') {
return NavigationActionPolicy.ALLOW;
}
final requestUri = Uri.parse(url);
if (widget.onMailtoDelegateAction != null &&
requestUri.isScheme(Constant.mailtoScheme)) {
await widget.onMailtoDelegateAction?.call(requestUri);
return NavigationActionPolicy.CANCEL;
}
if (widget.onPreviewEMLDelegateAction != null &&
requestUri.isScheme(Constant.emlPreviewerScheme)) {
await widget.onPreviewEMLDelegateAction?.call(requestUri);
return NavigationActionPolicy.CANCEL;
}
if (widget.onDownloadAttachmentDelegateAction != null &&
requestUri.isScheme(Constant.attachmentScheme)) {
await widget.onDownloadAttachmentDelegateAction?.call(requestUri);
return NavigationActionPolicy.CANCEL;
}
if (await launcher.canLaunchUrl(Uri.parse(url))) {
await launcher.launchUrl(
Uri.parse(url),
mode: LaunchMode.externalApplication
);
}
return NavigationActionPolicy.CANCEL;
}
}