From bfe80bdc7806420c94e79edad5a149fe4e4f18b0 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 17 Oct 2025 10:08:43 +0700 Subject: [PATCH] fix: Email content disappears after marking as `star/unstar` when thread is disabled --- .../controller/single_email_controller.dart | 35 +++++++++---------- lib/l10n/intl_messages.arb | 14 +++++++- lib/main/localizations/app_localizations.dart | 14 ++++++++ lib/main/utils/toast_manager.dart | 6 ++++ .../presentation_email_extension.dart | 5 +++ 5 files changed, 55 insertions(+), 19 deletions(-) diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 484785f13..5af9dace6 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -228,6 +228,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin { GlobalObjectKey? get htmlViewKey => _threadDetailController?.expandedEmailHtmlViewKey; + bool get isThreadDetailEnabled => + _threadDetailController?.isThreadDetailEnabled == true; + SingleEmailController( this._getEmailContentInteractor, this._markAsEmailReadInteractor, @@ -1343,32 +1346,28 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } } - void markAsStarEmail( - PresentationEmail presentationEmail, - MarkStarAction markStarAction, - ) { - if (accountId != null && session != null) { - consumeState(_markAsStarEmailInteractor.execute( - session!, - accountId!, - presentationEmail.id!, - markStarAction, - )); - } - } - void _markAsEmailStarSuccess(MarkAsStarEmailSuccess success) { - final newEmail = currentEmail?.updateKeywords({ - KeyWordIdentifier.emailFlagged: success.markStarAction == MarkStarAction.markStar, - }); + final newKeywords = { + KeyWordIdentifier.emailFlagged: + success.markStarAction == MarkStarAction.markStar, + }; + final newEmail = currentEmail?.updateKeywords(newKeywords); final emailId = newEmail?.id; if (emailId == null) return; - _threadDetailController?.emailIdsPresentation[emailId] = newEmail; + + if (PlatformInfo.isMobile && !isThreadDetailEnabled) { + mailboxDashBoardController.selectedEmail.value?.resyncKeywords(newKeywords); + } else { + _threadDetailController?.emailIdsPresentation[emailId] = newEmail; + } + mailboxDashBoardController.updateEmailFlagByEmailIds( [emailId], markStarAction: success.markStarAction, ); + + toastManager.showMessageSuccess(success); } void handleEmailAction(BuildContext context, PresentationEmail presentationEmail, EmailActionType actionType) { diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index d3b1d4af4..b3f2f8399 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2025-10-14T15:18:48.964794", + "@@last_modified": "2025-10-17T09:52:08.303266", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -4925,5 +4925,17 @@ "placeholders": { "count": {} } + }, + "mailHasBeenStarred": "Mail has been starred", + "@mailHasBeenStarred": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "mailHasBeenUnstarred": "Mail has been unstarred", + "@mailHasBeenUnstarred": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index fe4b835f5..3a0dd6ec4 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -5198,4 +5198,18 @@ class AppLocalizations { args: [count], ); } + + String get mailHasBeenStarred { + return Intl.message( + 'Mail has been starred', + name: 'mailHasBeenStarred', + ); + } + + String get mailHasBeenUnstarred { + return Intl.message( + 'Mail has been unstarred', + name: 'mailHasBeenUnstarred', + ); + } } diff --git a/lib/main/utils/toast_manager.dart b/lib/main/utils/toast_manager.dart index be0c826bb..6fb0ac525 100644 --- a/lib/main/utils/toast_manager.dart +++ b/lib/main/utils/toast_manager.dart @@ -12,11 +12,13 @@ import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.da import 'package:jmap_dart_client/jmap/core/error/method/exception/error_method_response_exception.dart'; import 'package:jmap_dart_client/jmap/core/error/set_error.dart'; import 'package:model/email/email_action_type.dart'; +import 'package:model/email/mark_star_action.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart'; import 'package:tmail_ui_user/features/email/domain/exceptions/calendar_event_exceptions.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reply_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/parse_email_by_blob_id_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/preview_email_from_eml_file_state.dart'; import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; @@ -244,6 +246,10 @@ class ToastManager { } else { message = appLocalizations.you_are_changed_your_identity_successfully; } + } else if (success is MarkAsStarEmailSuccess) { + message = success.markStarAction == MarkStarAction.markStar + ? appLocalizations.mailHasBeenStarred + : appLocalizations.mailHasBeenUnstarred; } log('ToastManager::showMessageSuccess: Message: $message'); if (message?.trim().isNotEmpty == true) { diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart index 86cbb8b09..a760800d2 100644 --- a/model/lib/extensions/presentation_email_extension.dart +++ b/model/lib/extensions/presentation_email_extension.dart @@ -202,4 +202,9 @@ extension PresentationEmailExtension on PresentationEmail { MailboxId? get firstMailboxIdAvailable => mailboxIds?.entries.firstWhereOrNull((element) => element.value)?.key; + + void resyncKeywords(Map newKeywords) { + keywords?.addAll(newKeywords); + keywords?.removeWhere((key, value) => !value); + } } \ No newline at end of file