TF-4193 Handle multi click to enable Label visibility feature

This commit is contained in:
dab246
2025-12-09 13:43:43 +07:00
committed by Dat H. Pham
parent d1cd9efbab
commit 10038a3836
23 changed files with 330 additions and 43 deletions
@@ -12,4 +12,8 @@ abstract class ManageAccountDataSource {
Future<PreferencesSetting> getLocalSettings(); Future<PreferencesSetting> getLocalSettings();
Future<AIScribeConfig> getAiScribeConfigLocalSettings(); Future<AIScribeConfig> getAiScribeConfigLocalSettings();
Future<bool> getLabelVisibility();
Future<void> saveLabelVisibility(bool visible);
} }
@@ -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/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/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/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_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/preferences_setting.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/spam_report_config.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 LanguageCacheManager _languageCacheManager;
final PreferencesSettingManager _preferencesSettingManager; final PreferencesSettingManager _preferencesSettingManager;
final SettingCacheManager _settingCacheManager;
final ExceptionThrower _exceptionThrower; final ExceptionThrower _exceptionThrower;
ManageAccountDataSourceImpl( ManageAccountDataSourceImpl(
this._languageCacheManager, this._languageCacheManager,
this._preferencesSettingManager, this._preferencesSettingManager,
this._settingCacheManager,
this._exceptionThrower this._exceptionThrower
); );
@@ -71,4 +74,24 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource {
return await _preferencesSettingManager.getAIScribeConfig(); return await _preferencesSettingManager.getAIScribeConfig();
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override
Future<bool> getLabelVisibility() {
return Future.sync(() async {
return await _settingCacheManager.getLabelVisibility();
}).catchError((error, stackTrace) async {
await _exceptionThrower.throwException(error, stackTrace);
throw error;
});
}
@override
Future<void> saveLabelVisibility(bool visible) {
return Future.sync(() async {
return await _settingCacheManager.saveLabelVisibility(visible);
}).catchError((error, stackTrace) async {
await _exceptionThrower.throwException(error, stackTrace);
throw error;
});
}
} }
@@ -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<bool> getLabelVisibility() async {
await _sharedPreferences.reload();
return _sharedPreferences.getBool(_labelVisibilitySettingKey) ?? false;
}
Future<void> saveLabelVisibility(bool visible) async {
await _sharedPreferences.setBool(_labelVisibilitySettingKey, visible);
}
}
@@ -31,4 +31,14 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository {
Future<AIScribeConfig> getAiScribeConfigLocalSettings() { Future<AIScribeConfig> getAiScribeConfigLocalSettings() {
return dataSource.getAiScribeConfigLocalSettings(); return dataSource.getAiScribeConfigLocalSettings();
} }
@override
Future<bool> getLabelVisibility() {
return dataSource.getLabelVisibility();
}
@override
Future<void> saveLabelVisibility(bool visible) {
return dataSource.saveLabelVisibility(visible);
}
} }
@@ -12,4 +12,8 @@ abstract class ManageAccountRepository {
Future<PreferencesSetting> getLocalSettings(); Future<PreferencesSetting> getLocalSettings();
Future<AIScribeConfig> getAiScribeConfigLocalSettings(); Future<AIScribeConfig> getAiScribeConfigLocalSettings();
Future<bool> getLabelVisibility();
Future<void> saveLabelVisibility(bool visible);
} }
@@ -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<Object?> get props => [...super.props, visible];
}
class GetLabelVisibilityFailure extends FeatureFailure {
GetLabelVisibilityFailure(dynamic exception) : super(exception: exception);
}
@@ -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);
}
@@ -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<Either<Failure, Success>> execute() async* {
try {
yield Right(GettingLabelVisibility());
final visible = await _manageAccountRepository.getLabelVisibility();
yield Right(GetLabelVisibilitySuccess(visible));
} catch (exception) {
yield Left(GetLabelVisibilityFailure(exception));
}
}
}
@@ -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<Either<Failure, Success>> execute({bool visible = true}) async* {
try {
yield Right(SavingLabelVisibility());
await _manageAccountRepository.saveLabelVisibility(visible);
yield Right(SaveLabelVisibilitySuccess());
} catch (exception) {
yield Left(SaveLabelVisibilityFailure(exception));
}
}
}
@@ -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/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/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/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/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/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'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
class SettingInteractorBindings extends InteractorsBindings { class SettingInteractorBindings extends InteractorsBindings {
@@ -22,13 +25,21 @@ class SettingInteractorBindings extends InteractorsBindings {
() => ManageAccountDataSourceImpl( () => ManageAccountDataSourceImpl(
Get.find<LanguageCacheManager>(), Get.find<LanguageCacheManager>(),
Get.find<PreferencesSettingManager>(), Get.find<PreferencesSettingManager>(),
Get.find<SettingCacheManager>(),
Get.find<CacheExceptionThrower>(), Get.find<CacheExceptionThrower>(),
), ),
); );
} }
@override @override
void bindingsInteractor() {} void bindingsInteractor() {
Get.lazyPut(
() => SaveLabelVisibilityInteractor(Get.find<ManageAccountRepository>()),
);
Get.lazyPut(
() => GetLabelVisibilityInteractor(Get.find<ManageAccountRepository>()),
);
}
@override @override
void bindingsRepository() { void bindingsRepository() {
@@ -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<SaveLabelVisibilityInteractor>();
if (saveLabelVisibilityInteractor != null) {
consumeState(saveLabelVisibilityInteractor!.execute());
}
if (currentOverlayContext != null && currentContext != null) {
appToast.showToastSuccessMessage(
currentOverlayContext!,
AppLocalizations.of(currentContext!).theLabelFeatureIsNowAvailable,
);
}
}
void setUpLabelVisibility() {
getLabelVisibilityInteractor = getBinding<GetLabelVisibilityInteractor>();
if (getLabelVisibilityInteractor != null) {
consumeState(getLabelVisibilityInteractor!.execute());
}
}
void handleGetLabelVisibilitySuccess(bool visible) {
isLabelVisibility.value = visible;
}
}
@@ -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/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/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_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/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_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/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/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/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/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/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/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/extensions/validate_setting_capability_supported_extension.dart';
@@ -64,6 +68,8 @@ class ManageAccountDashBoardController extends ReloadableController
UpdateVacationInteractor? _updateVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor;
PaywallController? paywallController; PaywallController? paywallController;
GetQuotasInteractor? getQuotasInteractor; GetQuotasInteractor? getQuotasInteractor;
SaveLabelVisibilityInteractor? saveLabelVisibilityInteractor;
GetLabelVisibilityInteractor? getLabelVisibilityInteractor;
final accountId = Rxn<AccountId>(); final accountId = Rxn<AccountId>();
final accountMenuItemSelected = AccountMenuItem.profiles.obs; final accountMenuItemSelected = AccountMenuItem.profiles.obs;
@@ -71,6 +77,7 @@ class ManageAccountDashBoardController extends ReloadableController
final vacationResponse = Rxn<VacationResponse>(); final vacationResponse = Rxn<VacationResponse>();
final dashboardSettingAction = Rxn<UIAction>(); final dashboardSettingAction = Rxn<UIAction>();
final octetsQuota = Rxn<Quota>(); final octetsQuota = Rxn<Quota>();
final isLabelVisibility = RxBool(false);
Uri? previousUri; Uri? previousUri;
AccountMenuItem? selectedMenu; AccountMenuItem? selectedMenu;
@@ -102,6 +109,8 @@ class ManageAccountDashBoardController extends ReloadableController
handleExportTraceLogSuccess(success); handleExportTraceLogSuccess(success);
} else if (success is GetQuotasSuccess) { } else if (success is GetQuotasSuccess) {
handleGetQuotasSuccess(success); handleGetQuotasSuccess(success);
} else if (success is GetLabelVisibilitySuccess) {
handleGetLabelVisibilitySuccess(success.visible);
} else { } else {
super.handleSuccessViewState(success); super.handleSuccessViewState(success);
} }
@@ -177,6 +186,10 @@ class ManageAccountDashBoardController extends ReloadableController
} else if (isStorageCapabilitySupported) { } else if (isStorageCapabilitySupported) {
getQuotas(accountId.value); getQuotas(accountId.value);
} }
if (isLabelCapabilitySupported) {
setUpLabelVisibility();
}
} }
void _getParametersRouter() { void _getParametersRouter() {
@@ -13,6 +13,7 @@ class SettingAppBar extends StatelessWidget {
final ResponsiveUtils responsiveUtils; final ResponsiveUtils responsiveUtils;
final VoidCallback onBackAction; final VoidCallback onBackAction;
final VoidCallback? onExportTraceLogAction; final VoidCallback? onExportTraceLogAction;
final VoidCallback? onMultiClickAction;
const SettingAppBar({ const SettingAppBar({
super.key, super.key,
@@ -22,6 +23,7 @@ class SettingAppBar extends StatelessWidget {
required this.responsiveUtils, required this.responsiveUtils,
required this.onBackAction, required this.onBackAction,
this.onExportTraceLogAction, this.onExportTraceLogAction,
this.onMultiClickAction,
}); });
@override @override
@@ -39,6 +41,7 @@ class SettingAppBar extends StatelessWidget {
imagePaths: imagePaths, imagePaths: imagePaths,
responsiveUtils: responsiveUtils, responsiveUtils: responsiveUtils,
onBackAction: onBackAction, onBackAction: onBackAction,
onMultiClickAction: onMultiClickAction,
); );
} }
} }
@@ -1,6 +1,7 @@
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/theme_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:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.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/features/manage_account/presentation/model/account_menu_item.dart';
@@ -11,6 +12,7 @@ class SettingFirstLevelAppBar extends StatelessWidget {
final ImagePaths imagePaths; final ImagePaths imagePaths;
final ResponsiveUtils responsiveUtils; final ResponsiveUtils responsiveUtils;
final VoidCallback onBackAction; final VoidCallback onBackAction;
final VoidCallback? onMultiClickAction;
const SettingFirstLevelAppBar({ const SettingFirstLevelAppBar({
super.key, super.key,
@@ -18,12 +20,27 @@ class SettingFirstLevelAppBar extends StatelessWidget {
required this.imagePaths, required this.imagePaths,
required this.responsiveUtils, required this.responsiveUtils,
required this.onBackAction, required this.onBackAction,
this.onMultiClickAction,
}); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final appLocalizations = AppLocalizations.of(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( return Container(
height: 64, height: 64,
padding: _getPadding(context), padding: _getPadding(context),
@@ -43,12 +60,7 @@ class SettingFirstLevelAppBar extends StatelessWidget {
Center( Center(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 50), padding: const EdgeInsets.symmetric(horizontal: 50),
child: Text( child: titleWidget,
accountMenuItem.getName(appLocalizations),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: ThemeUtils.textStyleM3BodyLarge,
),
), ),
), ),
], ],
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.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/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/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/extensions/validate_setting_capability_supported_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
@@ -28,21 +29,37 @@ class SettingsView extends GetWidget<SettingsController> {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Obx(() => SettingAppBar( Obx(() {
pageLevel: controller final labelVisibility = controller
.manageAccountDashboardController .manageAccountDashboardController
.settingsPageLevel .isLabelVisibility
.value, .value;
accountMenuItem: controller final isLabelCapabilitySupported = controller
.manageAccountDashboardController .manageAccountDashboardController
.accountMenuItemSelected .isLabelCapabilitySupported;
.value,
imagePaths: controller.imagePaths, final disableMultiClick =
responsiveUtils: controller.responsiveUtils, labelVisibility || !isLabelCapabilitySupported;
onBackAction: () => controller.onBackSettingAction(context),
onExportTraceLogAction: () => return SettingAppBar(
controller.showExportTraceLogConfirmDialog(context), 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(() { Obx(() {
final dashboard = controller.manageAccountDashboardController; final dashboard = controller.manageAccountDashboardController;
final vacation = dashboard.vacationResponse.value; final vacation = dashboard.vacationResponse.value;
@@ -13,18 +13,18 @@ class PreferencesBindings extends Bindings {
void dependencies() { void dependencies() {
PreferencesInteractorsBindings().dependencies(); PreferencesInteractorsBindings().dependencies();
Get.lazyPut(() => PreferencesController(
Get.find<GetServerSettingInteractor>(),
Get.find<UpdateServerSettingInteractor>(),
Get.find<GetLocalSettingsInteractor>(),
Get.find<UpdateLocalSettingsInteractor>(),
));
Get.lazyPut(() => GetLocalSettingsInteractor( Get.lazyPut(() => GetLocalSettingsInteractor(
Get.find<ManageAccountRepository>(), Get.find<ManageAccountRepository>(),
)); ));
Get.lazyPut(() => UpdateLocalSettingsInteractor( Get.lazyPut(() => UpdateLocalSettingsInteractor(
Get.find<ManageAccountRepository>(), Get.find<ManageAccountRepository>(),
)); ));
Get.lazyPut(() => PreferencesController(
Get.find<GetServerSettingInteractor>(),
Get.find<UpdateServerSettingInteractor>(),
Get.find<GetLocalSettingsInteractor>(),
Get.find<UpdateLocalSettingsInteractor>(),
));
} }
} }
@@ -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/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/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/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/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/repository/manage_account_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_interactor.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.lazyPut(() => ManageAccountDataSourceImpl(
Get.find<LanguageCacheManager>(), Get.find<LanguageCacheManager>(),
Get.find<PreferencesSettingManager>(), Get.find<PreferencesSettingManager>(),
Get.find<SettingCacheManager>(),
Get.find<CacheExceptionThrower>(), Get.find<CacheExceptionThrower>(),
), tag: composerId); ), tag: composerId);
} }
@@ -48,7 +48,7 @@ class PreferencesController extends BaseController {
(failure) => false, (failure) => false,
(success) => success is GettingServerSetting || success is UpdatingServerSetting); (success) => success is GettingServerSetting || success is UpdatingServerSetting);
final _manageAccountDashBoardController = Get.find<ManageAccountDashBoardController>(); final accountDashboardController = Get.find<ManageAccountDashBoardController>();
bool get isAICapabilitySupported { bool get isAICapabilitySupported {
return _manageAccountDashBoardController.isAICapabilitySupported; return _manageAccountDashBoardController.isAICapabilitySupported;
@@ -128,7 +128,7 @@ class PreferencesController extends BaseController {
void _getSettingOption() { void _getSettingOption() {
consumeState(_getLocalSettingInteractor.execute()); consumeState(_getLocalSettingInteractor.execute());
final accountId = _manageAccountDashBoardController.accountId.value; final accountId = accountDashboardController.accountId.value;
if (accountId != null) { if (accountId != null) {
consumeState(_getServerSettingInteractor.execute(accountId)); consumeState(_getServerSettingInteractor.execute(accountId));
} else { } else {
@@ -196,8 +196,8 @@ class PreferencesController extends BaseController {
break; break;
} }
final session = _manageAccountDashBoardController.sessionCurrent; final session = accountDashboardController.sessionCurrent;
final accountId = _manageAccountDashBoardController.accountId.value; final accountId = accountDashboardController.accountId.value;
if (session != null && accountId != null && newSettingOption != null) { if (session != null && accountId != null && newSettingOption != null) {
consumeState( consumeState(
_updateServerSettingInteractor.execute( _updateServerSettingInteractor.execute(
@@ -215,7 +215,6 @@ class PreferencesController extends BaseController {
} }
} }
@override @override
void onClose() { void onClose() {
_appLifecycleListener?.dispose(); _appLifecycleListener?.dispose();
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.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/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/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/account_menu_item.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart';
@@ -51,13 +52,34 @@ class PreferencesView extends GetWidget<PreferencesController> with AppLoaderMix
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (controller.responsiveUtils.isWebDesktop(context)) if (controller.responsiveUtils.isWebDesktop(context))
const SettingHeaderWidget( Obx(
menuItem: AccountMenuItem.preferences, () {
padding: EdgeInsets.only(bottom: 21), 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(() { Obx(() {
final settingOption = controller.settingOption.value; final settingOption = controller.settingOption.value;
final localSettingOption = controller.localSettings.value; final localSettingOption = controller.localSettings.value;
final isLabelVisibility = controller
.accountDashboardController
.isLabelVisibility;
if (settingOption == null && if (settingOption == null &&
localSettingOption.configs.isEmpty) { localSettingOption.configs.isEmpty) {
@@ -75,12 +97,15 @@ class PreferencesView extends GetWidget<PreferencesController> with AppLoaderMix
...PreferencesOptionType.values.where( ...PreferencesOptionType.values.where(
(type) => (type) =>
type.isLocal && type.isLocal &&
type != PreferencesOptionType.label &&
(type != PreferencesOptionType.aiScribe || (type != PreferencesOptionType.aiScribe ||
controller.isAIScribeCapabilityAvailable), controller.isAIScribeCapabilityAvailable),
), ),
if (settingOption != null && if (settingOption != null &&
controller.isAICapabilitySupported) controller.isAICapabilitySupported)
PreferencesOptionType.aiNeedsAction, PreferencesOptionType.aiNeedsAction,
if (isLabelVisibility.isTrue)
PreferencesOptionType.label,
]; ];
return Expanded( return Expanded(
@@ -1,5 +1,6 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/theme_utils.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:flutter/material.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/account_menu_item.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -8,27 +9,38 @@ class SettingHeaderWidget extends StatelessWidget {
final AccountMenuItem menuItem; final AccountMenuItem menuItem;
final EdgeInsetsGeometry? padding; final EdgeInsetsGeometry? padding;
final TextStyle? textStyle; final TextStyle? textStyle;
final VoidCallback? onMultiClickAction;
const SettingHeaderWidget({ const SettingHeaderWidget({
Key? key, Key? key,
required this.menuItem, required this.menuItem,
this.padding, this.padding,
this.textStyle, this.textStyle,
this.onMultiClickAction,
}) : super(key: key); }) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final appLocalizations = AppLocalizations.of(context); final appLocalizations = AppLocalizations.of(context);
final children = [ Widget titleWidget = Text(
Text( menuItem.getName(appLocalizations),
menuItem.getName(appLocalizations), style: textStyle ?? ThemeUtils.textStyleInter600().copyWith(
style: textStyle ?? ThemeUtils.textStyleInter600().copyWith( color: Colors.black,
color: Colors.black,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
), ),
maxLines: 1,
overflow: TextOverflow.ellipsis,
);
if (onMultiClickAction != null) {
titleWidget = MultiClickWidget(
onMultiTap: onMultiClickAction!,
child: titleWidget,
);
}
final children = [
titleWidget,
if (menuItem.getExplanation(appLocalizations).isNotEmpty) if (menuItem.getExplanation(appLocalizations).isNotEmpty)
Padding( Padding(
padding: const EdgeInsets.only(top: 13), padding: const EdgeInsets.only(top: 13),
+6
View File
@@ -5283,5 +5283,11 @@
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
},
"theLabelFeatureIsNowAvailable": "The label feature is now available.",
"@theLabelFeatureIsNowAvailable": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
} }
} }
@@ -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/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/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/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_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/new_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.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(SessionHiveCacheClient());
Get.put(SessionCacheManager(Get.find<SessionHiveCacheClient>())); Get.put(SessionCacheManager(Get.find<SessionHiveCacheClient>()));
Get.put(LocalSortOrderManager(Get.find<SharedPreferences>())); Get.put(LocalSortOrderManager(Get.find<SharedPreferences>()));
Get.put(SettingCacheManager(Get.find<SharedPreferences>()));
Get.put(CachingManager( Get.put(CachingManager(
Get.find<MailboxCacheManager>(), Get.find<MailboxCacheManager>(),
Get.find<StateCacheManager>(), Get.find<StateCacheManager>(),
@@ -5612,4 +5612,11 @@ class AppLocalizations {
name: 'labelVisibilityToggleDescription', name: 'labelVisibilityToggleDescription',
); );
} }
String get theLabelFeatureIsNowAvailable {
return Intl.message(
'The label feature is now available.',
name: 'theLabelFeatureIsNowAvailable',
);
}
} }