From 6a78d57619e32d1f660ffdf74e3eae0d5871e3de Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 2 Oct 2025 16:02:49 +0700 Subject: [PATCH] TF-4082 Save text formatting menu state to user's preferences when send email or close composer --- .../presentation/composer_controller.dart | 6 +++++ .../save_text_formatting_menu_state.dart | 17 ++++++++++++ ...text_formatting_menu_state_interactor.dart | 26 +++++++++++++++++++ .../bindings/mailbox_dashboard_bindings.dart | 6 +++++ .../mailbox_dashboard_controller.dart | 2 ++ .../open_and_close_composer_extension.dart | 3 +++ ..._text_formatting_menu_state_extension.dart | 14 ++++++++++ 7 files changed, 74 insertions(+) create mode 100644 lib/features/mailbox_dashboard/domain/state/save_text_formatting_menu_state.dart create mode 100644 lib/features/mailbox_dashboard/domain/usecases/save_text_formatting_menu_state_interactor.dart diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 12c7eea12..bfc96ad1a 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -103,6 +103,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/validate_premium_storage_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_text_formatting_menu_state_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; @@ -1446,6 +1447,11 @@ class ComposerController extends BaseController } void _closeComposerAction({dynamic result, bool closeOverlays = false}) { + if (PlatformInfo.isWeb && richTextWebController != null) { + mailboxDashBoardController.updateTextFormattingMenuState( + richTextWebController!.isFormattingOptionsEnabled, + ); + } mailboxDashBoardController.closeComposer( result: result, closeOverlays: closeOverlays, diff --git a/lib/features/mailbox_dashboard/domain/state/save_text_formatting_menu_state.dart b/lib/features/mailbox_dashboard/domain/state/save_text_formatting_menu_state.dart new file mode 100644 index 000000000..17d8d9eba --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/state/save_text_formatting_menu_state.dart @@ -0,0 +1,17 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class SavingTextFormattingMenuState extends LoadingState {} + +class SaveTextFormattingMenuStateSuccess extends UIState { + final bool isDisplayed; + + SaveTextFormattingMenuStateSuccess(this.isDisplayed); + + @override + List get props => [isDisplayed]; +} + +class SaveTextFormattingMenuStateFailure extends FeatureFailure { + SaveTextFormattingMenuStateFailure(dynamic exception) : super(exception: exception); +} diff --git a/lib/features/mailbox_dashboard/domain/usecases/save_text_formatting_menu_state_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/save_text_formatting_menu_state_interactor.dart new file mode 100644 index 000000000..6cafbd0a9 --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/usecases/save_text_formatting_menu_state_interactor.dart @@ -0,0 +1,26 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/save_text_formatting_menu_state.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/text_formatting_menu_config.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; + +class SaveTextFormattingMenuStateInteractor { + final ManageAccountRepository _manageAccountRepository; + + SaveTextFormattingMenuStateInteractor(this._manageAccountRepository); + + Stream> execute(bool isDisplayed) async* { + try { + yield Right(SavingTextFormattingMenuState()); + final preferencesSetting = await _manageAccountRepository.toggleLocalSettingsState( + TextFormattingMenuConfig(isDisplayed: isDisplayed), + ); + yield Right(SaveTextFormattingMenuStateSuccess( + preferencesSetting.textFormattingMenuConfig.isDisplayed, + )); + } catch (exception) { + yield Left(SaveTextFormattingMenuStateFailure(exception)); + } + } +} diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index 1c626091e..8d3604099 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -100,6 +100,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_text_formatting_menu_state_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart'; @@ -411,6 +412,11 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), ), ); + Get.lazyPut( + () => SaveTextFormattingMenuStateInteractor( + Get.find(), + ), + ); } @override 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 81172d188..9901655a6 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -112,6 +112,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_tex import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_all_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_text_formatting_menu_state_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/download_ui_action.dart'; @@ -269,6 +270,7 @@ class MailboxDashBoardController extends ReloadableController CreateNewEmailRuleFilterInteractor? createNewEmailRuleFilterInteractor; SaveLanguageInteractor? saveLanguageInteractor; GetTextFormattingMenuStateInteractor? getTextFormattingMenuStateInteractor; + SaveTextFormattingMenuStateInteractor? saveTextFormattingMenuStateInteractor; final scaffoldKey = GlobalKey(); final selectedMailbox = Rxn(); diff --git a/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart index 03f36bfd6..df7264ffa 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart @@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/email/presentation/extensions/composer_ar import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_text_formatting_menu_state_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_detail_ui_action.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -125,6 +126,8 @@ extension OpenAndCloseComposerExtension on MailboxDashBoardController { if (composerId != null) { await removeComposerCacheByIdOnWeb(composerId); } + + saveTextFormattingMenuState(); } void _handleResultAfterCloseComposer(dynamic result) { diff --git a/lib/features/mailbox_dashboard/presentation/extensions/update_text_formatting_menu_state_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/update_text_formatting_menu_state_extension.dart index 9b6f48179..d16432473 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/update_text_formatting_menu_state_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/update_text_formatting_menu_state_extension.dart @@ -1,4 +1,6 @@ +import 'package:core/utils/app_logger.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_text_formatting_menu_state_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_text_formatting_menu_state_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -13,5 +15,17 @@ extension UpdateTextFormattingMenuStateExtension on MailboxDashBoardController { void updateTextFormattingMenuState(bool isDisplayed) { isTextFormattingMenuOpened.value = isDisplayed; + log('$runtimeType::updateTextFormattingMenuState(): isDisplayed: $isDisplayed'); + } + + void saveTextFormattingMenuState() { + saveTextFormattingMenuStateInteractor = + getBinding(); + if (saveTextFormattingMenuStateInteractor == null) return; + + final isDisplayed = isTextFormattingMenuOpened.value; + consumeState( + saveTextFormattingMenuStateInteractor!.execute(isDisplayed), + ); } }