TF-3731 Thread Detail Cache EmailLoaded in memory for web

This commit is contained in:
DatDang
2025-06-26 09:00:52 +07:00
committed by Dat H. Pham
parent 027ab8e0d8
commit 4d9a44df66
7 changed files with 152 additions and 28 deletions
@@ -127,6 +127,7 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_
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';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/update_cached_list_email_loaded.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -414,6 +415,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} else if (action is UnsubscribeFromThreadAction) {
if (_currentEmailId == null || action.emailId != _currentEmailId) return;
_handleUnsubscribe(action.listUnsubscribe);
} else if (action is CollapseEmailInThreadDetailAction) {
if (_currentEmailId == null || action.emailId != _currentEmailId) return;
for (var worker in obxListeners) {
worker.dispose();
}
Get.delete<SingleEmailController>(tag: _currentEmailId!.id.value);
}
}));
@@ -425,16 +432,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
}
});
}));
if (_threadDetailController != null) {
obxListeners.add(ever(
_threadDetailController!.currentExpandedEmailId,
(emailId) {
if (emailId == null || emailId != _currentEmailId) return;
_threadDetailController!.currentEmailLoaded.value = currentEmailLoaded.value;
},
));
}
}
void _handleOpenEmailDetailedView() {
@@ -600,6 +597,17 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
}
void _getEmailContentAction(EmailId emailId) {
if (_currentEmailId != null && _threadDetailController?.cachedEmailLoaded[_currentEmailId!] != null) {
final emailLoaded = _threadDetailController!.cachedEmailLoaded[_currentEmailId!]!;
consumeState(Stream.value(Right(GetEmailContentFromThreadCacheSuccess(
htmlEmailContent: emailLoaded.htmlContent,
emailCurrent: emailLoaded.emailCurrent,
attachments: emailLoaded.attachments,
inlineImages: emailLoaded.inlineImages,
))));
return;
}
if (session != null && accountId != null) {
try {
final baseDownloadUrl = session!.getDownloadUrl(jmapUrl: dynamicUrlInterceptors.jmapUrl);
@@ -728,6 +736,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
accountId,
detailedEmail
);
} else if (currentEmail?.id != null && currentEmailLoaded.value != null) {
_threadDetailController?.cacheEmailLoaded(
currentEmail!.id!,
currentEmailLoaded.value!,
);
}
final isShowMessageReadReceipt = success.emailCurrent
@@ -746,7 +759,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
_jumpScrollViewToTopOfEmail();
}
if (currentEmail?.threadId != null &&
currentEmail?.id == mailboxDashBoardController.selectedEmail.value?.id) {
currentEmail?.id == mailboxDashBoardController.selectedEmail.value?.id &&
success is! GetEmailContentFromThreadCacheSuccess) {
mailboxDashBoardController.dispatchThreadDetailUIAction(
LoadThreadDetailAfterSelectedEmailAction(
currentEmail!.threadId!,