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 ffdc52ca8..9e077ff5f 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
@@ -294,7 +294,7 @@ class _HtmlContentViewerOnWebState extends State {
Widget build(BuildContext context) {
return LayoutBuilder(builder: (context, constraint) {
minHeight = math.max(constraint.maxHeight, minHeight);
- return Stack(
+ final child = Stack(
children: [
if (_htmlData?.isNotEmpty == false)
const SizedBox.shrink()
@@ -332,6 +332,13 @@ class _HtmlContentViewerOnWebState extends State {
)
],
);
+
+ if (!widget.keepWidthWhileLoading) return child;
+
+ return SizedBox(
+ width: _actualWidth,
+ child: child,
+ );
});
}
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 dbf837445..366a80c06 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
@@ -25,6 +25,7 @@ class HtmlContentViewer extends StatefulWidget {
final String contentHtml;
final double? initialWidth;
final TextDirection? direction;
+ final bool keepWidthWhileLoading;
final OnLoadWidthHtmlViewerAction? onLoadWidthHtmlViewer;
final OnMailtoDelegateAction? onMailtoDelegateAction;
@@ -37,6 +38,7 @@ class HtmlContentViewer extends StatefulWidget {
required this.contentHtml,
this.initialWidth,
this.direction,
+ this.keepWidthWhileLoading = false,
this.onLoadWidthHtmlViewer,
this.onMailtoDelegateAction,
this.onScrollHorizontalEnd,
@@ -109,7 +111,7 @@ class _HtmlContentViewState extends State {
@override
Widget build(BuildContext context) {
- return Stack(children: [
+ final child = Stack(children: [
if (_htmlData == null)
const SizedBox.shrink()
else
@@ -138,6 +140,12 @@ class _HtmlContentViewState extends State {
}
),
]);
+
+ if (!widget.keepWidthWhileLoading) return child;
+ return SizedBox(
+ width: widget.initialWidth,
+ child: child,
+ );
}
void _onWebViewCreated(InAppWebViewController controller) async {
diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart
index 04cf1a94d..5d8f03c94 100644
--- a/lib/features/email/presentation/controller/single_email_controller.dart
+++ b/lib/features/email/presentation/controller/single_email_controller.dart
@@ -276,7 +276,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
htmlContent: success.sanitizedHtmlContent,
mailToClicked: openMailToLink,
downloadAttachmentClicked: () {
- downloadAttachmentForWeb(success.attachment);
+ if (currentContext == null || attachments.isEmpty) return;
+ handleDownloadAttachmentAction(currentContext!, success.attachment);
},
responsiveUtils: responsiveUtils,
));
diff --git a/lib/features/email/presentation/widgets/html_attachment_previewer.dart b/lib/features/email/presentation/widgets/html_attachment_previewer.dart
index 720df144f..d8c17e874 100644
--- a/lib/features/email/presentation/widgets/html_attachment_previewer.dart
+++ b/lib/features/email/presentation/widgets/html_attachment_previewer.dart
@@ -1,14 +1,16 @@
-
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
+import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart';
+import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
+import 'package:tmail_ui_user/features/base/isolate/background_isolate_binary_messenger/background_isolate_binary_messenger_mobile.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/pdf_viewer/top_bar_attachment_viewer.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
-class HtmlAttachmentPreviewer extends StatelessWidget {
+class HtmlAttachmentPreviewer extends StatefulWidget {
const HtmlAttachmentPreviewer({
super.key,
required this.htmlContent,
@@ -24,46 +26,61 @@ class HtmlAttachmentPreviewer extends StatelessWidget {
final VoidCallback downloadAttachmentClicked;
final ResponsiveUtils responsiveUtils;
+ @override
+ State createState() => _HtmlAttachmentPreviewerState();
+}
+
+class _HtmlAttachmentPreviewerState extends State {
+ final focusNode = FocusNode();
+
static const double _verticalMargin = 16;
+ @override
+ void dispose() {
+ focusNode.dispose();
+ super.dispose();
+ }
+
@override
Widget build(BuildContext context) {
- return Column(
+ final child = Column(
children: [
TopBarAttachmentViewer(
- title: title,
+ title: widget.title,
closeAction: popBack,
- downloadAction: downloadAttachmentClicked,
+ downloadAction: widget.downloadAttachmentClicked,
),
Expanded(
child: LayoutBuilder(
builder: (context, constraints) {
- return SingleChildScrollView(
- child: GestureDetector(
- onTap: popBack,
- child: PointerInterceptor(
- child: ColoredBox(
- color: Colors.transparent,
- child: Center(
- child: Container(
- margin: const EdgeInsets.symmetric(vertical: _verticalMargin),
- color: Colors.white,
- child: ResponsiveWidget(
- responsiveUtils: responsiveUtils,
- desktop: _buildHtmlViewerWith(
- context,
- width: constraints.maxWidth * 0.8,
- height: constraints.maxHeight - _verticalMargin * 2
- ),
- tablet: _buildHtmlViewerWith(
- context,
- width: constraints.maxWidth * 0.8,
- height: constraints.maxHeight - _verticalMargin * 2
- ),
- mobile: _buildHtmlViewerWith(
- context,
- width: constraints.maxWidth,
- height: constraints.maxHeight - _verticalMargin * 2
+ return Center(
+ child: SingleChildScrollView(
+ child: GestureDetector(
+ onTap: popBack,
+ child: PointerInterceptor(
+ child: ColoredBox(
+ color: Colors.transparent,
+ child: Center(
+ child: Container(
+ margin: const EdgeInsets.symmetric(vertical: _verticalMargin),
+ color: Colors.white,
+ child: ResponsiveWidget(
+ responsiveUtils: widget.responsiveUtils,
+ desktop: _buildHtmlViewerWith(
+ context,
+ width: constraints.maxWidth * 0.8,
+ height: constraints.maxHeight - _verticalMargin * 2
+ ),
+ tablet: _buildHtmlViewerWith(
+ context,
+ width: constraints.maxWidth * 0.8,
+ height: constraints.maxHeight - _verticalMargin * 2
+ ),
+ mobile: _buildHtmlViewerWith(
+ context,
+ width: constraints.maxWidth,
+ height: constraints.maxHeight - _verticalMargin * 2
+ ),
),
),
),
@@ -77,23 +94,46 @@ class HtmlAttachmentPreviewer extends StatelessWidget {
),
],
);
+
+ if (PlatformInfo.isMobile) return child;
+
+ return KeyboardListener(
+ focusNode: focusNode,
+ onKeyEvent: (event) {
+ if (!mounted) return;
+ if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.escape) {
+ popBack();
+ }
+ },
+ child: child,
+ );
}
- HtmlContentViewerOnWeb _buildHtmlViewerWith(
+ Widget _buildHtmlViewerWith(
BuildContext context, {
required double width,
required double height,
}) {
- return HtmlContentViewerOnWeb(
- contentHtml: htmlContent,
- widthContent: width,
- heightContent: height,
- direction: AppUtils.getCurrentDirection(context),
- mailtoDelegate: (uri) {
- popBack();
- mailToClicked(uri);
- },
- keepWidthWhileLoading: true,
- );
+ return PlatformInfo.isWeb
+ ? HtmlContentViewerOnWeb(
+ contentHtml: widget.htmlContent,
+ widthContent: width,
+ heightContent: height,
+ direction: AppUtils.getCurrentDirection(context),
+ mailtoDelegate: (uri) {
+ popBack();
+ widget.mailToClicked(uri);
+ },
+ keepWidthWhileLoading: true,
+ )
+ : HtmlContentViewer(
+ contentHtml: widget.htmlContent,
+ initialWidth: width,
+ direction: AppUtils.getCurrentDirection(context),
+ onMailtoDelegateAction: (uri) async {
+ widget.mailToClicked(uri);
+ },
+ keepWidthWhileLoading: true,
+ );
}
}
\ No newline at end of file