From 10038a3836c544f3cd7ccffbb2654d36100b10fc Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 9 Dec 2025 13:43:43 +0700 Subject: [PATCH] TF-4193 Handle multi click to enable Label visibility feature --- .../datasource/manage_account_datasource.dart | 4 ++ .../manage_account_datasource_impl.dart | 23 ++++++++++ .../data/local/setting_cache_manager.dart | 18 ++++++++ .../manage_account_repository_impl.dart | 10 ++++ .../repository/manage_account_repository.dart | 4 ++ .../state/get_label_visibility_state.dart | 17 +++++++ .../state/save_label_visibility_state.dart | 10 ++++ .../get_label_visibility_interactor.dart | 23 ++++++++++ .../save_label_visibility_interactor.dart | 23 ++++++++++ .../bindings/setting_interactor_bindings.dart | 13 +++++- ...label_visibility_in_setting_extension.dart | 46 +++++++++++++++++++ .../manage_account_dashboard_controller.dart | 13 ++++++ .../menu/settings/setting_app_bar.dart | 3 ++ .../settings/setting_first_level_app_bar.dart | 24 +++++++--- .../menu/settings/settings_view.dart | 43 +++++++++++------ .../bindings/preferences_bindings.dart | 14 +++--- .../preferences_interactors_bindings.dart | 2 + .../preferences/preferences_controller.dart | 9 ++-- .../preferences/preferences_view.dart | 31 +++++++++++-- .../widgets/setting_header_widget.dart | 28 +++++++---- lib/l10n/intl_messages.arb | 6 +++ lib/main/bindings/local/local_bindings.dart | 2 + lib/main/localizations/app_localizations.dart | 7 +++ 23 files changed, 330 insertions(+), 43 deletions(-) create mode 100644 lib/features/manage_account/data/local/setting_cache_manager.dart create mode 100644 lib/features/manage_account/domain/state/get_label_visibility_state.dart create mode 100644 lib/features/manage_account/domain/state/save_label_visibility_state.dart create mode 100644 lib/features/manage_account/domain/usecases/get_label_visibility_interactor.dart create mode 100644 lib/features/manage_account/domain/usecases/save_label_visibility_interactor.dart create mode 100644 lib/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart diff --git a/lib/features/manage_account/data/datasource/manage_account_datasource.dart b/lib/features/manage_account/data/datasource/manage_account_datasource.dart index b0888e3f4..d9caebee6 100644 --- a/lib/features/manage_account/data/datasource/manage_account_datasource.dart +++ b/lib/features/manage_account/data/datasource/manage_account_datasource.dart @@ -12,4 +12,8 @@ abstract class ManageAccountDataSource { Future getLocalSettings(); Future getAiScribeConfigLocalSettings(); + + Future getLabelVisibility(); + + Future saveLabelVisibility(bool visible); } diff --git a/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart b/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart index c0f2b088b..ee076aac5 100644 --- a/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart +++ b/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart @@ -4,6 +4,7 @@ import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_acc import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/setting_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_setting.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/spam_report_config.dart'; @@ -15,11 +16,13 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource { final LanguageCacheManager _languageCacheManager; final PreferencesSettingManager _preferencesSettingManager; + final SettingCacheManager _settingCacheManager; final ExceptionThrower _exceptionThrower; ManageAccountDataSourceImpl( this._languageCacheManager, this._preferencesSettingManager, + this._settingCacheManager, this._exceptionThrower ); @@ -71,4 +74,24 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource { return await _preferencesSettingManager.getAIScribeConfig(); }).catchError(_exceptionThrower.throwException); } + + @override + Future getLabelVisibility() { + return Future.sync(() async { + return await _settingCacheManager.getLabelVisibility(); + }).catchError((error, stackTrace) async { + await _exceptionThrower.throwException(error, stackTrace); + throw error; + }); + } + + @override + Future saveLabelVisibility(bool visible) { + return Future.sync(() async { + return await _settingCacheManager.saveLabelVisibility(visible); + }).catchError((error, stackTrace) async { + await _exceptionThrower.throwException(error, stackTrace); + throw error; + }); + } } \ No newline at end of file diff --git a/lib/features/manage_account/data/local/setting_cache_manager.dart b/lib/features/manage_account/data/local/setting_cache_manager.dart new file mode 100644 index 000000000..2720e76e9 --- /dev/null +++ b/lib/features/manage_account/data/local/setting_cache_manager.dart @@ -0,0 +1,18 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +class SettingCacheManager { + static const String _labelVisibilitySettingKey = 'LABEL_VISIBILITY'; + + const SettingCacheManager(this._sharedPreferences); + + final SharedPreferences _sharedPreferences; + + Future getLabelVisibility() async { + await _sharedPreferences.reload(); + return _sharedPreferences.getBool(_labelVisibilitySettingKey) ?? false; + } + + Future saveLabelVisibility(bool visible) async { + await _sharedPreferences.setBool(_labelVisibilitySettingKey, visible); + } +} diff --git a/lib/features/manage_account/data/repository/manage_account_repository_impl.dart b/lib/features/manage_account/data/repository/manage_account_repository_impl.dart index 9f8d75d9e..107b198f2 100644 --- a/lib/features/manage_account/data/repository/manage_account_repository_impl.dart +++ b/lib/features/manage_account/data/repository/manage_account_repository_impl.dart @@ -31,4 +31,14 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository { Future getAiScribeConfigLocalSettings() { return dataSource.getAiScribeConfigLocalSettings(); } + + @override + Future getLabelVisibility() { + return dataSource.getLabelVisibility(); + } + + @override + Future saveLabelVisibility(bool visible) { + return dataSource.saveLabelVisibility(visible); + } } \ No newline at end of file diff --git a/lib/features/manage_account/domain/repository/manage_account_repository.dart b/lib/features/manage_account/domain/repository/manage_account_repository.dart index ac5a75839..b6e5492fc 100644 --- a/lib/features/manage_account/domain/repository/manage_account_repository.dart +++ b/lib/features/manage_account/domain/repository/manage_account_repository.dart @@ -12,4 +12,8 @@ abstract class ManageAccountRepository { Future getLocalSettings(); Future getAiScribeConfigLocalSettings(); + + Future getLabelVisibility(); + + Future saveLabelVisibility(bool visible); } diff --git a/lib/features/manage_account/domain/state/get_label_visibility_state.dart b/lib/features/manage_account/domain/state/get_label_visibility_state.dart new file mode 100644 index 000000000..5608eb3f5 --- /dev/null +++ b/lib/features/manage_account/domain/state/get_label_visibility_state.dart @@ -0,0 +1,17 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class GettingLabelVisibility extends LoadingState {} + +class GetLabelVisibilitySuccess extends UIState { + final bool visible; + + GetLabelVisibilitySuccess(this.visible); + + @override + List get props => [...super.props, visible]; +} + +class GetLabelVisibilityFailure extends FeatureFailure { + GetLabelVisibilityFailure(dynamic exception) : super(exception: exception); +} diff --git a/lib/features/manage_account/domain/state/save_label_visibility_state.dart b/lib/features/manage_account/domain/state/save_label_visibility_state.dart new file mode 100644 index 000000000..4d5eb6ed4 --- /dev/null +++ b/lib/features/manage_account/domain/state/save_label_visibility_state.dart @@ -0,0 +1,10 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class SavingLabelVisibility extends LoadingState {} + +class SaveLabelVisibilitySuccess extends UIState {} + +class SaveLabelVisibilityFailure extends FeatureFailure { + SaveLabelVisibilityFailure(dynamic exception) : super(exception: exception); +} diff --git a/lib/features/manage_account/domain/usecases/get_label_visibility_interactor.dart b/lib/features/manage_account/domain/usecases/get_label_visibility_interactor.dart new file mode 100644 index 000000000..e3606b2cf --- /dev/null +++ b/lib/features/manage_account/domain/usecases/get_label_visibility_interactor.dart @@ -0,0 +1,23 @@ +import 'dart:core'; + +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/manage_account/domain/repository/manage_account_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/get_label_visibility_state.dart'; + +class GetLabelVisibilityInteractor { + final ManageAccountRepository _manageAccountRepository; + + GetLabelVisibilityInteractor(this._manageAccountRepository); + + Stream> execute() async* { + try { + yield Right(GettingLabelVisibility()); + final visible = await _manageAccountRepository.getLabelVisibility(); + yield Right(GetLabelVisibilitySuccess(visible)); + } catch (exception) { + yield Left(GetLabelVisibilityFailure(exception)); + } + } +} diff --git a/lib/features/manage_account/domain/usecases/save_label_visibility_interactor.dart b/lib/features/manage_account/domain/usecases/save_label_visibility_interactor.dart new file mode 100644 index 000000000..5defe732f --- /dev/null +++ b/lib/features/manage_account/domain/usecases/save_label_visibility_interactor.dart @@ -0,0 +1,23 @@ +import 'dart:core'; + +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/manage_account/domain/repository/manage_account_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/save_label_visibility_state.dart'; + +class SaveLabelVisibilityInteractor { + final ManageAccountRepository _manageAccountRepository; + + SaveLabelVisibilityInteractor(this._manageAccountRepository); + + Stream> execute({bool visible = true}) async* { + try { + yield Right(SavingLabelVisibility()); + await _manageAccountRepository.saveLabelVisibility(visible); + yield Right(SaveLabelVisibilitySuccess()); + } catch (exception) { + yield Left(SaveLabelVisibilityFailure(exception)); + } + } +} diff --git a/lib/features/manage_account/presentation/bindings/setting_interactor_bindings.dart b/lib/features/manage_account/presentation/bindings/setting_interactor_bindings.dart index 5dd3963b9..7782ce2d4 100644 --- a/lib/features/manage_account/presentation/bindings/setting_interactor_bindings.dart +++ b/lib/features/manage_account/presentation/bindings/setting_interactor_bindings.dart @@ -4,8 +4,11 @@ import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_acc import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/setting_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_label_visibility_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_label_visibility_interactor.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; class SettingInteractorBindings extends InteractorsBindings { @@ -22,13 +25,21 @@ class SettingInteractorBindings extends InteractorsBindings { () => ManageAccountDataSourceImpl( Get.find(), Get.find(), + Get.find(), Get.find(), ), ); } @override - void bindingsInteractor() {} + void bindingsInteractor() { + Get.lazyPut( + () => SaveLabelVisibilityInteractor(Get.find()), + ); + Get.lazyPut( + () => GetLabelVisibilityInteractor(Get.find()), + ); + } @override void bindingsRepository() { diff --git a/lib/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart b/lib/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart new file mode 100644 index 000000000..5c3e2a217 --- /dev/null +++ b/lib/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart @@ -0,0 +1,46 @@ +import 'package:labels/utils/labels_constants.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_label_visibility_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_label_visibility_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; +import 'package:tmail_ui_user/main/error/capability_validator.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +extension HandleSetupLabelVisibilityInSettingExtension + on ManageAccountDashBoardController { + bool get isLabelCapabilitySupported { + if (accountId.value == null || sessionCurrent == null) return false; + + return LabelsConstants.labelsCapability.isSupported( + sessionCurrent!, + accountId.value!, + ); + } + + void enableLabelVisibility() { + isLabelVisibility.value = true; + + saveLabelVisibilityInteractor = getBinding(); + if (saveLabelVisibilityInteractor != null) { + consumeState(saveLabelVisibilityInteractor!.execute()); + } + + if (currentOverlayContext != null && currentContext != null) { + appToast.showToastSuccessMessage( + currentOverlayContext!, + AppLocalizations.of(currentContext!).theLabelFeatureIsNowAvailable, + ); + } + } + + void setUpLabelVisibility() { + getLabelVisibilityInteractor = getBinding(); + if (getLabelVisibilityInteractor != null) { + consumeState(getLabelVisibilityInteractor!.execute()); + } + } + + void handleGetLabelVisibilitySuccess(bool visible) { + isLabelVisibility.value = visible; + } +} diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index 751c97a4d..65f9275c6 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -25,12 +25,16 @@ import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.d import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/export_trace_log_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/get_label_visibility_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_vacation_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_label_visibility_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_label_visibility_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vacation_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/action/dashboard_setting_action.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/bindings/email_rules_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/export_trace_log_extension.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart'; @@ -64,6 +68,8 @@ class ManageAccountDashBoardController extends ReloadableController UpdateVacationInteractor? _updateVacationInteractor; PaywallController? paywallController; GetQuotasInteractor? getQuotasInteractor; + SaveLabelVisibilityInteractor? saveLabelVisibilityInteractor; + GetLabelVisibilityInteractor? getLabelVisibilityInteractor; final accountId = Rxn(); final accountMenuItemSelected = AccountMenuItem.profiles.obs; @@ -71,6 +77,7 @@ class ManageAccountDashBoardController extends ReloadableController final vacationResponse = Rxn(); final dashboardSettingAction = Rxn(); final octetsQuota = Rxn(); + final isLabelVisibility = RxBool(false); Uri? previousUri; AccountMenuItem? selectedMenu; @@ -102,6 +109,8 @@ class ManageAccountDashBoardController extends ReloadableController handleExportTraceLogSuccess(success); } else if (success is GetQuotasSuccess) { handleGetQuotasSuccess(success); + } else if (success is GetLabelVisibilitySuccess) { + handleGetLabelVisibilitySuccess(success.visible); } else { super.handleSuccessViewState(success); } @@ -177,6 +186,10 @@ class ManageAccountDashBoardController extends ReloadableController } else if (isStorageCapabilitySupported) { getQuotas(accountId.value); } + + if (isLabelCapabilitySupported) { + setUpLabelVisibility(); + } } void _getParametersRouter() { diff --git a/lib/features/manage_account/presentation/menu/settings/setting_app_bar.dart b/lib/features/manage_account/presentation/menu/settings/setting_app_bar.dart index 0ddb0bd29..5e944d100 100644 --- a/lib/features/manage_account/presentation/menu/settings/setting_app_bar.dart +++ b/lib/features/manage_account/presentation/menu/settings/setting_app_bar.dart @@ -13,6 +13,7 @@ class SettingAppBar extends StatelessWidget { final ResponsiveUtils responsiveUtils; final VoidCallback onBackAction; final VoidCallback? onExportTraceLogAction; + final VoidCallback? onMultiClickAction; const SettingAppBar({ super.key, @@ -22,6 +23,7 @@ class SettingAppBar extends StatelessWidget { required this.responsiveUtils, required this.onBackAction, this.onExportTraceLogAction, + this.onMultiClickAction, }); @override @@ -39,6 +41,7 @@ class SettingAppBar extends StatelessWidget { imagePaths: imagePaths, responsiveUtils: responsiveUtils, onBackAction: onBackAction, + onMultiClickAction: onMultiClickAction, ); } } diff --git a/lib/features/manage_account/presentation/menu/settings/setting_first_level_app_bar.dart b/lib/features/manage_account/presentation/menu/settings/setting_first_level_app_bar.dart index b768d00ad..908184ea6 100644 --- a/lib/features/manage_account/presentation/menu/settings/setting_first_level_app_bar.dart +++ b/lib/features/manage_account/presentation/menu/settings/setting_first_level_app_bar.dart @@ -1,6 +1,7 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/theme_utils.dart'; +import 'package:core/presentation/views/button/multi_click_widget.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; @@ -11,6 +12,7 @@ class SettingFirstLevelAppBar extends StatelessWidget { final ImagePaths imagePaths; final ResponsiveUtils responsiveUtils; final VoidCallback onBackAction; + final VoidCallback? onMultiClickAction; const SettingFirstLevelAppBar({ super.key, @@ -18,12 +20,27 @@ class SettingFirstLevelAppBar extends StatelessWidget { required this.imagePaths, required this.responsiveUtils, required this.onBackAction, + this.onMultiClickAction, }); @override Widget build(BuildContext context) { final appLocalizations = AppLocalizations.of(context); + Widget titleWidget = Text( + accountMenuItem.getName(appLocalizations), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: ThemeUtils.textStyleM3BodyLarge, + ); + + if (onMultiClickAction != null) { + titleWidget = MultiClickWidget( + onMultiTap: onMultiClickAction!, + child: titleWidget, + ); + } + return Container( height: 64, padding: _getPadding(context), @@ -43,12 +60,7 @@ class SettingFirstLevelAppBar extends StatelessWidget { Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 50), - child: Text( - accountMenuItem.getName(appLocalizations), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: ThemeUtils.textStyleM3BodyLarge, - ), + child: titleWidget, ), ), ], diff --git a/lib/features/manage_account/presentation/menu/settings/settings_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_view.dart index 9bd4077e9..cf276ad06 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart'; @@ -28,21 +29,37 @@ class SettingsView extends GetWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Obx(() => SettingAppBar( - pageLevel: controller + Obx(() { + final labelVisibility = controller .manageAccountDashboardController - .settingsPageLevel - .value, - accountMenuItem: controller + .isLabelVisibility + .value; + final isLabelCapabilitySupported = controller .manageAccountDashboardController - .accountMenuItemSelected - .value, - imagePaths: controller.imagePaths, - responsiveUtils: controller.responsiveUtils, - onBackAction: () => controller.onBackSettingAction(context), - onExportTraceLogAction: () => - controller.showExportTraceLogConfirmDialog(context), - )), + .isLabelCapabilitySupported; + + final disableMultiClick = + labelVisibility || !isLabelCapabilitySupported; + + return SettingAppBar( + pageLevel: controller + .manageAccountDashboardController + .settingsPageLevel + .value, + accountMenuItem: controller + .manageAccountDashboardController + .accountMenuItemSelected + .value, + imagePaths: controller.imagePaths, + responsiveUtils: controller.responsiveUtils, + onBackAction: () => controller.onBackSettingAction(context), + onExportTraceLogAction: () => + controller.showExportTraceLogConfirmDialog(context), + onMultiClickAction: disableMultiClick + ? null + : controller.manageAccountDashboardController.enableLabelVisibility, + ); + }), Obx(() { final dashboard = controller.manageAccountDashboardController; final vacation = dashboard.vacationResponse.value; diff --git a/lib/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart b/lib/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart index 1e80d931c..d9e99d8ff 100644 --- a/lib/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart +++ b/lib/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart @@ -13,18 +13,18 @@ class PreferencesBindings extends Bindings { void dependencies() { PreferencesInteractorsBindings().dependencies(); - Get.lazyPut(() => PreferencesController( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - )); - Get.lazyPut(() => GetLocalSettingsInteractor( Get.find(), )); Get.lazyPut(() => UpdateLocalSettingsInteractor( Get.find(), )); + + Get.lazyPut(() => PreferencesController( + Get.find(), + Get.find(), + Get.find(), + Get.find(), + )); } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart b/lib/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart index 09dd63546..ac517245e 100644 --- a/lib/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart +++ b/lib/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart @@ -4,6 +4,7 @@ import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_acc import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/setting_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_interactor.dart'; @@ -44,6 +45,7 @@ class PreferencesInteractorsBindings extends InteractorsBindings { Get.lazyPut(() => ManageAccountDataSourceImpl( Get.find(), Get.find(), + Get.find(), Get.find(), ), tag: composerId); } diff --git a/lib/features/manage_account/presentation/preferences/preferences_controller.dart b/lib/features/manage_account/presentation/preferences/preferences_controller.dart index 45de856eb..fd86cb9da 100644 --- a/lib/features/manage_account/presentation/preferences/preferences_controller.dart +++ b/lib/features/manage_account/presentation/preferences/preferences_controller.dart @@ -48,7 +48,7 @@ class PreferencesController extends BaseController { (failure) => false, (success) => success is GettingServerSetting || success is UpdatingServerSetting); - final _manageAccountDashBoardController = Get.find(); + final accountDashboardController = Get.find(); bool get isAICapabilitySupported { return _manageAccountDashBoardController.isAICapabilitySupported; @@ -128,7 +128,7 @@ class PreferencesController extends BaseController { void _getSettingOption() { consumeState(_getLocalSettingInteractor.execute()); - final accountId = _manageAccountDashBoardController.accountId.value; + final accountId = accountDashboardController.accountId.value; if (accountId != null) { consumeState(_getServerSettingInteractor.execute(accountId)); } else { @@ -196,8 +196,8 @@ class PreferencesController extends BaseController { break; } - final session = _manageAccountDashBoardController.sessionCurrent; - final accountId = _manageAccountDashBoardController.accountId.value; + final session = accountDashboardController.sessionCurrent; + final accountId = accountDashboardController.accountId.value; if (session != null && accountId != null && newSettingOption != null) { consumeState( _updateServerSettingInteractor.execute( @@ -215,7 +215,6 @@ class PreferencesController extends BaseController { } } - @override void onClose() { _appLifecycleListener?.dispose(); diff --git a/lib/features/manage_account/presentation/preferences/preferences_view.dart b/lib/features/manage_account/presentation/preferences/preferences_view.dart index aaf93231c..492861ad2 100644 --- a/lib/features/manage_account/presentation/preferences/preferences_view.dart +++ b/lib/features/manage_account/presentation/preferences/preferences_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/base/setting_detail_view_builder.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_setup_label_visibility_in_setting_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart'; @@ -51,13 +52,34 @@ class PreferencesView extends GetWidget with AppLoaderMix crossAxisAlignment: CrossAxisAlignment.start, children: [ if (controller.responsiveUtils.isWebDesktop(context)) - const SettingHeaderWidget( - menuItem: AccountMenuItem.preferences, - padding: EdgeInsets.only(bottom: 21), + Obx( + () { + final labelVisibility = controller + .accountDashboardController.isLabelVisibility.value; + + final isLabelCapabilitySupported = controller + .accountDashboardController + .isLabelCapabilitySupported; + + final disableMultiClick = + labelVisibility || !isLabelCapabilitySupported; + + return SettingHeaderWidget( + menuItem: AccountMenuItem.preferences, + padding: const EdgeInsets.only(bottom: 21), + onMultiClickAction: disableMultiClick + ? null + : controller.accountDashboardController + .enableLabelVisibility, + ); + }, ), Obx(() { final settingOption = controller.settingOption.value; final localSettingOption = controller.localSettings.value; + final isLabelVisibility = controller + .accountDashboardController + .isLabelVisibility; if (settingOption == null && localSettingOption.configs.isEmpty) { @@ -75,12 +97,15 @@ class PreferencesView extends GetWidget with AppLoaderMix ...PreferencesOptionType.values.where( (type) => type.isLocal && + type != PreferencesOptionType.label && (type != PreferencesOptionType.aiScribe || controller.isAIScribeCapabilityAvailable), ), if (settingOption != null && controller.isAICapabilitySupported) PreferencesOptionType.aiNeedsAction, + if (isLabelVisibility.isTrue) + PreferencesOptionType.label, ]; return Expanded( diff --git a/lib/features/manage_account/presentation/widgets/setting_header_widget.dart b/lib/features/manage_account/presentation/widgets/setting_header_widget.dart index 7c1bf32ab..773a4ed7f 100644 --- a/lib/features/manage_account/presentation/widgets/setting_header_widget.dart +++ b/lib/features/manage_account/presentation/widgets/setting_header_widget.dart @@ -1,5 +1,6 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/utils/theme_utils.dart'; +import 'package:core/presentation/views/button/multi_click_widget.dart'; import 'package:flutter/material.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -8,27 +9,38 @@ class SettingHeaderWidget extends StatelessWidget { final AccountMenuItem menuItem; final EdgeInsetsGeometry? padding; final TextStyle? textStyle; + final VoidCallback? onMultiClickAction; const SettingHeaderWidget({ Key? key, required this.menuItem, this.padding, this.textStyle, + this.onMultiClickAction, }) : super(key: key); @override Widget build(BuildContext context) { final appLocalizations = AppLocalizations.of(context); - final children = [ - Text( - menuItem.getName(appLocalizations), - style: textStyle ?? ThemeUtils.textStyleInter600().copyWith( - color: Colors.black, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, + Widget titleWidget = Text( + menuItem.getName(appLocalizations), + style: textStyle ?? ThemeUtils.textStyleInter600().copyWith( + color: Colors.black, ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ); + + if (onMultiClickAction != null) { + titleWidget = MultiClickWidget( + onMultiTap: onMultiClickAction!, + child: titleWidget, + ); + } + + final children = [ + titleWidget, if (menuItem.getExplanation(appLocalizations).isNotEmpty) Padding( padding: const EdgeInsets.only(top: 13), diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 6f627a87f..8175408a6 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -5283,5 +5283,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "theLabelFeatureIsNowAvailable": "The label feature is now available.", + "@theLabelFeatureIsNowAvailable": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index 5d9fd1ea1..f6fd8ea53 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/mailbox/data/local/state_cache_manager.da import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/local_sort_order_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/setting_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; @@ -94,6 +95,7 @@ class LocalBindings extends Bindings { Get.put(SessionHiveCacheClient()); Get.put(SessionCacheManager(Get.find())); Get.put(LocalSortOrderManager(Get.find())); + Get.put(SettingCacheManager(Get.find())); Get.put(CachingManager( Get.find(), Get.find(), diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 4e13b6197..69baf4746 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -5612,4 +5612,11 @@ class AppLocalizations { name: 'labelVisibilityToggleDescription', ); } + + String get theLabelFeatureIsNowAvailable { + return Intl.message( + 'The label feature is now available.', + name: 'theLabelFeatureIsNowAvailable', + ); + } }