TF-3977 Add disable spam banner in preferences setting

This commit is contained in:
dab246
2025-08-29 18:21:10 +07:00
committed by Dat H. Pham
parent 7f4dcf8b38
commit 612fc75f02
41 changed files with 534 additions and 404 deletions
@@ -3,7 +3,7 @@ import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.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/local_setting_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/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';
@@ -43,7 +43,7 @@ class PreferencesInteractorsBindings extends InteractorsBindings {
), tag: composerId);
Get.lazyPut(() => ManageAccountDataSourceImpl(
Get.find<LanguageCacheManager>(),
Get.find<LocalSettingCacheManager>(),
Get.find<PreferencesSettingManager>(),
Get.find<CacheExceptionThrower>(),
), tag: composerId);
}
@@ -10,9 +10,8 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/update_local_
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_local_settings_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_local_settings_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_detail/thread_detail_local_setting_detail.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/setting_option_type.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_root.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart';
import 'package:tmail_ui_user/features/server_settings/domain/state/get_server_setting_state.dart';
import 'package:tmail_ui_user/features/server_settings/domain/state/update_server_setting_state.dart';
import 'package:tmail_ui_user/features/server_settings/domain/usecases/get_server_setting_interactor.dart';
@@ -34,7 +33,7 @@ class PreferencesController extends BaseController {
final UpdateLocalSettingsInteractor _updateLocalSettingsInteractor;
final settingOption = Rxn<TMailServerSettingOptions>();
final localSettings = Rxn(<SupportedLocalSetting, LocalSettingOptions?>{});
final localSettings = Rxn<PreferencesRoot>();
bool get isLoading => viewState.value.fold(
(failure) => false,
@@ -55,13 +54,9 @@ class PreferencesController extends BaseController {
} else if (success is UpdateServerSettingSuccess) {
_updateSettingOptionValue(newSettingOption: success.settingOption);
} else if (success is GetLocalSettingsSuccess) {
_updateLocalSettingOptionValue(
newLocalSettings: success.localSettings,
);
_updateLocalSettingOptionValue(success.preferencesRoot);
} else if (success is UpdateLocalSettingsSuccess) {
_updateLocalSettingOptionValue(
newLocalSettings: success.localSettings,
);
_updateLocalSettingOptionValue(success.preferencesRoot);
} else {
super.handleSuccessViewState(success);
}
@@ -90,49 +85,68 @@ class PreferencesController extends BaseController {
settingOption.value = newSettingOption;
}
void _updateLocalSettingOptionValue({
required Map<SupportedLocalSetting, LocalSettingOptions?> newLocalSettings
}) {
localSettings.value = newLocalSettings;
void _updateLocalSettingOptionValue(PreferencesRoot preferencesRoot) {
localSettings.value = preferencesRoot;
}
void _getSettingOption() {
consumeState(_getLocalSettingInteractor.execute(SupportedLocalSetting.values));
consumeState(_getLocalSettingInteractor.execute());
final accountId = _manageAccountDashBoardController.accountId.value;
if (accountId != null) {
consumeState(_getServerSettingInteractor.execute(accountId));
} else {
consumeState(Stream.value(Left(GetServerSettingFailure(NotFoundAccountIdException()))));
consumeState(Stream.value(Left(GetLocalSettingsFailure(
exception: NotFoundAccountIdException(),
))));
}
}
void updateStateSettingOption(SettingOptionType optionType, bool isEnabled) {
void updateStateSettingOption(
PreferencesOptionType optionType,
bool isEnabled,
) {
if (optionType.isLocal) {
Map<SupportedLocalSetting, LocalSettingOptions?> newLocalSettings = {};
switch(optionType) {
case SettingOptionType.thread:
var currentLocalSettings = Map<SupportedLocalSetting, LocalSettingOptions?>.from(localSettings.value ?? {});
currentLocalSettings[SupportedLocalSetting.threadDetail] = LocalSettingOptions(setting: ThreadDetailLocalSettingDetail(!isEnabled));
newLocalSettings = currentLocalSettings;
break;
default:
break;
}
consumeState(_updateLocalSettingsInteractor.execute(newLocalSettings));
return;
_updateLocalPreferencesSetting(optionType, isEnabled);
} else {
_updateServerPreferencesSetting(optionType, isEnabled);
}
}
void _updateLocalPreferencesSetting(
PreferencesOptionType optionType,
bool isEnabled,
) {
PreferencesRoot? preferencesRoot;
switch(optionType) {
case PreferencesOptionType.thread:
preferencesRoot = localSettings.value?.updateThreadDetail(
!isEnabled,
);
break;
case PreferencesOptionType.spamReport:
preferencesRoot = localSettings.value?.updateSpamReport(
isEnabled: !isEnabled,
);
break;
default:
break;
}
if (preferencesRoot != null) {
consumeState(_updateLocalSettingsInteractor.execute(preferencesRoot));
}
}
void _updateServerPreferencesSetting(
PreferencesOptionType optionType,
bool isEnabled,
) {
TMailServerSettingOptions? newSettingOption;
switch(optionType) {
case SettingOptionType.readReceipt:
case PreferencesOptionType.readReceipt:
newSettingOption = settingOption.value?.copyWith(
alwaysReadReceipts: !isEnabled,
);
break;
case SettingOptionType.senderPriority:
case PreferencesOptionType.senderPriority:
newSettingOption = settingOption.value?.copyWith(
displaySenderPriority: !isEnabled,
);
@@ -143,12 +157,18 @@ class PreferencesController extends BaseController {
final accountId = _manageAccountDashBoardController.accountId.value;
if (accountId != null && newSettingOption != null) {
consumeState(_updateServerSettingInteractor.execute(
accountId,
newSettingOption,
));
consumeState(
_updateServerSettingInteractor.execute(
accountId,
newSettingOption,
),
);
} else {
consumeState(Stream.value(Left(UpdateServerSettingFailure(NotFoundAccountIdException()))));
consumeState(
Stream.value(
Left(UpdateServerSettingFailure(NotFoundAccountIdException())),
),
);
}
}
}
@@ -4,9 +4,9 @@ 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/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/setting_option_type.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/preferences_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/widgets/setting_option_item.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/widgets/preferences_option_item.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_header_widget.dart';
class PreferencesView extends GetWidget<PreferencesController> with AppLoaderMixin {
@@ -57,31 +57,33 @@ class PreferencesView extends GetWidget<PreferencesController> with AppLoaderMix
),
Obx(() {
final settingOption = controller.settingOption.value;
final localSettingOption = controller.localSettings;
final localSettingOption = controller.localSettings.value;
if (settingOption == null && (localSettingOption.value?.isEmpty ?? true)) {
if (settingOption == null && localSettingOption == null) {
return const SizedBox.shrink();
}
final availableSettingOptions = [
if (settingOption != null) ...SettingOptionType.values.where(
(optionType) => !optionType.isLocal,
),
...SettingOptionType.values.where(
(optionType) => optionType.isLocal,
),
if (settingOption != null)
...PreferencesOptionType.values.where(
(optionType) => !optionType.isLocal,
),
if (localSettingOption != null)
...PreferencesOptionType.values.where(
(optionType) => optionType.isLocal,
),
];
return Expanded(
child: ListView.separated(
itemCount: availableSettingOptions.length,
itemBuilder: (context, index) {
return SettingOptionItem(
return PreferencesOptionItem(
imagePaths: controller.imagePaths,
settingOption: settingOption,
localSettings: localSettingOption.value ?? {},
preferencesSetting: localSettingOption!.setting,
optionType: availableSettingOptions[index],
onTapSettingOptionAction: controller.updateStateSettingOption,
onTapPreferencesOptionAction: controller.updateStateSettingOption,
);
},
separatorBuilder: (_, __) => const SizedBox(height: 49),
@@ -6,25 +6,27 @@ import 'package:server_settings/server_settings/tmail_server_settings.dart';
import 'package:tmail_ui_user/features/base/widget/default_switch_icon_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/setting_option_type.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_setting.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnTapSettingOptionAction = Function(SettingOptionType optionType, bool isEnabled);
typedef OnTapPreferencesOptionAction = Function(PreferencesOptionType optionType, bool isEnabled);
class SettingOptionItem extends StatelessWidget {
class PreferencesOptionItem extends StatelessWidget {
final ImagePaths imagePaths;
final TMailServerSettingOptions? settingOption;
final Map<SupportedLocalSetting, LocalSettingOptions?> localSettings;
final SettingOptionType optionType;
final OnTapSettingOptionAction onTapSettingOptionAction;
final PreferencesSetting preferencesSetting;
final PreferencesOptionType optionType;
final OnTapPreferencesOptionAction onTapPreferencesOptionAction;
const SettingOptionItem({
const PreferencesOptionItem({
super.key,
required this.imagePaths,
required this.settingOption,
required this.localSettings,
required this.preferencesSetting,
required this.optionType,
required this.onTapSettingOptionAction,
required this.onTapPreferencesOptionAction,
});
@override
@@ -60,18 +62,18 @@ class SettingOptionItem extends StatelessWidget {
children: [
InkWell(
key: ValueKey(optionType.getTitle(appLocalizations)),
onTap: () => onTapSettingOptionAction(
onTap: () => onTapPreferencesOptionAction(
optionType,
optionType.isEnabled(settingOption, localSettings),
optionType.isEnabled(settingOption, preferencesSetting),
),
child: DefaultSwitchIconWidget(
key: ValueKey(
optionType.isEnabled(settingOption, localSettings)
optionType.isEnabled(settingOption, preferencesSetting)
? 'setting_option_switch_on'
: 'setting_option_switch_off',
),
imagePaths: imagePaths,
isEnabled: optionType.isEnabled(settingOption, localSettings),
isEnabled: optionType.isEnabled(settingOption, preferencesSetting),
),
),
const SizedBox(width: 12),