Added automatic update-merge of settings for new settings instead of falling back to defaults
This commit is contained in:
@ -7,7 +7,12 @@ import 'getHolidaysResponse.dart';
|
||||
class GetHolidays {
|
||||
Future<GetHolidaysResponse> query() async {
|
||||
String response = (await http.get(Uri.parse("https://ferien-api.de/api/v1/holidays/HE"))).body;
|
||||
List<dynamic> parsedListJson = jsonDecode(response);
|
||||
return GetHolidaysResponse(List<GetHolidaysResponseObject>.from(parsedListJson.map<GetHolidaysResponseObject>((dynamic i) => GetHolidaysResponseObject.fromJson(i))));
|
||||
return GetHolidaysResponse(
|
||||
List<GetHolidaysResponseObject>.from(
|
||||
jsonDecode(response).map<GetHolidaysResponseObject>(
|
||||
(dynamic i) => GetHolidaysResponseObject.fromJson(i)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
@ -12,7 +12,13 @@ class GetHolidaysCache extends RequestCache<GetHolidaysResponse> {
|
||||
@override
|
||||
GetHolidaysResponse onLocalData(String json) {
|
||||
List<dynamic> parsedListJson = jsonDecode(json)['data'];
|
||||
return GetHolidaysResponse(List<GetHolidaysResponseObject>.from(parsedListJson.map<GetHolidaysResponseObject>((dynamic i) => GetHolidaysResponseObject.fromJson(i))));
|
||||
return GetHolidaysResponse(
|
||||
List<GetHolidaysResponseObject>.from(
|
||||
parsedListJson.map<GetHolidaysResponseObject>(
|
||||
(dynamic i) => GetHolidaysResponseObject.fromJson(i)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -11,9 +11,7 @@ class SetFavorite extends TalkApi<void> {
|
||||
SetFavorite(this.chatToken, this.favoriteState) : super("v4/room/$chatToken/favorite", null);
|
||||
|
||||
@override
|
||||
assemble(String raw) {
|
||||
|
||||
}
|
||||
assemble(String raw) {}
|
||||
|
||||
@override
|
||||
Future<Response> request(Uri uri, Object? body, Map<String, String>? headers) {
|
||||
|
@ -95,8 +95,6 @@ class _MainState extends State<Main> {
|
||||
themeMode: settings.val().appTheme,
|
||||
theme: LightAppTheme.theme,
|
||||
darkTheme: DarkAppTheme.theme,
|
||||
|
||||
|
||||
home: Consumer<AccountModel>(
|
||||
builder: (context, accountModel, child) {
|
||||
switch(accountModel.state) {
|
||||
|
@ -25,19 +25,31 @@ class SettingsProvider extends ChangeNotifier {
|
||||
}
|
||||
|
||||
SettingsProvider() {
|
||||
init();
|
||||
_readFromStorage();
|
||||
}
|
||||
|
||||
void init({bool resetConfig = false}) async {
|
||||
void reset() async {
|
||||
_storage = await SharedPreferences.getInstance();
|
||||
_storage.remove(_fieldName);
|
||||
|
||||
if(resetConfig) _storage.remove(_fieldName);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void _readFromStorage() async {
|
||||
_storage = await SharedPreferences.getInstance();
|
||||
|
||||
try {
|
||||
_settings = Settings.fromJson(jsonDecode(_storage.getString(_fieldName)!));
|
||||
} catch(e) {
|
||||
log("Settings are defective, using defaults: ${e.toString()}");
|
||||
_settings = _defaults();
|
||||
} catch(exception) {
|
||||
try {
|
||||
log("Settings were changed, trying to recover from old Settings: ${exception.toString()}");
|
||||
_settings = Settings.fromJson(_mergeSettings(jsonDecode(_storage.getString(_fieldName)!), _defaults().toJson()));
|
||||
log("Settings recovered successfully: ${_settings.toJson().toString()}");
|
||||
} catch(exception) {
|
||||
log("Settings are defective and not recoverable, using defaults: ${exception.toString()}");
|
||||
_settings = _defaults();
|
||||
log("Settings were reset to defaults!");
|
||||
}
|
||||
}
|
||||
|
||||
notifyListeners();
|
||||
@ -47,6 +59,22 @@ class SettingsProvider extends ChangeNotifier {
|
||||
await _storage.setString(_fieldName, jsonEncode(_settings.toJson()));
|
||||
}
|
||||
|
||||
Map<String, dynamic> _mergeSettings(Map<String, dynamic> oldMap, Map<String, dynamic> newMap) {
|
||||
Map<String, dynamic> mergedMap = Map.from(newMap);
|
||||
|
||||
oldMap.forEach((key, value) {
|
||||
if (mergedMap.containsKey(key)) {
|
||||
if (value is Map<String, dynamic> && mergedMap[key] is Map<String, dynamic>) {
|
||||
mergedMap[key] = _mergeSettings(value, mergedMap[key]);
|
||||
} else {
|
||||
mergedMap[key] = value;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return mergedMap;
|
||||
}
|
||||
|
||||
Settings _defaults() {
|
||||
return Settings(
|
||||
appTheme: ThemeMode.system,
|
||||
|
@ -39,7 +39,6 @@ class _SettingsState extends State<Settings> {
|
||||
),
|
||||
body: ListView(
|
||||
children: [
|
||||
|
||||
ListTile(
|
||||
leading: const Icon(Icons.logout_outlined),
|
||||
title: const Text("Konto abmelden"),
|
||||
@ -248,7 +247,7 @@ class _SettingsState extends State<Settings> {
|
||||
confirmButton: "Unwiederruflich Löschen",
|
||||
onConfirm: () {
|
||||
setState(() {
|
||||
Provider.of<SettingsProvider>(context, listen: false).init(resetConfig: true);
|
||||
Provider.of<SettingsProvider>(context, listen: false).reset();
|
||||
});
|
||||
},
|
||||
).asDialog(context);
|
||||
|
Reference in New Issue
Block a user