TF-3643 Thread Detail get emails meta data method
TF-3643 Thread Detail cache email with thread id TF-3643 Thread Detail view thread detail TF-3643 Thread Detail [Part 2 fixup] remove ThreadDetailController dependency from MailboxDashboardController TF-3643 Thread Detail [Part 2 fixup] remove EmailSupervisorController dependency from ThreadDetailController TF-3643 Thread Detail [Part 2 fixup] move isSearchRunning check into ThreadDetailController TF-3643 Thread Detail [Part 2 fixup] ensure GetEmailsByIdsInteractor performance TF-3643 Thread Detail [Part 2 fixup] unit test loadMoreThreadDetailEmails TF-3643 Thread Detail [Part 2 fixup] unit test getEmailIdsToLoad TF-3643 Thread Detail [Part 2 fixup] optimize ThreadDetailBinding bindingsDataSource TF-3643 Thread Detail [Part 2 fixup] optimize getThreadDetailLoadingView TF-3643 Thread Detail [Part 2 fixup] readd unique ValueKey for HtmlContentViewerOnWebWidget TF-3643 Thread Detail [Part 2 fixup] unit test initializeThreadDetailEmails TF-3643 Thread Detail [Part 3 fixup] Update private action button methods TF-3643 Thread Detail [Part 4 fixup] Collapsed email preview 65 characters max TF-3643 Thread Detail [Part 4 fixup] Remove personal scripts TF-3643 Thread Detail move EmailInThreadStatus into PresentationEmail TF-3643 Thread Detail refactor toggle collapse expand TF-3643 Thread Detail EmailViewAppBarWidget required parameters TF-3643 Thread Detail tap avatar toggle expansion TF-3643 Thread Detail fix cannot open single email TF-3643 Thread Detail fix open thread first time blank view TF-3643 Thread Detail fix thread detail UI TF-3643 Thread Detail fix round bottom view TF-3643 Thread Detail fix round bottom view TF-3643 Thread Detail bottom actions depend on current expanded email TF-3643 Thread Detail hide next previous actions TF-3643 Thread Detail fix load more show initial loading view TF-3643 Thread Detail fix cannot view single email TF-3643 Thread Detail fix bottom place holder not aligned TF-3643 Thread Detail fix back to search view TF-3643 Thread Detail fix display 65 character preview collapsed email TF-3643 Thread Detail fix search not work TF-3643 Thread Detail fix bottom place holder UI TF-3643 Thread Detail fix expand view TF-3643 Thread Detail jump to top of last email view TF-3643 Thread Detail remove toMe condition of filtering thread TF-3643 Thread Detail fix sort thread detail TF-3643 Thread Detail fix assert not work in release TF-3643 Thread Detail add load more test case <20 TF-3643 Thread Detail remove the use of currentThreadId TF-3643 Thread Detail remove the use of selectedEmail in SingleEmailController TF-3643 Thread Detail fix unit test SingleEmailController calendar TF-3643 Thread Detail disable 2 way scroll control TF-3643 Thread Detail allow thread to load sent email incase thread only contains 1 email TF-3643 Thread Detail disable single email page view TF-3643 Thread Detail update emailsNotLoadedCount name TF-3643 Thread Detail remove collapsed email char limit TF-3643 Thread Detail fix CI TF-3643 Thread Detail unit test handleGetEmailIdsByThreadIdSuccess TF-3643 Thread Detail make _currentEmailId private TF-3643 Thread Detail fix search click users TF-3643 Thread Detail fix scroll jump TF-3643 Thread Detail fix scroll jump TF-3643 Thread Detail fix web back action TF-3643 Thread Detail round bottom actions TF-3643 Thread Detail fix tablet large empty email TF-3643 Thread Detail fix email subject selectable TF-3643 Thread Detail fix email single view with top divider TF-3643 Thread Detail fix email cache threadId missing TF-3643 Thread Detail fix filter sent email in thread details TF-3643 Thread Detail fix select text TF-3643 Thread Detail fix subject alignment TF-3643 Thread Detail fix subject alignment TF-3643 Thread Detail fix tablet large empty email TF-3643 Thread Detail add nullcheck for _jumpScrollViewToTopOfEmail TF-3643 Thread Detail decouple ThreadDetailController from SingleEmailController TF-3643 Thread Detail combine emailIds to emailIdsPresentation TF-3643 Thread Detail remove currentEmailLoaded obx listener of SingleEmailController TF-3643 Thread Detail replace threadAction with an email ui action TF-3643 Thread Detail fix top and bottom bar delay displaying TF-3643 Thread Detail update ReplyForwardBottomBarAction to PerformEmailActionInThreadDetailAction TF-3643 Thread Detail use getOwnEmailAddress in ThreadDetailAppBar TF-3643 Thread Detail add TextOverflow.ellipsis to EmailSubjectWidget TF-3643 Thread Detail fix round border threadDetailLoadingView
This commit is contained in:
@@ -1,26 +1,32 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:core/presentation/constants/constants_ui.dart';
|
||||
import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:core/presentation/views/button/tmail_button_widget.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/direction_utils.dart';
|
||||
import 'package:core/utils/platform_info.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/email/email_action_type.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/extensions/email_extension.dart';
|
||||
import 'package:model/extensions/list_email_address_extension.dart';
|
||||
import 'package:model/extensions/presentation_email_extension.dart';
|
||||
import 'package:model/extensions/presentation_mailbox_extension.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:pointer_interceptor/pointer_interceptor.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/optional_expanded.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/optional_scroll.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_menu_item_action_widget.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_event_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/context_item_email_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/popup_menu_item_email_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/styles/email_view_styles.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_action_banner_widget.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_information_widget.dart';
|
||||
@@ -43,56 +49,45 @@ import 'package:tmail_ui_user/main/utils/app_utils.dart';
|
||||
|
||||
class EmailView extends GetWidget<SingleEmailController> {
|
||||
|
||||
const EmailView({Key? key}) : super(key: key);
|
||||
const EmailView({
|
||||
super.key,
|
||||
this.isInsideThreadDetailView = false,
|
||||
this.emailId,
|
||||
this.isFirstEmailInThreadDetail = false,
|
||||
this.threadSubject,
|
||||
this.onToggleThreadDetailCollapseExpand,
|
||||
});
|
||||
|
||||
final bool isInsideThreadDetailView;
|
||||
final EmailId? emailId;
|
||||
final bool isFirstEmailInThreadDetail;
|
||||
final String? threadSubject;
|
||||
final VoidCallback? onToggleThreadDetailCollapseExpand;
|
||||
|
||||
@override
|
||||
String? get tag => emailId?.id.value;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SelectionArea(
|
||||
child: Scaffold(
|
||||
backgroundColor: controller.responsiveUtils.isWebDesktop(context)
|
||||
child: ColoredBox(
|
||||
color: controller.responsiveUtils.isWebDesktop(context)
|
||||
? AppColor.colorBgDesktop
|
||||
: Colors.white,
|
||||
appBar: PlatformInfo.isIOS
|
||||
? PreferredSize(
|
||||
preferredSize: const Size(double.infinity, 100),
|
||||
child: Obx(() {
|
||||
if (controller.currentEmail != null) {
|
||||
return SafeArea(
|
||||
top: false,
|
||||
bottom: false,
|
||||
child: EmailViewAppBarWidget(
|
||||
key: const Key('email_view_app_bar_widget'),
|
||||
presentationEmail: controller.currentEmail!,
|
||||
mailboxContain: _getMailboxContain(controller.currentEmail!),
|
||||
isSearchActivated: controller.mailboxDashBoardController.searchController.isSearchEmailRunning,
|
||||
onBackAction: () => controller.closeEmailView(context: context),
|
||||
onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action),
|
||||
onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(context: context, presentationEmail: presentationEmail, position: position)
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
})
|
||||
)
|
||||
: null,
|
||||
body: SafeArea(
|
||||
child: SafeArea(
|
||||
right: controller.responsiveUtils.isLandscapeMobile(context),
|
||||
left: controller.responsiveUtils.isLandscapeMobile(context),
|
||||
bottom: !PlatformInfo.isIOS,
|
||||
child: Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: controller.responsiveUtils.isWebDesktop(context)
|
||||
? const BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(20)),
|
||||
color: Colors.white)
|
||||
: const BoxDecoration(color: Colors.white),
|
||||
decoration: _getDecorationEmailView(context),
|
||||
margin: _getMarginEmailView(context),
|
||||
child: Obx(() {
|
||||
final currentEmail = controller.currentEmail;
|
||||
final currentEmailListener = Rxn(controller.currentEmail);
|
||||
final currentEmail = currentEmailListener.value;
|
||||
if (currentEmail != null) {
|
||||
return Column(children: [
|
||||
if (!PlatformInfo.isIOS)
|
||||
if (!isInsideThreadDetailView)
|
||||
Obx(() => EmailViewAppBarWidget(
|
||||
key: const Key('email_view_app_bar_widget'),
|
||||
presentationEmail: currentEmail,
|
||||
@@ -100,10 +95,20 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
isSearchActivated: controller.mailboxDashBoardController.searchController.isSearchEmailRunning,
|
||||
onBackAction: () => controller.closeEmailView(context: context),
|
||||
onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action),
|
||||
onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(context: context, presentationEmail: presentationEmail, position: position),
|
||||
optionsWidget: PlatformInfo.isWeb && controller.emailSupervisorController.supportedPageView.isTrue
|
||||
? _buildNavigatorPageViewWidgets(context)
|
||||
onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(
|
||||
context: context,
|
||||
presentationEmail: presentationEmail,
|
||||
position: position,
|
||||
emailLoaded: controller.currentEmailLoaded.value,
|
||||
),
|
||||
supportBackAction: !isInsideThreadDetailView,
|
||||
appBarDecoration: isInsideThreadDetailView
|
||||
? const BoxDecoration(border: Border(bottom: BorderSide(
|
||||
color: AppColor.colorDividerEmailView,
|
||||
)))
|
||||
: null,
|
||||
emailLoaded: controller.currentEmailLoaded.value,
|
||||
isInsideThreadDetailView: isInsideThreadDetailView,
|
||||
)),
|
||||
Obx(() {
|
||||
final vacation = controller.mailboxDashBoardController.vacationResponse.value;
|
||||
@@ -124,123 +129,63 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
}),
|
||||
Expanded(
|
||||
OptionalExpanded(
|
||||
expandedEnabled: !isInsideThreadDetailView,
|
||||
child: LayoutBuilder(builder: (context, constraints) {
|
||||
return Obx(() {
|
||||
bool supportedPageView = controller.emailSupervisorController.supportedPageView.isTrue && PlatformInfo.isMobile;
|
||||
final currentListEmail = controller.emailSupervisorController.currentListEmail;
|
||||
|
||||
if (supportedPageView) {
|
||||
return PageView.builder(
|
||||
physics: controller.emailSupervisorController.scrollPhysicsPageView.value,
|
||||
itemCount: currentListEmail.length,
|
||||
allowImplicitScrolling: true,
|
||||
controller: controller.emailSupervisorController.pageController,
|
||||
onPageChanged: controller.emailSupervisorController.onPageChanged,
|
||||
itemBuilder: (context, index) {
|
||||
final currentEmail = currentListEmail[index];
|
||||
if (PlatformInfo.isMobile) {
|
||||
return SingleChildScrollView(
|
||||
physics : const ClampingScrollPhysics(),
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
alignment: Alignment.center,
|
||||
color: Colors.white,
|
||||
child: Obx(() => _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
calendarEvent: controller.calendarEvent,
|
||||
maxBodyHeight: constraints.maxHeight
|
||||
))
|
||||
if (PlatformInfo.isMobile) {
|
||||
return OptionalScroll(
|
||||
scrollEnabled: !isInsideThreadDetailView,
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
alignment: Alignment.center,
|
||||
color: Colors.white,
|
||||
child: Obx(() => _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
calendarEvent: controller.calendarEvent,
|
||||
maxBodyHeight: constraints.maxHeight
|
||||
))
|
||||
)
|
||||
);
|
||||
} else {
|
||||
return Obx(() {
|
||||
final calendarEvent = controller.calendarEvent;
|
||||
if (currentEmail.hasCalendarEvent && calendarEvent != null) {
|
||||
return Padding(
|
||||
padding: const EdgeInsetsDirectional.symmetric(horizontal: 4),
|
||||
child: OptionalScroll(
|
||||
scrollEnabled: !isInsideThreadDetailView,
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
alignment: Alignment.center,
|
||||
color: Colors.white,
|
||||
child: _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
calendarEvent: calendarEvent,
|
||||
emailAddressSender: currentEmail.listEmailAddressSender.getListAddress(),
|
||||
maxBodyHeight: constraints.maxHeight
|
||||
)
|
||||
);
|
||||
} else {
|
||||
return Obx(() {
|
||||
final calendarEvent = controller.calendarEvent;
|
||||
if (currentEmail.hasCalendarEvent && calendarEvent != null) {
|
||||
return Padding(
|
||||
padding: const EdgeInsetsDirectional.symmetric(horizontal: 4),
|
||||
child: SingleChildScrollView(
|
||||
physics : const ClampingScrollPhysics(),
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
alignment: Alignment.center,
|
||||
color: Colors.white,
|
||||
child: _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
calendarEvent: calendarEvent,
|
||||
emailAddressSender: currentEmail.listEmailAddressSender.getListAddress(),
|
||||
)
|
||||
)
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
maxBodyHeight: constraints.maxHeight
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
} else {
|
||||
if (PlatformInfo.isMobile) {
|
||||
return SingleChildScrollView(
|
||||
physics : const ClampingScrollPhysics(),
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
alignment: Alignment.center,
|
||||
color: Colors.white,
|
||||
child: Obx(() => _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
calendarEvent: controller.calendarEvent,
|
||||
maxBodyHeight: constraints.maxHeight
|
||||
))
|
||||
)
|
||||
)
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return Obx(() {
|
||||
final calendarEvent = controller.calendarEvent;
|
||||
if (currentEmail.hasCalendarEvent && calendarEvent != null) {
|
||||
return Padding(
|
||||
padding: const EdgeInsetsDirectional.symmetric(horizontal: 4),
|
||||
child: SingleChildScrollView(
|
||||
physics : const ClampingScrollPhysics(),
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
alignment: Alignment.center,
|
||||
color: Colors.white,
|
||||
child: _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
calendarEvent: calendarEvent,
|
||||
emailAddressSender: currentEmail.listEmailAddressSender.getListAddress(),
|
||||
maxBodyHeight: constraints.maxHeight
|
||||
)
|
||||
)
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
maxBodyHeight: constraints.maxHeight
|
||||
);
|
||||
}
|
||||
});
|
||||
return _buildEmailMessage(
|
||||
context: context,
|
||||
presentationEmail: currentEmail,
|
||||
maxBodyHeight: constraints.maxHeight
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}),
|
||||
),
|
||||
Obx(() {
|
||||
final emailLoaded = controller.currentEmailLoaded.value;
|
||||
|
||||
if (emailLoaded == null) return const SizedBox.shrink();
|
||||
if (emailLoaded == null || isInsideThreadDetailView) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
return EmailViewBottomBarWidget(
|
||||
key: const Key('email_view_button_bar'),
|
||||
@@ -263,51 +208,47 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
);
|
||||
}
|
||||
|
||||
EdgeInsetsGeometry? _getMarginEmailView(BuildContext context) {
|
||||
if (PlatformInfo.isWeb) {
|
||||
if (controller.responsiveUtils.isDesktop(context)) {
|
||||
return const EdgeInsetsDirectional.only(
|
||||
end: 16,
|
||||
bottom: 16
|
||||
);
|
||||
} else {
|
||||
return const EdgeInsets.symmetric(vertical: 16);
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
BoxDecoration _getDecorationEmailView(BuildContext context) {
|
||||
if (controller.responsiveUtils.isWebDesktop(context) && !isInsideThreadDetailView) {
|
||||
return const BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(20)),
|
||||
color: Colors.white,
|
||||
);
|
||||
}
|
||||
|
||||
if (controller.currentEmail == null || !isInsideThreadDetailView) {
|
||||
return const BoxDecoration(color: Colors.white);
|
||||
}
|
||||
|
||||
return const BoxDecoration(
|
||||
color: Colors.white,
|
||||
border: Border(top: BorderSide(
|
||||
color: AppColor.colorDividerEmailView,
|
||||
width: 0.5,
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
EdgeInsetsGeometry? _getMarginEmailView(BuildContext context) {
|
||||
if (PlatformInfo.isMobile) return null;
|
||||
|
||||
if (isInsideThreadDetailView) {
|
||||
return EdgeInsets.zero;
|
||||
}
|
||||
|
||||
if (!controller.responsiveUtils.isDesktop(context)) {
|
||||
return EdgeInsets.zero;
|
||||
}
|
||||
|
||||
return const EdgeInsetsDirectional.only(
|
||||
end: 16,
|
||||
bottom: 16
|
||||
);
|
||||
}
|
||||
|
||||
PresentationMailbox? _getMailboxContain(PresentationEmail currentEmail) {
|
||||
return currentEmail.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById);
|
||||
}
|
||||
|
||||
List<Widget> _buildNavigatorPageViewWidgets(BuildContext context) {
|
||||
return [
|
||||
if (controller.emailSupervisorController.nextEmailActivated)
|
||||
TMailButtonWidget.fromIcon(
|
||||
icon: DirectionUtils.isDirectionRTLByLanguage(context)
|
||||
? controller.imagePaths.icOlder
|
||||
: controller.imagePaths.icNewer,
|
||||
iconColor: EmailViewStyles.iconColor,
|
||||
iconSize: EmailViewStyles.pageViewIconSize,
|
||||
backgroundColor: Colors.transparent,
|
||||
tooltipMessage: AppLocalizations.of(context).newer,
|
||||
onTapActionCallback: controller.emailSupervisorController.moveToNextEmail
|
||||
),
|
||||
if (controller.emailSupervisorController.previousEmailActivated)
|
||||
TMailButtonWidget.fromIcon(
|
||||
icon: DirectionUtils.isDirectionRTLByLanguage(context)
|
||||
? controller.imagePaths.icNewer
|
||||
: controller.imagePaths.icOlder,
|
||||
iconColor: EmailViewStyles.iconColor,
|
||||
iconSize: EmailViewStyles.pageViewIconSize,
|
||||
backgroundColor: Colors.transparent,
|
||||
tooltipMessage: AppLocalizations.of(context).older,
|
||||
onTapActionCallback: controller.emailSupervisorController.backToPreviousEmail
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
Widget _buildEmailMessage({
|
||||
required BuildContext context,
|
||||
@@ -318,8 +259,16 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
}) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
EmailSubjectWidget(presentationEmail: presentationEmail),
|
||||
if (!isInsideThreadDetailView || isFirstEmailInThreadDetail)
|
||||
EmailSubjectWidget(
|
||||
presentationEmail: presentationEmail.copyWith(
|
||||
subject: threadSubject,
|
||||
),
|
||||
)
|
||||
else
|
||||
const SizedBox(height: 16),
|
||||
Obx(() => InformationSenderAndReceiverBuilder(
|
||||
emailSelected: presentationEmail,
|
||||
imagePaths: controller.imagePaths,
|
||||
@@ -329,6 +278,16 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
maxBodyHeight: maxBodyHeight,
|
||||
openEmailAddressDetailAction: controller.openEmailAddressDialog,
|
||||
onEmailActionClick: (presentationEmail, actionType) => controller.handleEmailAction(context, presentationEmail, actionType),
|
||||
isInsideThreadDetailView: isInsideThreadDetailView,
|
||||
emailLoaded: controller.currentEmailLoaded.value,
|
||||
onMoreActionClick: (email, position) => _handleMoreEmailAction(
|
||||
context: context,
|
||||
presentationEmail: email,
|
||||
position: position,
|
||||
emailLoaded: controller.currentEmailLoaded.value,
|
||||
),
|
||||
onToggleThreadDetailCollapseExpand: onToggleThreadDetailCollapseExpand,
|
||||
onTapAvatarActionClick: onToggleThreadDetailCollapseExpand,
|
||||
)),
|
||||
Obx(() => MailUnsubscribedBanner(
|
||||
presentationEmail: controller.currentEmail,
|
||||
@@ -349,6 +308,7 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
onTapShowAllAttachmentFile: () => controller.openAttachmentList(context, controller.attachments),
|
||||
showDownloadAllAttachmentsButton: controller.downloadAllButtonIsEnabled(),
|
||||
onTapDownloadAllButton: () => controller.handleDownloadAllAttachmentsAction(context, 'TwakeMail-${DateTime.now()}'),
|
||||
singleEmailControllerTag: tag,
|
||||
);
|
||||
} else {
|
||||
return const SizedBox.shrink();
|
||||
@@ -408,7 +368,8 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
final allEmailContents = controller.emailContents.value ?? '';
|
||||
|
||||
if (PlatformInfo.isWeb) {
|
||||
return Expanded(
|
||||
return OptionalExpanded(
|
||||
expandedEnabled: !isInsideThreadDetailView,
|
||||
child: Padding(
|
||||
padding: EmailViewStyles.emailContentPadding,
|
||||
child: LayoutBuilder(builder: (context, constraints) {
|
||||
@@ -416,8 +377,12 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
return Stack(
|
||||
children: [
|
||||
HtmlContentViewerOnWeb(
|
||||
key: ValueKey(tag),
|
||||
widthContent: constraints.maxWidth,
|
||||
heightContent: constraints.maxHeight,
|
||||
heightContent: min(
|
||||
constraints.maxHeight,
|
||||
EmailViewStyles.initialHtmlViewHeight,
|
||||
),
|
||||
contentHtml: allEmailContents,
|
||||
mailtoDelegate: controller.openMailToLink,
|
||||
direction: AppUtils.getCurrentDirection(context),
|
||||
@@ -462,9 +427,8 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
useDefaultFont: true,
|
||||
maxHtmlContentHeight: ConstantsUI.htmlContentMaxHeight,
|
||||
onMailtoDelegateAction: controller.openMailToLink,
|
||||
onScrollHorizontalEnd: controller.toggleScrollPhysicsPagerView,
|
||||
onLoadWidthHtmlViewer: controller.emailSupervisorController.updateScrollPhysicPageView,
|
||||
onHtmlContentClippedAction: controller.onHtmlContentClippedAction,
|
||||
keepAlive: isInsideThreadDetailView,
|
||||
);
|
||||
}),
|
||||
),
|
||||
@@ -503,8 +467,7 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
contentPadding: 0,
|
||||
useDefaultFont: true,
|
||||
onMailtoDelegateAction: controller.openMailToLink,
|
||||
onScrollHorizontalEnd: controller.toggleScrollPhysicsPagerView,
|
||||
onLoadWidthHtmlViewer: controller.emailSupervisorController.updateScrollPhysicPageView,
|
||||
keepAlive: isInsideThreadDetailView,
|
||||
);
|
||||
})
|
||||
);
|
||||
@@ -531,10 +494,17 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
return usernameEvent.isNotEmpty && titleEvent.isNotEmpty;
|
||||
}
|
||||
|
||||
bool canDeletePermanently(PresentationEmail email) {
|
||||
return email.mailboxContain?.isTrash
|
||||
?? email.mailboxContain?.isSpam
|
||||
?? false;
|
||||
}
|
||||
|
||||
void _handleMoreEmailAction({
|
||||
required BuildContext context,
|
||||
required PresentationEmail presentationEmail,
|
||||
RelativeRect? position
|
||||
RelativeRect? position,
|
||||
EmailLoaded? emailLoaded,
|
||||
}) {
|
||||
final mailboxContain = controller.getMailboxContain(presentationEmail);
|
||||
final isChildOfTeamMailboxes = mailboxContain?.isChildOfTeamMailboxes ?? false;
|
||||
@@ -548,6 +518,25 @@ class EmailView extends GetWidget<SingleEmailController> {
|
||||
PlatformInfo.isWeb && PlatformInfo.isCanvasKit;
|
||||
|
||||
final emailActions = [
|
||||
if (isInsideThreadDetailView) ...[
|
||||
EmailActionType.forward,
|
||||
if (presentationEmail.getCountMailAddressWithoutMe(controller.session?.username.value ?? '') > 1)
|
||||
EmailActionType.replyAll,
|
||||
if (EmailUtils.isReplyToListEnabled(emailLoaded?.emailCurrent?.listPost ?? ''))
|
||||
EmailActionType.replyToList,
|
||||
if (PlatformInfo.isWeb && PlatformInfo.isCanvasKit)
|
||||
EmailActionType.printAll,
|
||||
if (controller.responsiveUtils.isMobile(context))
|
||||
EmailActionType.moveToMailbox,
|
||||
if (!controller.responsiveUtils.isDesktop(context)) ...[
|
||||
presentationEmail.hasStarred
|
||||
? EmailActionType.unMarkAsStarred
|
||||
: EmailActionType.markAsStarred,
|
||||
canDeletePermanently(presentationEmail)
|
||||
? EmailActionType.deletePermanently
|
||||
: EmailActionType.moveToTrash,
|
||||
],
|
||||
],
|
||||
EmailActionType.markAsUnread,
|
||||
if (!isChildOfTeamMailboxes)
|
||||
isSpam ? EmailActionType.unSpam : EmailActionType.moveToSpam,
|
||||
|
||||
Reference in New Issue
Block a user