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; jmap.State? get currentEmailState => _currentEmailState;
bool get isThreadDetailedViewVisible =>
dashboardRoute.value == DashboardRoutes.threadDetailed;
void _loadAppGrid() { void _loadAppGrid() {
if (PlatformInfo.isWeb && AppConfig.appGridDashboardAvailable) { if (PlatformInfo.isWeb && AppConfig.appGridDashboardAvailable) {
appGridDashboardController.loadAppDashboardConfiguration(); appGridDashboardController.loadAppDashboardConfiguration();
@@ -25,6 +25,8 @@ class UpdatedEmailKeywordsAction extends ThreadDetailUIAction {
class UpdatedThreadDetailSettingAction extends ThreadDetailUIAction {} class UpdatedThreadDetailSettingAction extends ThreadDetailUIAction {}
class ResyncThreadDetailWhenSettingChangedAction extends ThreadDetailUIAction {}
class EmailMovedAction extends ThreadDetailUIAction { class EmailMovedAction extends ThreadDetailUIAction {
EmailMovedAction({ EmailMovedAction({
required this.emailId, 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'; import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_manager.dart';
extension RefreshThreadDetailOnSettingChanged on ThreadDetailManager { extension RefreshThreadDetailOnSettingChanged on ThreadDetailManager {
void refreshThreadDetailOnSettingChanged() { void refreshThreadDetailOnSettingChanged() {
if (threadDetailWasEnabled != isThreadDetailEnabled) { if (threadDetailWasEnabled != isThreadDetailEnabled) {
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/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_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/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/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/extension/close_thread_detail_action.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.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 { extension ThreadDetailOnSelectedEmailUpdated on ThreadDetailController {
void onSelectedEmailUpdated( void onSelectedEmailUpdated(
PresentationEmail? selectedEmail, PresentationEmail? selectedEmail,
GetThreadByIdInteractor getThreadByIdInteractor,
BuildContext? context, BuildContext? context,
) { ) {
if (selectedEmail?.id == null) { if (selectedEmail?.id == null) {
@@ -76,4 +74,19 @@ extension ThreadDetailOnSelectedEmailUpdated on ThreadDetailController {
Right(PreloadEmailsByIdsSuccess([selectedEmail])), 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 { ever(mailboxDashBoardController.selectedEmail, (presentationEmail) async {
onSelectedEmailUpdated( onSelectedEmailUpdated(
presentationEmail, presentationEmail,
_getEmailIdsByThreadIdInteractor,
currentContext, currentContext,
); );
}); });
@@ -206,6 +205,8 @@ class ThreadDetailController extends BaseController {
refocusMailShortcutFocus(); refocusMailShortcutFocus();
} else if (action is ClearMailViewKeyboardShortcutFocusAction) { } else if (action is ClearMailViewKeyboardShortcutFocusAction) {
clearMailShortcutFocus(); clearMailShortcutFocus();
} else if (action is ResyncThreadDetailWhenSettingChangedAction) {
resyncThreadDetailWhenSettingChanged();
} }
// Reset [threadDetailUIAction] to original value // Reset [threadDetailUIAction] to original value
mailboxDashBoardController.dispatchThreadDetailUIAction( 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/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_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/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/extension/thread_detail_on_selected_email_updated.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.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([ @GenerateNiceMocks([
MockSpec<ThreadDetailController>(), MockSpec<ThreadDetailController>(),
MockSpec<GetThreadByIdInteractor>(),
MockSpec<MailboxDashBoardController>(), MockSpec<MailboxDashBoardController>(),
]) ])
void main() { void main() {
late MockThreadDetailController threadDetailController; late MockThreadDetailController threadDetailController;
late MockGetThreadByIdInteractor getThreadByIdInteractor;
late MockMailboxDashBoardController mailboxDashboardController; late MockMailboxDashBoardController mailboxDashboardController;
setUp(() { setUp(() {
threadDetailController = MockThreadDetailController(); threadDetailController = MockThreadDetailController();
getThreadByIdInteractor = MockGetThreadByIdInteractor();
mailboxDashboardController = MockMailboxDashBoardController(); mailboxDashboardController = MockMailboxDashBoardController();
when(threadDetailController.session) when(threadDetailController.session)
.thenReturn(SessionFixtures.aliceSession); .thenReturn(SessionFixtures.aliceSession);
@@ -51,7 +47,6 @@ void main() {
// act // act
threadDetailController.onSelectedEmailUpdated( threadDetailController.onSelectedEmailUpdated(
null, null,
getThreadByIdInteractor,
null, null,
); );
@@ -76,7 +71,6 @@ void main() {
// act // act
threadDetailController.onSelectedEmailUpdated( threadDetailController.onSelectedEmailUpdated(
selectedEmail, selectedEmail,
getThreadByIdInteractor,
null, null,
); );