From a68afa51cfe3471a5b0b1568835e0b2d8fdc9cee Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 17 Oct 2025 12:51:19 +0700 Subject: [PATCH 1/2] 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 bd8840abe8..ed66d84b94 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 a6df6e89dd..f5937f911c 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 5fa7fd56de..634d41a3fe 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 adf34d843c..c4497b586d 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 1c8f6642db..c0cd5952f0 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 5842095136..33e99e61c7 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, ); From d9030084b3e4ca7c5936381582a79900ff4b45f4 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 17 Oct 2025 12:52:25 +0700 Subject: [PATCH 2/2] fix: Email subject text is cut off at the bottom on web --- lib/features/email/presentation/styles/email_subject_styles.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/features/email/presentation/styles/email_subject_styles.dart b/lib/features/email/presentation/styles/email_subject_styles.dart index b0c25b4fae..408fcb3aa6 100644 --- a/lib/features/email/presentation/styles/email_subject_styles.dart +++ b/lib/features/email/presentation/styles/email_subject_styles.dart @@ -12,7 +12,6 @@ class EmailSubjectStyles { overflow: PlatformInfo.isWeb ? TextOverflow.ellipsis : null, color: Colors.black, fontSize: 24, - height: 1, letterSpacing: -0.24, ); } \ No newline at end of file