TF-3775 Thread Detail handle error getEmailLoaded
TF-3775 Thread Detail readd EventBodyContentWidget maxHeight TF-3775 Thread Detail fix max lines subject mobile TF-3775 Thread Detail add email attachments top spacing TF-3775 Thread Detail fix email not updated on move/trash/spam TF-3775 Thread Detail Fix exception fast switch email in tablet large TF-3775 Thread Detail Adjust MailUnsubscribedBanner vertical spacing
This commit is contained in:
@@ -76,7 +76,6 @@ class EmailBindings extends BaseBindings {
|
||||
Get.find<DownloadAttachmentsInteractor>(),
|
||||
Get.find<DeviceManager>(),
|
||||
Get.find<ExportAttachmentInteractor>(),
|
||||
Get.find<MoveToMailboxInteractor>(),
|
||||
Get.find<MarkAsStarEmailInteractor>(),
|
||||
Get.find<DownloadAttachmentForWebInteractor>(),
|
||||
Get.find<GetAllIdentitiesInteractor>(),
|
||||
|
||||
@@ -15,7 +15,6 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_file_dialog/flutter_file_dialog.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:get/get_navigation/src/dialog/dialog_route.dart';
|
||||
import 'package:http_parser/http_parser.dart';
|
||||
@@ -42,14 +41,11 @@ import 'package:share_plus/share_plus.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/base/state/button_state.dart';
|
||||
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/extensions/list_attachments_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/preview_email_eml_request.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/view_entire_message_request.dart';
|
||||
@@ -68,7 +64,6 @@ import 'package:tmail_ui_user/features/email/domain/state/get_entire_message_as_
|
||||
import 'package:tmail_ui_user/features/email/domain/state/get_html_content_from_attachment_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/parse_email_by_blob_id_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/preview_email_from_eml_file_state.dart';
|
||||
@@ -89,7 +84,6 @@ import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/parse_email_by_blob_id_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/preview_email_from_eml_file_interactor.dart';
|
||||
@@ -119,7 +113,6 @@ import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.d
|
||||
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/get_mailbox_contain_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
||||
@@ -161,7 +154,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
final DownloadAttachmentsInteractor _downloadAttachmentsInteractor;
|
||||
final DeviceManager _deviceManager;
|
||||
final ExportAttachmentInteractor _exportAttachmentInteractor;
|
||||
final MoveToMailboxInteractor _moveToMailboxInteractor;
|
||||
final MarkAsStarEmailInteractor _markAsStarEmailInteractor;
|
||||
final DownloadAttachmentForWebInteractor _downloadAttachmentForWebInteractor;
|
||||
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
|
||||
@@ -230,7 +222,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
this._downloadAttachmentsInteractor,
|
||||
this._deviceManager,
|
||||
this._exportAttachmentInteractor,
|
||||
this._moveToMailboxInteractor,
|
||||
this._markAsStarEmailInteractor,
|
||||
this._downloadAttachmentForWebInteractor,
|
||||
this._getAllIdentitiesInteractor,
|
||||
@@ -282,8 +273,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
_exportAttachmentSuccessAction(success);
|
||||
} else if (success is ExportAllAttachmentsSuccess) {
|
||||
_exportAllAttachmentsSuccessAction(success);
|
||||
} else if (success is MoveToMailboxSuccess) {
|
||||
_moveToMailboxSuccess(success);
|
||||
} else if (success is MarkAsStarEmailSuccess) {
|
||||
_markAsEmailStarSuccess(success);
|
||||
} else if (success is DownloadAttachmentForWebSuccess) {
|
||||
@@ -780,7 +769,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
|
||||
PresentationMailbox? getMailboxContain(PresentationEmail email) {
|
||||
return mailboxDashBoardController.getMailboxContain(email);
|
||||
return email.findMailboxContain(mailboxDashBoardController.mapMailboxById);
|
||||
}
|
||||
|
||||
void markAsEmailRead(
|
||||
@@ -1206,7 +1195,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
accountId!,
|
||||
email,
|
||||
mapMailbox: mailboxDashBoardController.mapMailboxById,
|
||||
selectedMailbox: mailboxDashBoardController.selectedMailbox.value,
|
||||
selectedMailbox: currentEmail?.findMailboxContain(
|
||||
mailboxDashBoardController.mapMailboxById,
|
||||
),
|
||||
isSearchEmailRunning: mailboxDashBoardController.searchController.isSearchEmailRunning,
|
||||
);
|
||||
if (!context.mounted || moveActionRequest == null) return;
|
||||
@@ -1222,61 +1213,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
||||
}
|
||||
}
|
||||
|
||||
void _moveToMailbox(
|
||||
BuildContext context,
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
MoveToMailboxRequest moveRequest,
|
||||
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||
) {
|
||||
consumeState(_moveToMailboxInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
moveRequest,
|
||||
emailIdsWithReadStatus,
|
||||
));
|
||||
}
|
||||
|
||||
void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
|
||||
mailboxDashBoardController.dispatchState(Right(success));
|
||||
if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) {
|
||||
appToast.showToastMessage(
|
||||
currentOverlayContext!,
|
||||
success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath),
|
||||
actionName: AppLocalizations.of(currentContext!).undo,
|
||||
onActionClick: () {
|
||||
_revertedToOriginalMailbox(MoveToMailboxRequest(
|
||||
{success.destinationMailboxId: [success.emailId]},
|
||||
success.currentMailboxId,
|
||||
MoveAction.undo,
|
||||
success.emailActionType),
|
||||
success.emailIdsWithReadStatus,
|
||||
);
|
||||
},
|
||||
leadingSVGIcon: imagePaths.icFolderMailbox,
|
||||
leadingSVGIconColor: Colors.white,
|
||||
backgroundColor: AppColor.toastSuccessBackgroundColor,
|
||||
textColor: Colors.white,
|
||||
actionIcon: SvgPicture.asset(imagePaths.icUndo)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void _revertedToOriginalMailbox(
|
||||
MoveToMailboxRequest newMoveRequest,
|
||||
Map<EmailId, bool> emailIdsWithReadStatus,
|
||||
) {
|
||||
if (accountId != null && session != null) {
|
||||
_moveToMailbox(
|
||||
currentContext!,
|
||||
session!,
|
||||
accountId!,
|
||||
newMoveRequest,
|
||||
emailIdsWithReadStatus,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void moveToTrash(BuildContext context, PresentationEmail email) {
|
||||
if (session != null && accountId != null) {
|
||||
final moveActionRequest = emailActionReactor.moveToTrash(
|
||||
|
||||
@@ -25,7 +25,7 @@ class EmailAttachmentsStyles {
|
||||
static const FontWeight buttonFontWeight = FontWeight.w400;
|
||||
static const FontWeight buttonMoreAttachmentsFontWeight = FontWeight.w500;
|
||||
|
||||
static const EdgeInsetsGeometry padding = EdgeInsetsDirectional.only(start: 16, end: 16, bottom: 12);
|
||||
static const EdgeInsetsGeometry padding = EdgeInsetsDirectional.only(start: 16, end: 16, bottom: 12, top: 16);
|
||||
static const EdgeInsetsGeometry buttonPadding = EdgeInsets.symmetric(vertical: 8, horizontal: 12);
|
||||
static const EdgeInsetsGeometry mobileButtonPadding = EdgeInsets.symmetric(vertical: 8, horizontal: 3);
|
||||
static const EdgeInsetsGeometry moreButtonMargin = EdgeInsetsDirectional.only(bottom: 2, start: 8);
|
||||
|
||||
+45
-39
@@ -50,6 +50,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/print_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
|
||||
@@ -360,22 +361,26 @@ class EmailActionReactor with MessageDialogActionMixin, PopupContextMenuActionMi
|
||||
PresentationEmail presentationEmail, {
|
||||
required String ownEmailAddress,
|
||||
required EmailLoaded? emailLoaded,
|
||||
VoidCallback? onGetEmailContentFailure,
|
||||
Session? session,
|
||||
AccountId? accountId,
|
||||
String? baseDownloadUrl,
|
||||
TransformConfiguration? transformConfiguration,
|
||||
}) async* {
|
||||
emailLoaded ??= await _getEmailLoaded(
|
||||
session,
|
||||
accountId,
|
||||
presentationEmail.id,
|
||||
baseDownloadUrl,
|
||||
transformConfiguration,
|
||||
);
|
||||
|
||||
if (emailLoaded == null) {
|
||||
onGetEmailContentFailure?.call();
|
||||
try {
|
||||
emailLoaded ??= await _getEmailLoaded(
|
||||
session,
|
||||
accountId,
|
||||
presentationEmail.id,
|
||||
baseDownloadUrl,
|
||||
transformConfiguration,
|
||||
);
|
||||
|
||||
if (emailLoaded == null) {
|
||||
yield Left(PrintEmailFailure());
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
yield Left(PrintEmailFailure(exception: e));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -848,7 +853,7 @@ class EmailActionReactor with MessageDialogActionMixin, PopupContextMenuActionMi
|
||||
EmailId? emailId,
|
||||
String? baseDownloadUrl,
|
||||
TransformConfiguration? transformConfiguration,
|
||||
) {
|
||||
) async {
|
||||
if (session == null ||
|
||||
accountId == null ||
|
||||
emailId == null ||
|
||||
@@ -858,33 +863,34 @@ class EmailActionReactor with MessageDialogActionMixin, PopupContextMenuActionMi
|
||||
return Future.value(null);
|
||||
}
|
||||
|
||||
return _getEmailContentInteractor
|
||||
.execute(
|
||||
session,
|
||||
accountId,
|
||||
emailId,
|
||||
baseDownloadUrl,
|
||||
transformConfiguration,
|
||||
)
|
||||
.last
|
||||
.then(
|
||||
(value) {
|
||||
return value.fold(
|
||||
(failure) => null,
|
||||
(success) => success is GetEmailContentSuccess
|
||||
? EmailLoaded(
|
||||
htmlContent: success.htmlEmailContent,
|
||||
attachments: List.of(success.attachments ?? []),
|
||||
inlineImages: List.of(success.inlineImages ?? []),
|
||||
emailCurrent: success.emailCurrent,
|
||||
)
|
||||
: null,
|
||||
);
|
||||
},
|
||||
onError: (error) {
|
||||
logError('EmailActionReactor::_getEmailLoaded(): error: $error');
|
||||
final result = await _getEmailContentInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
emailId,
|
||||
baseDownloadUrl,
|
||||
transformConfiguration,
|
||||
).last;
|
||||
|
||||
return result.fold(
|
||||
(failure) {
|
||||
if (failure is FeatureFailure) {
|
||||
throw failure.exception;
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
(success) {
|
||||
if (success is! GetEmailContentSuccess) {
|
||||
return null;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
return EmailLoaded(
|
||||
htmlContent: success.htmlEmailContent,
|
||||
attachments: List.of(success.attachments ?? []),
|
||||
inlineImages: List.of(success.inlineImages ?? []),
|
||||
emailCurrent: success.emailCurrent,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -46,7 +46,8 @@ class EventBodyContentWidget extends StatelessWidget {
|
||||
child: Stack(
|
||||
children: [
|
||||
if (PlatformInfo.isWeb)
|
||||
Padding(
|
||||
Container(
|
||||
constraints: const BoxConstraints(maxHeight: EventDescriptionDetailWidgetStyles.maxHeight),
|
||||
padding: const EdgeInsetsDirectional.only(end: EventDescriptionDetailWidgetStyles.webContentPadding),
|
||||
child: LayoutBuilder(builder: (context, constraints) {
|
||||
return Stack(
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:core/presentation/utils/theme_utils.dart';
|
||||
import 'package:core/utils/platform_info.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/styles/email_subject_styles.dart';
|
||||
@@ -19,10 +20,10 @@ class EmailSubjectWidget extends StatelessWidget {
|
||||
padding: EmailSubjectStyles.padding,
|
||||
child: Text(
|
||||
presentationEmail.getEmailTitle(),
|
||||
maxLines: EmailSubjectStyles.maxLines,
|
||||
style: ThemeUtils.textStyleHeadingH5(color: Colors.black).copyWith(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
overflow: PlatformInfo.isWeb ? TextOverflow.ellipsis : null,
|
||||
),
|
||||
maxLines: EmailSubjectStyles.maxLines,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ class MailUnsubscribedBanner extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
if (presentationEmail?.isSubscribed == true && emailUnsubscribe == null) {
|
||||
return Padding(
|
||||
padding: const EdgeInsetsDirectional.only(bottom: 16, start: 20, end: 20),
|
||||
padding: const EdgeInsetsDirectional.symmetric(vertical: 16, horizontal: 20),
|
||||
child: Text(
|
||||
AppLocalizations.of(context).mailUnsubscribedMessage(presentationEmail?.firstEmailAddressInFrom ?? ''),
|
||||
style: ThemeUtils.defaultTextStyleInterFont.copyWith(
|
||||
|
||||
+5
@@ -1025,6 +1025,11 @@ class MailboxDashBoardController extends ReloadableController
|
||||
}
|
||||
|
||||
void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
|
||||
dispatchThreadDetailUIAction(EmailMovedAction(
|
||||
emailId: success.emailId,
|
||||
originalMailboxId: success.currentMailboxId,
|
||||
targetMailboxId: success.destinationMailboxId,
|
||||
));
|
||||
if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) {
|
||||
appToast.showToastMessage(
|
||||
currentOverlayContext!,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/base/action/ui_action.dart';
|
||||
|
||||
class ThreadDetailUIAction extends UIAction {
|
||||
@@ -22,4 +23,19 @@ class UpdatedEmailKeywordsAction extends ThreadDetailUIAction {
|
||||
List<Object?> get props => [emailId, updatedKeyword, value];
|
||||
}
|
||||
|
||||
class UpdatedThreadDetailSettingAction extends ThreadDetailUIAction {}
|
||||
class UpdatedThreadDetailSettingAction extends ThreadDetailUIAction {}
|
||||
|
||||
class EmailMovedAction extends ThreadDetailUIAction {
|
||||
EmailMovedAction({
|
||||
required this.emailId,
|
||||
required this.originalMailboxId,
|
||||
required this.targetMailboxId,
|
||||
});
|
||||
|
||||
final EmailId emailId;
|
||||
final MailboxId originalMailboxId;
|
||||
final MailboxId targetMailboxId;
|
||||
|
||||
@override
|
||||
List<Object?> get props => [emailId, originalMailboxId, targetMailboxId];
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/extensions/presentation_email_extension.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
|
||||
|
||||
extension GetThreadDetailEmailMailboxContains on ThreadDetailController {
|
||||
PresentationMailbox? getThreadDetailEmailMailboxContains(
|
||||
PresentationEmail presentationEmail,
|
||||
) {
|
||||
return presentationEmail.findMailboxContain(
|
||||
mailboxDashBoardController.mapMailboxById,
|
||||
);
|
||||
}
|
||||
}
|
||||
+21
-16
@@ -6,26 +6,31 @@ extension GetThreadDetailLoadingView on ThreadDetailController {
|
||||
Widget getThreadDetailLoadingView({
|
||||
required bool isResponsiveDesktop,
|
||||
required bool isLoading,
|
||||
bool isExpanded = true,
|
||||
}) {
|
||||
if (!isLoading) return const SizedBox.shrink();
|
||||
|
||||
return Expanded(
|
||||
child: Container(
|
||||
alignment: Alignment.center,
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(20)),
|
||||
),
|
||||
margin: isResponsiveDesktop
|
||||
? const EdgeInsetsDirectional.only(end: 16)
|
||||
: null,
|
||||
padding: const EdgeInsets.only(top: 16),
|
||||
child: const SizedBox(
|
||||
width: 24,
|
||||
height: 24,
|
||||
child: CupertinoLoadingWidget(),
|
||||
),
|
||||
final child = Container(
|
||||
alignment: Alignment.center,
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(20)),
|
||||
),
|
||||
margin: isResponsiveDesktop
|
||||
? const EdgeInsetsDirectional.only(end: 16)
|
||||
: null,
|
||||
padding: const EdgeInsets.only(top: 16),
|
||||
child: const SizedBox(
|
||||
width: 24,
|
||||
height: 24,
|
||||
child: CupertinoLoadingWidget(),
|
||||
),
|
||||
);
|
||||
|
||||
if (isExpanded) {
|
||||
return Expanded(child: child);
|
||||
} else {
|
||||
return child;
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -3,7 +3,7 @@ import 'package:model/email/email_action_type.dart';
|
||||
import 'package:model/extensions/presentation_email_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/email_view.dart';
|
||||
import 'package:model/email/email_in_thread_status.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/get_mailbox_contain_extension.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/get_thread_detail_email_mailbox_contains.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/load_more_thread_detail_emails.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/thread_detail_on_email_action_click.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/thread_detail_open_email_address_detail_action.dart';
|
||||
@@ -65,7 +65,7 @@ extension GetThreadDetailEmailViews on ThreadDetailController {
|
||||
emailLoaded: null,
|
||||
onEmailActionClick: threadDetailOnEmailActionClick,
|
||||
onMoreActionClick: (presentationEmail, position) => emailActionReactor.handleMoreEmailAction(
|
||||
mailboxContain: mailboxDashBoardController.getMailboxContain(presentationEmail),
|
||||
mailboxContain: getThreadDetailEmailMailboxContains(presentationEmail),
|
||||
presentationEmail: presentationEmail,
|
||||
position: position,
|
||||
responsiveUtils: responsiveUtils,
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_detail_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
|
||||
|
||||
extension HandleEmailMovedAction on ThreadDetailController {
|
||||
void handleEmailMovedAction(EmailMovedAction action) {
|
||||
if (emailIdsPresentation[action.emailId] == null) return;
|
||||
|
||||
emailIdsPresentation[action.emailId] = emailIdsPresentation[action.emailId]
|
||||
?.copyWith(mailboxIds: {action.targetMailboxId: true});
|
||||
}
|
||||
}
|
||||
+1
@@ -51,6 +51,7 @@ extension HandleGetEmailsByIdsSuccess on ThreadDetailController {
|
||||
return;
|
||||
}
|
||||
|
||||
if (scrollController?.hasClients == false) return;
|
||||
final currentScrollPosition = scrollController?.position.pixels;
|
||||
final maxScrollExtent = scrollController?.position.maxScrollExtent;
|
||||
final currentBottomScrollPosition = currentScrollPosition != null
|
||||
|
||||
+4
-12
@@ -6,12 +6,12 @@ import 'package:model/email/mark_star_action.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/email/read_actions.dart';
|
||||
import 'package:model/extensions/email_extension.dart';
|
||||
import 'package:model/extensions/presentation_email_extension.dart';
|
||||
import 'package:model/extensions/session_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
|
||||
extension ThreadDetailOnEmailActionClick on ThreadDetailController {
|
||||
@@ -129,7 +129,9 @@ extension ThreadDetailOnEmailActionClick on ThreadDetailController {
|
||||
accountId!,
|
||||
presentationEmail,
|
||||
mapMailbox: mailboxDashBoardController.mapMailboxById,
|
||||
selectedMailbox: mailboxDashBoardController.selectedMailbox.value,
|
||||
selectedMailbox: presentationEmail.findMailboxContain(
|
||||
mailboxDashBoardController.mapMailboxById,
|
||||
),
|
||||
isSearchEmailRunning: mailboxDashBoardController.searchController.isSearchEmailRunning,
|
||||
);
|
||||
|
||||
@@ -263,7 +265,6 @@ extension ThreadDetailOnEmailActionClick on ThreadDetailController {
|
||||
accountId: accountId,
|
||||
baseDownloadUrl: session?.getDownloadUrl(jmapUrl: dynamicUrlInterceptors.jmapUrl),
|
||||
transformConfiguration: TransformConfiguration.forPreviewEmailOnWeb(),
|
||||
onGetEmailContentFailure: _showUnknownErrorToast,
|
||||
));
|
||||
}
|
||||
|
||||
@@ -367,13 +368,4 @@ extension ThreadDetailOnEmailActionClick on ThreadDetailController {
|
||||
emailLoaded: null,
|
||||
);
|
||||
}
|
||||
|
||||
_showUnknownErrorToast() {
|
||||
if (currentOverlayContext != null && currentContext != null) {
|
||||
appToast.showToastErrorMessage(
|
||||
currentOverlayContext!,
|
||||
AppLocalizations.of(currentContext!).unknownError,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,7 @@ import 'package:model/extensions/keyword_identifier_extension.dart';
|
||||
import 'package:model/extensions/session_extension.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/print_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
|
||||
@@ -41,6 +42,7 @@ import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_emails_
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_detail_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_thread_detail_status_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/close_thread_detail_action.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_email_moved_action.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_email_ids_by_thread_id_success.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_emails_by_ids_success.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_thread_by_id_failure.dart';
|
||||
@@ -48,6 +50,7 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/extension/hand
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/initialize_thread_detail_emails.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/refresh_thread_detail_on_setting_changed.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/model/thread_detail_setting_status.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_collapsed_email_download_states.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/mark_collapsed_email_star_success.dart';
|
||||
@@ -186,10 +189,13 @@ class ThreadDetailController extends BaseController {
|
||||
}
|
||||
} else if (action is UpdatedThreadDetailSettingAction) {
|
||||
consumeState(_getThreadDetailStatusInteractor.execute());
|
||||
mailboxDashBoardController.dispatchThreadDetailUIAction(
|
||||
ThreadDetailUIAction(),
|
||||
);
|
||||
} else if (action is EmailMovedAction) {
|
||||
handleEmailMovedAction(action);
|
||||
}
|
||||
// Reset [threadDetailUIAction] to original value
|
||||
mailboxDashBoardController.dispatchThreadDetailUIAction(
|
||||
ThreadDetailUIAction(),
|
||||
);
|
||||
});
|
||||
ever(mailboxDashBoardController.emailUIAction, (action) {
|
||||
if (action is RefreshThreadDetailAction) {
|
||||
@@ -255,6 +261,15 @@ class ThreadDetailController extends BaseController {
|
||||
threadDetailSettingStatus = ThreadDetailSettingStatus.enabled;
|
||||
refreshThreadDetailOnSettingChanged();
|
||||
}
|
||||
if (failure is PrintEmailFailure) {
|
||||
if (currentOverlayContext != null && currentContext != null) {
|
||||
appToast.showToastErrorMessage(
|
||||
currentOverlayContext!,
|
||||
AppLocalizations.of(currentContext!).unknownError,
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
super.handleFailureViewState(failure);
|
||||
}
|
||||
}
|
||||
@@ -5,15 +5,16 @@ import 'package:core/presentation/state/success.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:model/email/email_in_thread_status.dart';
|
||||
import 'package:model/extensions/session_extension.dart';
|
||||
import 'package:model/email/email_action_type.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/email_view.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_bottom_bar_widget.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/get_mailbox_contain_extension.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/close_thread_detail_action.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/get_thread_detail_email_mailbox_contains.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/get_thread_detail_loading_view.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/get_thread_details_email_views.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/thread_detail_on_email_action_click.dart';
|
||||
@@ -43,7 +44,7 @@ class ThreadDetailView extends GetWidget<ThreadDetailController> {
|
||||
mailboxContain: _getMailboxContain(),
|
||||
onEmailActionClick: controller.threadDetailOnEmailActionClick,
|
||||
onMoreActionClick: (presentationEmail, position) => controller.emailActionReactor.handleMoreEmailAction(
|
||||
mailboxContain: controller.mailboxDashBoardController.getMailboxContain(presentationEmail),
|
||||
mailboxContain: controller.getThreadDetailEmailMailboxContains(presentationEmail),
|
||||
presentationEmail: presentationEmail,
|
||||
position: position,
|
||||
responsiveUtils: controller.responsiveUtils,
|
||||
@@ -167,11 +168,12 @@ class ThreadDetailView extends GetWidget<ThreadDetailController> {
|
||||
return controller.getThreadDetailLoadingView(
|
||||
isResponsiveDesktop: false,
|
||||
isLoading: true,
|
||||
isExpanded: false,
|
||||
);
|
||||
}
|
||||
|
||||
if (controller.emailIdsPresentation.length == 1 &&
|
||||
controller.emailIdsPresentation.values.firstOrNull != null) {
|
||||
controller.emailIdsPresentation.values.firstOrNull?.emailInThreadStatus == EmailInThreadStatus.expanded) {
|
||||
final emailId = controller.emailIdsPresentation.values.firstOrNull!.id;
|
||||
|
||||
return EmailView(
|
||||
|
||||
@@ -39,7 +39,6 @@ import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_i
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/parse_email_by_blob_id_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/preview_email_from_eml_file_interactor.dart';
|
||||
@@ -81,7 +80,6 @@ const fallbackGenerators = {
|
||||
MockSpec<DownloadAttachmentsInteractor>(),
|
||||
MockSpec<DeviceManager>(),
|
||||
MockSpec<ExportAttachmentInteractor>(),
|
||||
MockSpec<MoveToMailboxInteractor>(),
|
||||
MockSpec<MarkAsStarEmailInteractor>(),
|
||||
MockSpec<DownloadAttachmentForWebInteractor>(),
|
||||
MockSpec<GetAllIdentitiesInteractor>(),
|
||||
@@ -125,7 +123,6 @@ void main() {
|
||||
final downloadAttachmentsInteractor = MockDownloadAttachmentsInteractor();
|
||||
final deviceManager = MockDeviceManager();
|
||||
final exportAttachmentInteractor = MockExportAttachmentInteractor();
|
||||
final moveToMailboxInteractor = MockMoveToMailboxInteractor();
|
||||
final markAsStarEmailInteractor = MockMarkAsStarEmailInteractor();
|
||||
final downloadAttachmentForWebInteractor =
|
||||
MockDownloadAttachmentForWebInteractor();
|
||||
@@ -204,7 +201,6 @@ void main() {
|
||||
downloadAttachmentsInteractor,
|
||||
deviceManager,
|
||||
exportAttachmentInteractor,
|
||||
moveToMailboxInteractor,
|
||||
markAsStarEmailInteractor,
|
||||
downloadAttachmentForWebInteractor,
|
||||
getAllIdentitiesInteractor,
|
||||
|
||||
Reference in New Issue
Block a user