diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index f95a40d7d..f52900739 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -128,6 +128,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin { PresentationEmail? get currentEmail => mailboxDashBoardController.selectedEmail.value; + EmailLoaded? get currentEmailLoaded => _currentEmailLoaded; + SingleEmailController( this._getEmailContentInteractor, this._markAsEmailReadInteractor, diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 846d019cc..b18f68bc4 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -355,8 +355,11 @@ class EmailView extends GetWidget { CalendarEventDetailWidget( calendarEvent: calendarEvent, eventActions: controller.eventActions, + emailContent: controller.currentEmailLoaded?.htmlContent ?? '', + isDraggableAppActive: controller.mailboxDashBoardController.isDraggableAppActive, onOpenComposerAction: controller.openNewComposerAction, onOpenNewTabAction: controller.openNewTabAction, + onMailtoDelegateAction: controller.openMailToLink, ), ], ) diff --git a/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart index 82b3591bd..c2dba45a2 100644 --- a/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart +++ b/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart @@ -3,7 +3,11 @@ import 'package:flutter/material.dart'; class EventDescriptionDetailWidgetStyles { static const double textSize = 16; + static const double maxHeight = 200; static const double borderRadius = 16; static const double contentPadding = 16; + static const double quotedPadding = 8; + static const double webContentPadding = 4; + static const Color valueColor = Colors.black; } \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart index d99f61386..1acc6e70b 100644 --- a/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart @@ -1,4 +1,5 @@ +import 'package:core/core.dart'; import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart'; import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; @@ -6,6 +7,7 @@ import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_ev import 'package:tmail_ui_user/features/email/presentation/styles/calendar_event_detail_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_action_button_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_body_content_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart'; @@ -16,15 +18,21 @@ class CalendarEventDetailWidget extends StatelessWidget { final CalendarEvent calendarEvent; final List eventActions; + final String emailContent; final OnOpenNewTabAction? onOpenNewTabAction; final OnOpenComposerAction? onOpenComposerAction; + final bool? isDraggableAppActive; + final OnMailtoDelegateAction? onMailtoDelegateAction; const CalendarEventDetailWidget({ super.key, required this.calendarEvent, required this.eventActions, + required this.emailContent, + this.isDraggableAppActive, this.onOpenNewTabAction, this.onOpenComposerAction, + this.onMailtoDelegateAction, }); @override @@ -59,6 +67,15 @@ class CalendarEventDetailWidget extends StatelessWidget { onOpenComposerAction: onOpenComposerAction, onOpenNewTabAction: onOpenNewTabAction, ) + ) + else + Padding( + padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), + child: EventBodyContentWidget( + content: emailContent, + isDraggableAppActive: isDraggableAppActive, + onMailtoDelegateAction: onMailtoDelegateAction, + ) ), if (calendarEvent.dateTimeEventAsString.isNotEmpty) Padding( diff --git a/lib/features/email/presentation/widgets/calendar_event/event_body_content_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_body_content_widget.dart new file mode 100644 index 000000000..1c6fc6845 --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/event_body_content_widget.dart @@ -0,0 +1,88 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.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/utils/platform_info.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:pointer_interceptor/pointer_interceptor.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_description_detail_widget_styles.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; + +class EventBodyContentWidget extends StatelessWidget { + + final String content; + final bool? isDraggableAppActive; + final OnMailtoDelegateAction? onMailtoDelegateAction; + + const EventBodyContentWidget({ + super.key, + required this.content, + this.isDraggableAppActive, + this.onMailtoDelegateAction, + }); + + @override + Widget build(BuildContext context) { + final imagePath = Get.find(); + return Container( + clipBehavior: Clip.antiAlias, + decoration: const BoxDecoration( + color: AppColor.colorEventDescriptionBackground, + borderRadius: BorderRadius.all(Radius.circular(EventDescriptionDetailWidgetStyles.borderRadius)), + ), + width: double.infinity, + padding: const EdgeInsetsDirectional.only( + top: EventDescriptionDetailWidgetStyles.contentPadding, + bottom: EventDescriptionDetailWidgetStyles.contentPadding, + start: EventDescriptionDetailWidgetStyles.contentPadding, + end: EventDescriptionDetailWidgetStyles.quotedPadding + ), + child: Stack( + children: [ + if (PlatformInfo.isWeb) + Container( + constraints: const BoxConstraints(maxHeight: EventDescriptionDetailWidgetStyles.maxHeight), + padding: const EdgeInsetsDirectional.only(end: EventDescriptionDetailWidgetStyles.webContentPadding), + child: LayoutBuilder(builder: (context, constraints) { + return Stack( + children: [ + HtmlContentViewerOnWeb( + widthContent: constraints.maxWidth, + heightContent: constraints.maxHeight, + contentHtml: content, + mailtoDelegate: onMailtoDelegateAction, + direction: AppUtils.getCurrentDirection(context), + ), + if (isDraggableAppActive == true) + PointerInterceptor( + child: SizedBox( + width: constraints.maxWidth, + height: constraints.maxHeight, + ) + ) + ], + ); + }) + ) + else + LayoutBuilder(builder: (context, constraints) { + return HtmlContentViewer( + contentHtml: content, + initialWidth: constraints.maxWidth, + direction: AppUtils.getCurrentDirection(context), + onMailtoDelegateAction: onMailtoDelegateAction + ); + }), + PositionedDirectional( + top: 0, + end: 0, + child: SvgPicture.asset(imagePath.icFormatQuote) + ) + ], + ), + ); + } +} \ No newline at end of file