TF-3294 Handle open email in Sent mailbox

This commit is contained in:
DatDang
2025-08-21 15:31:25 +07:00
committed by Dat H. Pham
parent e5e1771834
commit 22be6b4b0c
6 changed files with 37 additions and 11 deletions
@@ -2,8 +2,9 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/thread_detail/domain/model/email_in_thread_detail_info.dart';
extension ListEmailInThreadDetailInfoExtension on List<EmailInThreadDetailInfo> {
List<EmailId> get emailIdsToDisplay =>
where((email) => email.isValidToDisplay)
List<EmailId> emailIdsToDisplay(bool isSentMailbox) => isSentMailbox
? map((email) => email.emailId).toList()
: where((email) => email.isValidToDisplay)
.map((email) => email.emailId)
.toList();
}
@@ -21,6 +21,7 @@ class GetThreadByIdInteractor {
AccountId accountId,
MailboxId sentMailboxId,
String ownEmailAddress, {
required bool isSentMailbox,
bool updateCurrentThreadDetail = false,
}) async* {
try {
@@ -36,7 +37,7 @@ class GetThreadByIdInteractor {
);
yield Right(GetThreadByIdSuccess(
result.emailIdsToDisplay,
result.emailIdsToDisplay(isSentMailbox),
threadId: threadId,
updateCurrentThreadDetail: updateCurrentThreadDetail,
emailsInThreadDetailInfo: result,
@@ -51,6 +52,8 @@ class GetThreadByIdInteractor {
accountId,
sentMailboxId,
ownEmailAddress,
isSentMailbox: isSentMailbox,
updateCurrentThreadDetail: updateCurrentThreadDetail,
),
updateCurrentThreadDetail: updateCurrentThreadDetail,
));
@@ -41,10 +41,14 @@ class EmailMovedAction extends ThreadDetailUIAction {
}
class LoadThreadDetailAfterSelectedEmailAction extends ThreadDetailUIAction {
LoadThreadDetailAfterSelectedEmailAction(this.threadId);
LoadThreadDetailAfterSelectedEmailAction(
this.threadId, {
required this.isSentMailbox,
});
final ThreadId threadId;
final bool isSentMailbox;
@override
List<Object?> get props => [threadId];
List<Object?> get props => [threadId, isSentMailbox];
}
@@ -1,4 +1,6 @@
import 'package:core/utils/platform_info.dart';
import 'package:model/extensions/presentation_email_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:model/email/email_in_thread_status.dart';
@@ -24,8 +26,14 @@ extension HandleGetEmailsByIdsSuccess on ThreadDetailController {
if (isThreadDetailEnabled && isInternetConnected) {
loadThreadOnThreadChanged = false;
final mailboxContain = email.findMailboxContain(
mailboxDashBoardController.mapMailboxById,
);
mailboxDashBoardController.dispatchThreadDetailUIAction(
LoadThreadDetailAfterSelectedEmailAction(email.threadId!),
LoadThreadDetailAfterSelectedEmailAction(
email.threadId!,
isSentMailbox: mailboxContain?.isSent == true,
),
);
} else {
emailIdsPresentation[emailId] = emailIdsPresentation[emailId]?.copyWith(
@@ -1,6 +1,8 @@
import 'package:dartz/dartz.dart';
import 'package:flutter/widgets.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/presentation_email_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
import 'package:tmail_ui_user/features/thread/presentation/extensions/list_presentation_email_extensions.dart';
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_emails_by_ids_state.dart';
@@ -35,9 +37,13 @@ extension ThreadDetailOnSelectedEmailUpdated on ThreadDetailController {
_preloadSelectedEmail(selectedEmail);
if (isThreadDetailEnabled && selectedEmail.threadId != null) {
final mailboxContain = selectedEmail.findMailboxContain(
mailboxDashBoardController.mapMailboxById,
);
mailboxDashBoardController.dispatchThreadDetailUIAction(
LoadThreadDetailAfterSelectedEmailAction(
selectedEmail.threadId!,
isSentMailbox: mailboxContain?.isSent == true,
)
);
}
@@ -96,18 +96,19 @@ class ThreadDetailController extends BaseController {
EmailProperty.messageId,
});
final cachedEmailLoaded = <EmailId, EmailLoaded>{};
late final _threadGetDebouncer = Debouncer<ThreadId?>(
late final _threadGetDebouncer = Debouncer<({ThreadId? threadId, bool isSentMailbox})?>(
const Duration(milliseconds: 500),
initialValue: null,
checkEquality: false,
onChanged: (threadId) {
if (_validateLoadThread(threadId)) {
onChanged: (value) {
if (_validateLoadThread(value?.threadId)) {
consumeState(_getEmailIdsByThreadIdInteractor.execute(
threadId!,
value!.threadId!,
session!,
accountId!,
sentMailboxId!,
ownEmailAddress!,
isSentMailbox: value.isSentMailbox,
));
}
},
@@ -189,7 +190,10 @@ class ThreadDetailController extends BaseController {
} else if (action is EmailMovedAction) {
handleEmailMovedAction(action);
} else if (action is LoadThreadDetailAfterSelectedEmailAction) {
_threadGetDebouncer.value = action.threadId;
_threadGetDebouncer.value = (
threadId: action.threadId,
isSentMailbox: action.isSentMailbox,
);
}
// Reset [threadDetailUIAction] to original value
mailboxDashBoardController.dispatchThreadDetailUIAction(