Skip to content

Commit f2087e3

Browse files
committed
TF-3977 Separate settings keys for easier in conflict
1 parent 03cc03b commit f2087e3

27 files changed

+290
-206
lines changed

lib/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/spam_re
88
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
99
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/unread_spam_emails_response.dart';
1010
import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart';
11-
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/spam_report_config.dart';
11+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/spam_report_config.dart';
1212
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
1313

1414
class LocalSpamReportDataSourceImpl extends SpamReportDataSource {
@@ -23,8 +23,7 @@ class LocalSpamReportDataSourceImpl extends SpamReportDataSource {
2323
@override
2424
Future<DateTime> getLastTimeDismissedSpamReported() async {
2525
return Future.sync(() async {
26-
final spamReportConfig =
27-
await _preferencesSettingManager.getSpamReportConfig();
26+
final spamReportConfig = await _preferencesSettingManager.getSpamReportConfig();
2827
return DateTime.fromMillisecondsSinceEpoch(
2928
spamReportConfig.lastTimeDismissedMilliseconds,
3029
);

lib/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spa
1919
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart';
2020
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart';
2121
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
22-
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/spam_report_loader_status.dart';
22+
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/loader_status.dart';
2323
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
2424

2525
class SpamReportController extends BaseController {
@@ -32,7 +32,7 @@ class SpamReportController extends BaseController {
3232
final spamReportState = Rx<SpamReportState>(SpamReportState.enabled);
3333

3434
AppLifecycleListener? _appLifecycleListener;
35-
SpamReportLoaderStatus _spamReportLoaderStatus = SpamReportLoaderStatus.idle;
35+
LoaderStatus _spamReportLoaderStatus = LoaderStatus.idle;
3636

3737
SpamReportController(
3838
this._storeSpamReportInteractor,
@@ -46,7 +46,7 @@ class SpamReportController extends BaseController {
4646
super.onInit();
4747
_appLifecycleListener ??= AppLifecycleListener(
4848
onResume: () {
49-
if (_spamReportLoaderStatus == SpamReportLoaderStatus.loading) {
49+
if (_spamReportLoaderStatus == LoaderStatus.loading) {
5050
return;
5151
}
5252
getSpamReportStateAction();
@@ -59,7 +59,7 @@ class SpamReportController extends BaseController {
5959
if (success is StoreLastTimeDismissedSpamReportSuccess) {
6060
presentationSpamMailbox.value = null;
6161
} else if (success is GetSpamReportStateLoading) {
62-
_spamReportLoaderStatus = SpamReportLoaderStatus.loading;
62+
_spamReportLoaderStatus = LoaderStatus.loading;
6363
} else if (success is GetSpamReportStateSuccess) {
6464
_loadSpamReportConfigSuccess(success.spamReportState);
6565
} else if (success is StoreSpamReportStateSuccess) {
@@ -77,7 +77,7 @@ class SpamReportController extends BaseController {
7777
if (failure is GetSpamMailboxCachedFailure) {
7878
presentationSpamMailbox.value = null;
7979
} else if (failure is GetSpamReportStateFailure) {
80-
_spamReportLoaderStatus = SpamReportLoaderStatus.completed;
80+
_spamReportLoaderStatus = LoaderStatus.completed;
8181
} else {
8282
super.handleFailureViewState(failure);
8383
}
@@ -86,12 +86,12 @@ class SpamReportController extends BaseController {
8686
@override
8787
void handleErrorViewState(Object error, StackTrace stackTrace) {
8888
super.handleErrorViewState(error, stackTrace);
89-
_spamReportLoaderStatus = SpamReportLoaderStatus.completed;
89+
_spamReportLoaderStatus = LoaderStatus.completed;
9090
}
9191

9292
void _loadSpamReportConfigSuccess(SpamReportState newState) {
9393
spamReportState.value = newState;
94-
_spamReportLoaderStatus = SpamReportLoaderStatus.completed;
94+
_spamReportLoaderStatus = LoaderStatus.completed;
9595
getBinding<MailboxDashBoardController>()?.refreshSpamReportBanner();
9696
}
9797

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
enum LoaderStatus { idle, loading, completed }

lib/features/mailbox_dashboard/presentation/model/spam_report_loader_status.dart

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import 'dart:ui';
22

3-
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_root.dart';
3+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
4+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_setting.dart';
45

56
abstract class ManageAccountDataSource {
67
Future<void> persistLanguage(Locale localeCurrent);
78

8-
Future<void> updateLocalSettings(PreferencesRoot preferencesRoot);
9+
Future<PreferencesSetting> toggleLocalSettingsState(PreferencesConfig preferencesConfig);
910

10-
Future<PreferencesRoot> getLocalSettings();
11-
}
11+
Future<PreferencesSetting> getLocalSettings();
12+
}

lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import 'dart:ui';
33
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
44
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
55
import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart';
6-
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_root.dart';
6+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
7+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_setting.dart';
8+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/spam_report_config.dart';
9+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/thread_detail_config.dart';
710
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
811

912
class ManageAccountDataSourceImpl extends ManageAccountDataSource {
@@ -26,14 +29,27 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource {
2629
}
2730

2831
@override
29-
Future<void> updateLocalSettings(PreferencesRoot preferencesRoot) {
32+
Future<PreferencesSetting> toggleLocalSettingsState(PreferencesConfig preferencesConfig) {
3033
return Future.sync(() async {
31-
return await _preferencesSettingManager.savePreferences(preferencesRoot);
34+
if (preferencesConfig is ThreadDetailConfig) {
35+
await _preferencesSettingManager.updateThread(
36+
preferencesConfig.isEnabled,
37+
);
38+
} else if (preferencesConfig is SpamReportConfig) {
39+
await _preferencesSettingManager.updateSpamReport(
40+
isEnabled: preferencesConfig.isEnabled,
41+
);
42+
} else {
43+
await _preferencesSettingManager.savePreferences(
44+
preferencesConfig,
45+
);
46+
}
47+
return await _preferencesSettingManager.loadPreferences();
3248
}).catchError(_exceptionThrower.throwException);
3349
}
3450

3551
@override
36-
Future<PreferencesRoot> getLocalSettings() {
52+
Future<PreferencesSetting> getLocalSettings() {
3753
return Future.sync(() async {
3854
return await _preferencesSettingManager.loadPreferences();
3955
}).catchError(_exceptionThrower.throwException);
Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,113 @@
11
import 'dart:convert';
22

33
import 'package:shared_preferences/shared_preferences.dart';
4-
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_root.dart';
5-
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/spam_report_config.dart';
4+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/default_preferences_config.dart';
5+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/empty_preferences_config.dart';
6+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
7+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_setting.dart';
8+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/spam_report_config.dart';
9+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/thread_detail_config.dart';
610

711
class PreferencesSettingManager {
812
static const String _preferencesSettingKey = 'PREFERENCES_SETTING';
13+
static const String _preferencesSettingThreadKey =
14+
'${_preferencesSettingKey}_THREAD';
15+
static const String _preferencesSettingSpamReportKey =
16+
'${_preferencesSettingKey}_SPAM_REPORT';
917

1018
const PreferencesSettingManager(this._sharedPreferences);
1119

1220
final SharedPreferences _sharedPreferences;
1321

14-
Future<PreferencesRoot> loadPreferences() async {
22+
Future<PreferencesSetting> loadPreferences() async {
1523
await _sharedPreferences.reload();
1624

17-
final jsonString = _sharedPreferences.getString(_preferencesSettingKey);
25+
final keys = _sharedPreferences.getKeys();
26+
final preferencesKeys =
27+
keys.where((key) => key.startsWith(_preferencesSettingKey)).toList();
1828

19-
if (jsonString != null) {
20-
return PreferencesRoot.fromJson(jsonDecode(jsonString));
29+
final listConfigs = preferencesKeys.map((key) {
30+
final jsonString = _sharedPreferences.getString(key);
31+
if (jsonString != null) {
32+
final jsonDecoded = jsonDecode(jsonString);
33+
34+
switch (key) {
35+
case _preferencesSettingThreadKey:
36+
return ThreadDetailConfig.fromJson(jsonDecoded);
37+
case _preferencesSettingSpamReportKey:
38+
return SpamReportConfig.fromJson(jsonDecoded);
39+
default:
40+
return DefaultPreferencesConfig.fromJson(jsonDecoded);
41+
}
42+
}
43+
return EmptyPreferencesConfig();
44+
}).toList();
45+
46+
if (listConfigs.isEmpty) {
47+
return PreferencesSetting.initial();
2148
}
2249

23-
return PreferencesRoot.initial();
50+
return PreferencesSetting(listConfigs);
2451
}
2552

26-
Future<void> savePreferences(PreferencesRoot root) async {
27-
await _sharedPreferences.setString(
28-
_preferencesSettingKey,
29-
jsonEncode(root.toJson()),
30-
);
53+
Future<void> savePreferences(PreferencesConfig config) async {
54+
if (config is ThreadDetailConfig) {
55+
await _sharedPreferences.setString(
56+
_preferencesSettingThreadKey,
57+
jsonEncode(config.toJson()),
58+
);
59+
} else if (config is SpamReportConfig) {
60+
await _sharedPreferences.setString(
61+
_preferencesSettingSpamReportKey,
62+
jsonEncode(config.toJson()),
63+
);
64+
} else {
65+
await _sharedPreferences.setString(
66+
_preferencesSettingKey,
67+
jsonEncode(config.toJson()),
68+
);
69+
}
3170
}
3271

33-
Future<void> updateThread(bool enabled) async {
34-
final current = await loadPreferences();
35-
final updated = current.updateThreadDetail(enabled);
36-
await savePreferences(updated);
72+
Future<void> updateThread(bool isEnabled) async {
73+
final currentConfig = await getThreadConfig();
74+
final updatedConfig = currentConfig.copyWith(isEnabled: isEnabled);
75+
await savePreferences(updatedConfig);
3776
}
3877

3978
Future<void> updateSpamReport({
4079
bool? isEnabled,
4180
int? lastTimeDismissedMilliseconds,
4281
}) async {
43-
final current = await loadPreferences();
44-
final updated = current.updateSpamReport(
82+
final currentConfig = await getSpamReportConfig();
83+
final updatedConfig = currentConfig.copyWith(
4584
isEnabled: isEnabled,
4685
lastTimeDismissedMilliseconds: lastTimeDismissedMilliseconds,
4786
);
48-
await savePreferences(updated);
87+
await savePreferences(updatedConfig);
4988
}
5089

5190
Future<SpamReportConfig> getSpamReportConfig() async {
52-
final preferences = await loadPreferences();
53-
return preferences.setting.spamReport;
91+
await _sharedPreferences.reload();
92+
93+
final jsonString = _sharedPreferences.getString(
94+
_preferencesSettingSpamReportKey,
95+
);
96+
97+
return jsonString == null
98+
? SpamReportConfig.initial()
99+
: SpamReportConfig.fromJson(jsonDecode(jsonString));
100+
}
101+
102+
Future<ThreadDetailConfig> getThreadConfig() async {
103+
await _sharedPreferences.reload();
104+
105+
final jsonString = _sharedPreferences.getString(
106+
_preferencesSettingThreadKey,
107+
);
108+
109+
return jsonString == null
110+
? ThreadDetailConfig.initial()
111+
: ThreadDetailConfig.fromJson(jsonDecode(jsonString));
54112
}
55113
}

lib/features/manage_account/data/repository/manage_account_repository_impl.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import 'dart:ui';
22

33
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
4+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
5+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_setting.dart';
46
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
5-
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_root.dart';
67

78
class ManageAccountRepositoryImpl extends ManageAccountRepository {
89

@@ -16,12 +17,12 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository {
1617
}
1718

1819
@override
19-
Future<void> updateLocalSettings(PreferencesRoot preferencesRoot) {
20-
return dataSource.updateLocalSettings(preferencesRoot);
20+
Future<PreferencesSetting> toggleLocalSettingsState(PreferencesConfig preferencesConfig) {
21+
return dataSource.toggleLocalSettingsState(preferencesConfig);
2122
}
2223

2324
@override
24-
Future<PreferencesRoot> getLocalSettings() {
25+
Future<PreferencesSetting> getLocalSettings() {
2526
return dataSource.getLocalSettings();
2627
}
2728
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
2+
import 'package:tmail_ui_user/features/manage_account/presentation/converters/default_preferences_config_converter.dart';
3+
4+
class DefaultPreferencesConfig extends PreferencesConfig {
5+
final dynamic data;
6+
7+
DefaultPreferencesConfig(this.data);
8+
9+
factory DefaultPreferencesConfig.fromJson(Map<String, dynamic> json) =>
10+
const DefaultPreferencesConfigConverter().fromJson(json);
11+
12+
@override
13+
Map<String, dynamic> toJson() =>
14+
const DefaultPreferencesConfigConverter().toJson(this);
15+
16+
@override
17+
List<Object?> get props => [data];
18+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
2+
3+
class EmptyPreferencesConfig extends PreferencesConfig {
4+
@override
5+
List<Object?> get props => [];
6+
7+
@override
8+
Map<String, dynamic> toJson() => {};
9+
}

0 commit comments

Comments
 (0)