okane/lib/ui/state/settings.dart

49 lines
1.3 KiB
Dart

import 'dart:convert';
import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:shared_preferences/shared_preferences.dart';
part 'settings.freezed.dart';
part 'settings.g.dart';
enum ColorSchemeSettings { light, dark, system }
@freezed
abstract class Settings with _$Settings {
const factory Settings({
@Default(ColorSchemeSettings.system) ColorSchemeSettings colorScheme,
}) = _Settings;
factory Settings.fromJson(Map<String, Object?> json) =>
_$SettingsFromJson(json);
}
@freezed
abstract class SettingsWrapper with _$SettingsWrapper {
const factory SettingsWrapper({@Default(Settings()) Settings settings}) =
_SettingsWrapper;
}
class SettingsCubit extends Cubit<SettingsWrapper> {
final SharedPreferencesAsync _prefs = SharedPreferencesAsync();
SettingsCubit() : super(SettingsWrapper());
Future<void> loadSettings() async {
final value = await _prefs.getString("settings");
if (value == null) {
await _prefs.setString("settings", jsonEncode(Settings().toJson()));
return;
}
emit(state.copyWith(settings: Settings.fromJson(jsonDecode(value))));
}
Future<void> setSettings(Settings settings) async {
emit(state.copyWith(settings: settings));
await _prefs.setString("settings", jsonEncode(settings.toJson()));
}
}