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:
DatDang
2025-06-16 11:07:38 +07:00
committed by Dat H. Pham
parent f86392c854
commit 8864fbc03a
18 changed files with 154 additions and 154 deletions
@@ -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);
@@ -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,
);
},
);
}
}
@@ -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(
@@ -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];
}
@@ -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,
);
}
}
@@ -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;
}
}
}
@@ -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});
}
}
@@ -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
@@ -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,