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