TF-3804 Thread Detail Load selected email in parallel with thread metadata

This commit is contained in:
DatDang
2025-06-20 10:10:24 +07:00
committed by Dat H. Pham
parent 683d407fba
commit 5fd4986c6a
19 changed files with 863 additions and 421 deletions
@@ -1,5 +1,6 @@
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
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:tmail_ui_user/features/base/action/ui_action.dart';
@@ -58,4 +59,23 @@ class RefreshThreadDetailAction extends EmailUIAction {
@override
List<Object?> get props => [emailChangeResponse];
}
class DisposePreviousExpandedEmailAction extends EmailUIAction {
DisposePreviousExpandedEmailAction(this.emailId);
final EmailId emailId;
@override
List<Object?> get props => [emailId];
}
class UnsubscribeFromThreadAction extends EmailUIAction {
UnsubscribeFromThreadAction(this.emailId, this.listUnsubscribe);
final EmailId emailId;
final String listUnsubscribe;
@override
List<Object?> get props => [emailId, listUnsubscribe];
}
@@ -123,6 +123,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
import 'package:tmail_ui_user/features/search/email/presentation/search_email_controller.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_detail_ui_action.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/focus_thread_detail_expanded_email.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/mark_collapsed_email_unread_success.dart';
@@ -397,6 +398,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
action.emailActionType,
action.presentationEmail,
);
} else if (action is DisposePreviousExpandedEmailAction) {
if (_currentEmailId == null || _currentEmailId != action.emailId) return;
for (var worker in obxListeners) {
worker.dispose();
}
Get.delete<SingleEmailController>(tag: action.emailId.id.value);
} else if (action is CloseEmailInThreadDetailAction) {
if (_currentEmailId == null) return;
closeEmailView(context: currentContext);
@@ -404,6 +411,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
worker.dispose();
}
Get.delete<SingleEmailController>(tag: _currentEmailId!.id.value);
} else if (action is UnsubscribeFromThreadAction) {
if (_currentEmailId == null || action.emailId != _currentEmailId) return;
_handleUnsubscribe(action.listUnsubscribe);
}
}));
@@ -662,6 +672,14 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
emailUnsubscribe.value = null;
}
}
if (currentEmail?.threadId != null &&
currentEmail?.id == mailboxDashBoardController.selectedEmail.value?.id) {
mailboxDashBoardController.dispatchThreadDetailUIAction(
LoadThreadDetailAfterSelectedEmailAction(
currentEmail!.threadId!,
)
);
}
}
void _getEmailContentSuccess(GetEmailContentSuccess success) {
@@ -727,6 +745,14 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if ((_threadDetailController?.emailIdsPresentation.keys.length ?? 0) > 1 == true) {
_jumpScrollViewToTopOfEmail();
}
if (currentEmail?.threadId != null &&
currentEmail?.id == mailboxDashBoardController.selectedEmail.value?.id) {
mailboxDashBoardController.dispatchThreadDetailUIAction(
LoadThreadDetailAfterSelectedEmailAction(
currentEmail!.threadId!,
)
);
}
}
void _jumpScrollViewToTopOfEmail() {