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
@@ -1,11 +1,7 @@
import 'package:get/get.dart';
import 'package:model/email/email_action_type.dart';
import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart';
import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart';
import 'package:model/email/email_in_thread_status.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/thread_detail_on_email_action_click.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
extension ToggleThreadDetailCollapeExpand on ThreadDetailController {
@@ -18,22 +14,14 @@ extension ToggleThreadDetailCollapeExpand on ThreadDetailController {
emailIdsPresentation[emailId] = presentationEmail.copyWith(
emailInThreadStatus: EmailInThreadStatus.collapsed,
);
mailboxDashBoardController.dispatchEmailUIAction(
CollapseEmailInThreadDetailAction(emailId),
);
currentExpandedEmailId.value = null;
return;
}
final isInitialized = Get.isRegistered<SingleEmailController>(
tag: emailId.id.value,
);
if (!isInitialized) {
EmailBindings(currentEmailId: presentationEmail.id).dependencies();
} else {
focusExpandedEmail(emailId);
threadDetailOnEmailActionClick(
presentationEmail,
EmailActionType.markAsRead,
);
}
EmailBindings(currentEmailId: presentationEmail.id).dependencies();
for (var key in emailIdsPresentation.keys) {
if (emailIdsPresentation[key] == null) continue;
@@ -49,6 +37,9 @@ extension ToggleThreadDetailCollapeExpand on ThreadDetailController {
emailIdsPresentation[key] = emailIdsPresentation[key]?.copyWith(
emailInThreadStatus: EmailInThreadStatus.collapsed,
);
mailboxDashBoardController.dispatchEmailUIAction(
CollapseEmailInThreadDetailAction(key),
);
}
}
}
@@ -0,0 +1,15 @@
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
extension UpdateCachedEmailLoaded on ThreadDetailController {
void cacheEmailLoaded(EmailId emailId, EmailLoaded emailLoaded) {
const cacheLimit = 20;
while (cachedEmailLoaded[emailId] == null &&
cachedEmailLoaded.length >= cacheLimit) {
cachedEmailLoaded.remove(cachedEmailLoaded.keys.first);
}
cachedEmailLoaded[emailId] = emailLoaded;
}
}
@@ -89,6 +89,7 @@ class ThreadDetailController extends BaseController {
IndividualHeaderIdentifier.listPostHeader.value,
IndividualHeaderIdentifier.listUnsubscribeHeader.value,
});
final cachedEmailLoaded = <EmailId, EmailLoaded>{};
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final searchEmailController = Get.find<SearchEmailController>();
@@ -221,6 +222,7 @@ class ThreadDetailController extends BaseController {
scrollController = null;
currentExpandedEmailId.value = null;
currentEmailLoaded.value = null;
cachedEmailLoaded.clear();
}
@override