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
@@ -1,15 +1,11 @@
import 'dart:ui';
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_root.dart';
abstract class ManageAccountDataSource {
Future<void> persistLanguage(Locale localeCurrent);
Future<void> updateLocalSettings(
Map<SupportedLocalSetting, LocalSettingOptions?> localSettings,
);
Future<void> updateLocalSettings(PreferencesRoot preferencesRoot);
Future<Map<SupportedLocalSetting, LocalSettingOptions?>> getLocalSettings(
List<SupportedLocalSetting> supportedLocalSettings,
);
Future<PreferencesRoot> getLocalSettings();
}
@@ -2,19 +2,19 @@ import 'dart:ui';
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.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/presentation/model/local_setting_options.dart';
import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_root.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class ManageAccountDataSourceImpl extends ManageAccountDataSource {
final LanguageCacheManager _languageCacheManager;
final LocalSettingCacheManager _localSettingCacheManager;
final PreferencesSettingManager _preferencesSettingManager;
final ExceptionThrower _exceptionThrower;
ManageAccountDataSourceImpl(
this._languageCacheManager,
this._localSettingCacheManager,
this._preferencesSettingManager,
this._exceptionThrower
);
@@ -26,20 +26,16 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource {
}
@override
Future<void> updateLocalSettings(
Map<SupportedLocalSetting, LocalSettingOptions?> localSettings,
) {
Future<void> updateLocalSettings(PreferencesRoot preferencesRoot) {
return Future.sync(() async {
return await _localSettingCacheManager.update(localSettings);
return await _preferencesSettingManager.savePreferences(preferencesRoot);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<Map<SupportedLocalSetting, LocalSettingOptions?>> getLocalSettings(
List<SupportedLocalSetting> supportedLocalSettings,
) {
Future<PreferencesRoot> getLocalSettings() {
return Future.sync(() async {
return await _localSettingCacheManager.get(supportedLocalSettings);
return await _preferencesSettingManager.loadPreferences();
}).catchError(_exceptionThrower.throwException);
}
}
@@ -1,41 +0,0 @@
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
class LocalSettingCacheManager {
const LocalSettingCacheManager(this._sharedPreferences);
final SharedPreferences _sharedPreferences;
Future<void> update(
Map<SupportedLocalSetting, LocalSettingOptions?> localSettings,
) async {
await Future.wait(localSettings.entries.map((entry) async {
if (entry.value == null) {
await _sharedPreferences.remove(entry.key.name);
return;
}
await _sharedPreferences.setString(
entry.key.name,
jsonEncode(entry.value!.toJson()),
);
}));
}
Future<Map<SupportedLocalSetting, LocalSettingOptions?>> get(
List<SupportedLocalSetting> supportedLocalSettings,
) async {
await _sharedPreferences.reload();
return Map.fromEntries(supportedLocalSettings.map((supportedLocalSetting) {
final data = _sharedPreferences.getString(supportedLocalSetting.name);
return MapEntry(
supportedLocalSetting,
data == null ? null : LocalSettingOptions.fromJson(jsonDecode(data)),
);
}));
}
}
@@ -0,0 +1,55 @@
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.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/spam_report_config.dart';
class PreferencesSettingManager {
static const String _preferencesSettingKey = 'PREFERENCES_SETTING';
const PreferencesSettingManager(this._sharedPreferences);
final SharedPreferences _sharedPreferences;
Future<PreferencesRoot> loadPreferences() async {
await _sharedPreferences.reload();
final jsonString = _sharedPreferences.getString(_preferencesSettingKey);
if (jsonString != null) {
return PreferencesRoot.fromJson(jsonDecode(jsonString));
}
return PreferencesRoot.initial();
}
Future<void> savePreferences(PreferencesRoot root) async {
await _sharedPreferences.setString(
_preferencesSettingKey,
jsonEncode(root.toJson()),
);
}
Future<void> updateThread(bool enabled) async {
final current = await loadPreferences();
final updated = current.updateThreadDetail(enabled);
await savePreferences(updated);
}
Future<void> updateSpamReport({
bool? isEnabled,
int? lastTimeDismissedMilliseconds,
}) async {
final current = await loadPreferences();
final updated = current.updateSpamReport(
isEnabled: isEnabled,
lastTimeDismissedMilliseconds: lastTimeDismissedMilliseconds,
);
await savePreferences(updated);
}
Future<SpamReportConfig> getSpamReportConfig() async {
final preferences = await loadPreferences();
return preferences.setting.spamReport;
}
}
@@ -2,7 +2,7 @@ import 'dart:ui';
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.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/preferences/preferences_root.dart';
class ManageAccountRepositoryImpl extends ManageAccountRepository {
@@ -16,16 +16,12 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository {
}
@override
Future<void> updateLocalSettings(
Map<SupportedLocalSetting, LocalSettingOptions?> localSettings,
) {
return dataSource.updateLocalSettings(localSettings);
Future<void> updateLocalSettings(PreferencesRoot preferencesRoot) {
return dataSource.updateLocalSettings(preferencesRoot);
}
@override
Future<Map<SupportedLocalSetting, LocalSettingOptions?>> getLocalSettings(
List<SupportedLocalSetting> supportedLocalSettings,
) {
return dataSource.getLocalSettings(supportedLocalSettings);
Future<PreferencesRoot> getLocalSettings() {
return dataSource.getLocalSettings();
}
}