lemmur-app-android/lib/stores/config_store.dart

139 lines
4.0 KiB
Dart
Raw Normal View History

2021-02-24 21:54:15 +01:00
import 'dart:convert';
2020-08-30 22:43:16 +02:00
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
2021-02-24 21:54:15 +01:00
import 'package:json_annotation/json_annotation.dart';
2021-04-16 20:15:48 +02:00
import 'package:lemmy_api_client/v3.dart';
2020-08-30 22:43:16 +02:00
import 'package:shared_preferences/shared_preferences.dart';
2021-02-27 17:02:55 +01:00
import '../l10n/l10n.dart';
2021-02-24 21:54:15 +01:00
part 'config_store.g.dart';
2020-10-26 00:39:57 +01:00
/// Store managing user-level configuration such as theme or language
2021-02-24 21:54:15 +01:00
@JsonSerializable()
class ConfigStore extends ChangeNotifier {
2021-02-24 21:54:15 +01:00
static const prefsKey = 'v1:ConfigStore';
static final _prefs = SharedPreferences.getInstance();
late ThemeMode _theme;
2021-02-24 21:54:15 +01:00
@JsonKey(defaultValue: ThemeMode.system)
ThemeMode get theme => _theme;
set theme(ThemeMode theme) {
_theme = theme;
notifyListeners();
save();
2020-08-30 22:43:16 +02:00
}
late bool _amoledDarkMode;
2021-02-24 21:54:15 +01:00
@JsonKey(defaultValue: false)
bool get amoledDarkMode => _amoledDarkMode;
set amoledDarkMode(bool amoledDarkMode) {
_amoledDarkMode = amoledDarkMode;
notifyListeners();
save();
2020-08-30 22:43:16 +02:00
}
2021-04-11 00:55:04 +02:00
late Locale _locale;
// default value is set in the `LocaleSerde.fromJson` method because json_serializable does
// not accept non-literals as defaultValue
2021-02-27 17:02:55 +01:00
@JsonKey(fromJson: LocaleSerde.fromJson, toJson: LocaleSerde.toJson)
2021-04-11 00:55:04 +02:00
Locale get locale => _locale;
2021-02-27 14:39:58 +01:00
set locale(Locale locale) {
_locale = locale;
notifyListeners();
save();
}
2021-04-16 20:15:48 +02:00
late bool _showAvatars;
@JsonKey(defaultValue: true)
bool get showAvatars => _showAvatars;
set showAvatars(bool showAvatars) {
_showAvatars = showAvatars;
notifyListeners();
save();
}
late bool _showScores;
@JsonKey(defaultValue: true)
bool get showScores => _showScores;
set showScores(bool showScores) {
_showScores = showScores;
notifyListeners();
save();
}
2021-04-16 21:43:02 +02:00
late SortType _defaultSortType;
2021-04-17 12:22:15 +02:00
// default is set in fromJson
2021-04-16 21:43:02 +02:00
@JsonKey(fromJson: _sortTypeFromJson)
SortType get defaultSortType => _defaultSortType;
set defaultSortType(SortType defaultSortType) {
_defaultSortType = defaultSortType;
notifyListeners();
save();
}
late PostListingType _defaultListingType;
2021-04-17 12:22:15 +02:00
// default is set in fromJson
2021-04-16 21:43:02 +02:00
@JsonKey(fromJson: _postListingTypeFromJson)
PostListingType get defaultListingType => _defaultListingType;
set defaultListingType(PostListingType defaultListingType) {
_defaultListingType = defaultListingType;
notifyListeners();
save();
}
2021-04-16 21:19:59 +02:00
/// Copies over settings from lemmy to [ConfigStore]
void copyLemmyUserSettings(LocalUserSettings localUserSettings) {
2021-04-16 20:15:48 +02:00
// themes from lemmy-ui that are dark mode
2021-04-23 19:26:30 +02:00
const darkModeLemmyUiThemes = {
'solar',
'cyborg',
'darkly',
'vaporwave-dark',
'i386',
};
2021-04-16 20:15:48 +02:00
_showAvatars = localUserSettings.showAvatars;
2021-04-23 19:26:30 +02:00
_theme = darkModeLemmyUiThemes.contains(localUserSettings.theme)
? ThemeMode.dark
: ThemeMode.light;
_locale = L10n.supportedLocales.contains(Locale(localUserSettings.lang))
? Locale(localUserSettings.lang)
: _locale;
2021-04-16 20:15:48 +02:00
// TODO: add when it is released
// _showScores = localUserSettings.showScores;
2021-04-16 21:43:02 +02:00
_defaultSortType = localUserSettings.defaultSortType;
_defaultListingType = localUserSettings.defaultListingType;
2021-04-16 20:15:48 +02:00
notifyListeners();
save();
}
2021-04-16 21:19:59 +02:00
/// Fetches [LocalUserSettings] and imports them with [.copyLemmyUserSettings]
Future<void> importLemmyUserSettings(Jwt token) async {
final site =
await LemmyApiV3(token.payload.iss).run(GetSite(auth: token.raw));
copyLemmyUserSettings(site.myUser!.localUser);
}
2021-02-24 21:54:15 +01:00
static Future<ConfigStore> load() async {
final prefs = await _prefs;
return _$ConfigStoreFromJson(
jsonDecode(prefs.getString(prefsKey) ?? '{}') as Map<String, dynamic>,
);
2020-08-30 22:43:16 +02:00
}
Future<void> save() async {
2021-02-24 21:54:15 +01:00
final prefs = await _prefs;
2020-08-30 22:43:16 +02:00
2021-02-24 21:54:15 +01:00
await prefs.setString(prefsKey, jsonEncode(_$ConfigStoreToJson(this)));
2020-08-30 22:43:16 +02:00
}
}
2021-04-16 21:43:02 +02:00
SortType _sortTypeFromJson(String? json) =>
json != null ? SortType.fromJson(json) : SortType.hot;
PostListingType _postListingTypeFromJson(String? json) =>
json != null ? PostListingType.fromJson(json) : PostListingType.all;