From 1d57f37a9a3159e9c10a8bab1a168c693bca11e6 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 17 Oct 2025 12:51:19 +0700 Subject: [PATCH] fix: Duplicated email subject after enabling thread mode --- .../mailbox_dashboard_controller.dart | 3 +++ .../action/thread_detail_ui_action.dart | 2 ++ ...efresh_thread_detail_on_setting_changed.dart | 11 ++++++++++- ...thread_detail_on_selected_email_updated.dart | 17 +++++++++++++++-- .../presentation/thread_detail_controller.dart | 3 ++- ...d_detail_on_selected_email_updated_test.dart | 6 ------ 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index bd8840abe..ed66d84b9 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -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(); diff --git a/lib/features/thread_detail/presentation/action/thread_detail_ui_action.dart b/lib/features/thread_detail/presentation/action/thread_detail_ui_action.dart index a6df6e89d..f5937f911 100644 --- a/lib/features/thread_detail/presentation/action/thread_detail_ui_action.dart +++ b/lib/features/thread_detail/presentation/action/thread_detail_ui_action.dart @@ -25,6 +25,8 @@ class UpdatedEmailKeywordsAction extends ThreadDetailUIAction { class UpdatedThreadDetailSettingAction extends ThreadDetailUIAction {} +class ResyncThreadDetailWhenSettingChangedAction extends ThreadDetailUIAction {} + class EmailMovedAction extends ThreadDetailUIAction { EmailMovedAction({ required this.emailId, diff --git a/lib/features/thread_detail/presentation/extension/refresh_thread_detail_on_setting_changed.dart b/lib/features/thread_detail/presentation/extension/refresh_thread_detail_on_setting_changed.dart index 5fa7fd56d..634d41a3f 100644 --- a/lib/features/thread_detail/presentation/extension/refresh_thread_detail_on_setting_changed.dart +++ b/lib/features/thread_detail/presentation/extension/refresh_thread_detail_on_setting_changed.dart @@ -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(); + } } } } \ No newline at end of file diff --git a/lib/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart b/lib/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart index adf34d843..c4497b586 100644 --- a/lib/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart +++ b/lib/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart @@ -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); + } } \ No newline at end of file diff --git a/lib/features/thread_detail/presentation/thread_detail_controller.dart b/lib/features/thread_detail/presentation/thread_detail_controller.dart index 1c8f6642d..c0cd5952f 100644 --- a/lib/features/thread_detail/presentation/thread_detail_controller.dart +++ b/lib/features/thread_detail/presentation/thread_detail_controller.dart @@ -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( diff --git a/test/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated_test.dart b/test/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated_test.dart index 584209513..33e99e61c 100644 --- a/test/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated_test.dart +++ b/test/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated_test.dart @@ -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(), - MockSpec(), MockSpec(), ]) 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, );