From 2fb2ab18e80d9ace0caec92ed8970f9945b374e0 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 12 Jun 2023 23:41:45 +0700 Subject: [PATCH] TF-1886 Support RTL mode for HTML display (cherry picked from commit 9ac393489e746b49073b1a2d98063481f4c894c6) --- .../utils/html_transformer/html_template.dart | 5 ++- .../html_content_viewer_on_web_widget.dart | 34 ++++++++++--------- .../html_content_viewer_widget.dart | 13 +++++-- .../email/presentation/email_view.dart | 13 ++++--- .../identities/widgets/signature_builder.dart | 11 +++--- lib/main/utils/app_utils.dart | 3 ++ 6 files changed, 50 insertions(+), 29 deletions(-) diff --git a/core/lib/presentation/utils/html_transformer/html_template.dart b/core/lib/presentation/utils/html_transformer/html_template.dart index 5b2d5bc1e..ebeeea56e 100644 --- a/core/lib/presentation/utils/html_transformer/html_template.dart +++ b/core/lib/presentation/utils/html_transformer/html_template.dart @@ -1,4 +1,6 @@ +import 'package:flutter/material.dart'; + const nameClassToolTip = 'tmail-tooltip'; const tooltipLinkCss = ''' @@ -27,6 +29,7 @@ String generateHtml(String content, { String? styleCSS, String? javaScripts, bool hideScrollBar = true, + TextDirection? direction }) { return ''' @@ -53,7 +56,7 @@ String generateHtml(String content, { ${javaScripts ?? ''} - +
$content
diff --git a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart index bcb8bde70..7c8202df2 100644 --- a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart +++ b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart @@ -16,6 +16,7 @@ class HtmlContentViewerOnWeb extends StatefulWidget { final double widthContent; final double heightContent; final HtmlViewerControllerForWeb controller; + final TextDirection? direction; /// Handler for mailto: links final Function(Uri?)? mailtoDelegate; @@ -31,6 +32,7 @@ class HtmlContentViewerOnWeb extends StatefulWidget { required this.controller, this.allowResizeToDocumentSize = true, this.mailtoDelegate, + this.direction, }) : super(key: key); @override @@ -65,7 +67,9 @@ class _HtmlContentViewerOnWebState extends State { @override void didUpdateWidget(covariant HtmlContentViewerOnWeb oldWidget) { super.didUpdateWidget(oldWidget); - if (widget.contentHtml != oldWidget.contentHtml) { + log('_HtmlContentViewerOnWebState::didUpdateWidget():Old-Direction: ${oldWidget.direction} | Current-Direction: ${widget.direction}'); + if (widget.contentHtml != oldWidget.contentHtml || + widget.direction != oldWidget.direction) { createdViewId = _getRandString(10); widget.controller.viewId = createdViewId; _setUpWeb(); @@ -167,7 +171,8 @@ class _HtmlContentViewerOnWebState extends State { minHeight: minHeight, minWidth: minWidth, styleCSS: tooltipLinkCss, - javaScripts: webViewActionScripts + scriptsDisableZoom); + javaScripts: webViewActionScripts + scriptsDisableZoom, + direction: widget.direction); return htmlTemplate; } @@ -276,21 +281,18 @@ class _HtmlContentViewerOnWebState extends State { return Container(); } - return Directionality( - textDirection: TextDirection.ltr, - child: FutureBuilder( - future: webInit, - builder: (context, snapshot) { - if (snapshot.hasData) { - return HtmlElementView( - key: ValueKey(htmlData), - viewType: createdViewId, - ); - } else { - return Container(); - } + return FutureBuilder( + future: webInit, + builder: (context, snapshot) { + if (snapshot.hasData) { + return HtmlElementView( + key: ValueKey(htmlData), + viewType: createdViewId, + ); + } else { + return Container(); } - ) + } ); } } \ No newline at end of file diff --git a/core/lib/presentation/views/html_viewer/html_content_viewer_widget.dart b/core/lib/presentation/views/html_viewer/html_content_viewer_widget.dart index 15e07e8f9..509a859a3 100644 --- a/core/lib/presentation/views/html_viewer/html_content_viewer_widget.dart +++ b/core/lib/presentation/views/html_viewer/html_content_viewer_widget.dart @@ -22,6 +22,7 @@ class HtmlContentViewer extends StatefulWidget { final double heightContent; final OnScrollHorizontalEnd? onScrollHorizontalEnd; final OnWebViewLoaded? onWebViewLoaded; + final TextDirection? direction; /// Register this callback if you want a reference to the [InAppWebViewController]. final void Function(InAppWebViewController controller)? onCreated; @@ -43,6 +44,7 @@ class HtmlContentViewer extends StatefulWidget { this.onScrollHorizontalEnd, this.urlLauncherDelegate, this.mailtoDelegate, + this.direction, }) : super(key: key); @override @@ -63,14 +65,19 @@ class _HtmlContentViewState extends State { void initState() { super.initState(); actualHeight = widget.heightContent; - _htmlData = generateHtml(widget.contentHtml); + _htmlData = generateHtml(widget.contentHtml, direction: widget.direction); } @override void didUpdateWidget(covariant HtmlContentViewer oldWidget) { super.didUpdateWidget(oldWidget); - if (widget.contentHtml != oldWidget.contentHtml) { - _htmlData = generateHtml(widget.contentHtml); + log('_HtmlContentViewState::didUpdateWidget():Old-Direction: ${oldWidget.direction} | Current-Direction: ${widget.direction}'); + if (widget.contentHtml != oldWidget.contentHtml || + widget.direction != oldWidget.direction) { + _htmlData = generateHtml( + widget.contentHtml, + direction: widget.direction + ); } } diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 3118abc0e..49d40c857 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -447,11 +447,13 @@ class EmailView extends GetWidget { if (BuildUtils.isWeb) { return HtmlContentViewerOnWeb( - widthContent: constraints.maxWidth, - heightContent: responsiveUtils.getSizeScreenHeight(context), - contentHtml: allEmailContents ?? "", - controller: HtmlViewerControllerForWeb(), - mailtoDelegate: (uri) => controller.openMailToLink(uri)); + widthContent: constraints.maxWidth, + heightContent: responsiveUtils.getSizeScreenHeight(context), + contentHtml: allEmailContents ?? "", + controller: HtmlViewerControllerForWeb(), + mailtoDelegate: (uri) => controller.openMailToLink(uri), + direction: AppUtils.getCurrentDirection(context), + ); } else { return HtmlContentViewer( heightContent: responsiveUtils.getSizeScreenHeight(context), @@ -462,6 +464,7 @@ class EmailView extends GetWidget { log('EmailView::_buildEmailContent(): isScrollPageViewActivated: $isScrollPageViewActivated'); controller.emailSupervisorController.updateScrollPhysicPageView(isScrollPageViewActivated: isScrollPageViewActivated); }, + direction: AppUtils.getCurrentDirection(context), ); } } else { diff --git a/lib/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart b/lib/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart index 8f7a275ce..20f932903 100644 --- a/lib/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart +++ b/lib/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart @@ -3,6 +3,7 @@ import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.d import 'package:core/presentation/views/html_viewer/html_viewer_controller_for_web.dart'; import 'package:core/utils/build_utils.dart'; import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class SignatureBuilder extends StatelessWidget { @@ -27,13 +28,13 @@ class SignatureBuilder extends StatelessWidget { width: signatureWidth, color: Colors.white, padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 16.0), - child: _buildSignature(signatureWidth, signatureHeight), + child: _buildSignature(context, signatureWidth, signatureHeight), ); } ); } - Widget _buildSignature(double width, double height) { + Widget _buildSignature(BuildContext context, double width, double height) { if (signatureSelected.isNotEmpty) { if (BuildUtils.isWeb) { return HtmlContentViewerOnWeb( @@ -41,12 +42,14 @@ class SignatureBuilder extends StatelessWidget { widthContent: width, heightContent: height, controller: HtmlViewerControllerForWeb(), - allowResizeToDocumentSize: false + allowResizeToDocumentSize: false, + direction: AppUtils.getCurrentDirection(context), ); } else { return HtmlContentViewer( contentHtml: signatureSelected, - heightContent: height + heightContent: height, + direction: AppUtils.getCurrentDirection(context), ); } } else { diff --git a/lib/main/utils/app_utils.dart b/lib/main/utils/app_utils.dart index 6f7a7d592..f554a1718 100644 --- a/lib/main/utils/app_utils.dart +++ b/lib/main/utils/app_utils.dart @@ -33,6 +33,9 @@ class AppUtils { return intl.Bidi.isRtlLanguage(Localizations.localeOf(context).languageCode); } + static TextDirection getCurrentDirection(BuildContext context) => + isDirectionRTL(context) ? TextDirection.rtl : TextDirection.ltr; + static bool isEmailLocalhost(String email) { return RegExp(r'^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@localhost$').hasMatch(email); }