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:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user