fix: Duplicated email subject after enabling thread mode

This commit is contained in:
dab246
2025-10-17 12:51:19 +07:00
committed by Dat H. Pham
parent 11d47b5b00
commit 1d57f37a9a
6 changed files with 32 additions and 10 deletions
@@ -3273,6 +3273,9 @@ class MailboxDashBoardController extends ReloadableController
jmap.State? get currentEmailState => _currentEmailState;
bool get isThreadDetailedViewVisible =>
dashboardRoute.value == DashboardRoutes.threadDetailed;
void _loadAppGrid() {
if (PlatformInfo.isWeb && AppConfig.appGridDashboardAvailable) {
appGridDashboardController.loadAppDashboardConfiguration();
@@ -25,6 +25,8 @@ class UpdatedEmailKeywordsAction extends ThreadDetailUIAction {
class UpdatedThreadDetailSettingAction extends ThreadDetailUIAction {}
class ResyncThreadDetailWhenSettingChangedAction extends ThreadDetailUIAction {}
class EmailMovedAction extends ThreadDetailUIAction {
EmailMovedAction({
required this.emailId,
@@ -1,10 +1,19 @@
import 'package:core/utils/platform_info.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/thread_detail_manager.dart';
extension RefreshThreadDetailOnSettingChanged on ThreadDetailManager {
void refreshThreadDetailOnSettingChanged() {
if (threadDetailWasEnabled != isThreadDetailEnabled) {
threadDetailWasEnabled = isThreadDetailEnabled;
mailboxDashBoardController.selectedEmail.refresh();
if (PlatformInfo.isWeb &&
mailboxDashBoardController.isThreadDetailedViewVisible) {
mailboxDashBoardController.dispatchThreadDetailUIAction(
ResyncThreadDetailWhenSettingChangedAction(),
);
} else {
mailboxDashBoardController.selectedEmail.refresh();
}
}
}
}
@@ -8,7 +8,6 @@ import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action
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';
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart';
import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_thread_by_id_interactor.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/thread_detail_controller.dart';
@@ -16,7 +15,6 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_
extension ThreadDetailOnSelectedEmailUpdated on ThreadDetailController {
void onSelectedEmailUpdated(
PresentationEmail? selectedEmail,
GetThreadByIdInteractor getThreadByIdInteractor,
BuildContext? context,
) {
if (selectedEmail?.id == null) {
@@ -76,4 +74,19 @@ extension ThreadDetailOnSelectedEmailUpdated on ThreadDetailController {
Right(PreloadEmailsByIdsSuccess([selectedEmail])),
]));
}
void resyncThreadDetailWhenSettingChanged() {
final selectedEmail = mailboxDashBoardController.selectedEmail.value;
if (selectedEmail == null) return;
emailIdsPresentation.clear();
scrollController ??= ScrollController();
mailboxDashBoardController.dispatchEmailUIAction(
DisposePreviousExpandedEmailAction(selectedEmail.id!),
);
loadThreadOnThreadChanged = isThreadDetailEnabled;
_preloadSelectedEmail(selectedEmail);
}
}
@@ -177,7 +177,6 @@ class ThreadDetailController extends BaseController {
ever(mailboxDashBoardController.selectedEmail, (presentationEmail) async {
onSelectedEmailUpdated(
presentationEmail,
_getEmailIdsByThreadIdInteractor,
currentContext,
);
});
@@ -206,6 +205,8 @@ class ThreadDetailController extends BaseController {
refocusMailShortcutFocus();
} else if (action is ClearMailViewKeyboardShortcutFocusAction) {
clearMailShortcutFocus();
} else if (action is ResyncThreadDetailWhenSettingChangedAction) {
resyncThreadDetailWhenSettingChanged();
}
// Reset [threadDetailUIAction] to original value
mailboxDashBoardController.dispatchThreadDetailUIAction(
@@ -11,7 +11,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
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';
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart';
import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_thread_by_id_interactor.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
@@ -21,17 +20,14 @@ import 'thread_detail_on_selected_email_updated_test.mocks.dart';
@GenerateNiceMocks([
MockSpec<ThreadDetailController>(),
MockSpec<GetThreadByIdInteractor>(),
MockSpec<MailboxDashBoardController>(),
])
void main() {
late MockThreadDetailController threadDetailController;
late MockGetThreadByIdInteractor getThreadByIdInteractor;
late MockMailboxDashBoardController mailboxDashboardController;
setUp(() {
threadDetailController = MockThreadDetailController();
getThreadByIdInteractor = MockGetThreadByIdInteractor();
mailboxDashboardController = MockMailboxDashBoardController();
when(threadDetailController.session)
.thenReturn(SessionFixtures.aliceSession);
@@ -51,7 +47,6 @@ void main() {
// act
threadDetailController.onSelectedEmailUpdated(
null,
getThreadByIdInteractor,
null,
);
@@ -76,7 +71,6 @@ void main() {
// act
threadDetailController.onSelectedEmailUpdated(
selectedEmail,
getThreadByIdInteractor,
null,
);