iykyk_msn/mobile/lib/core/app_settings.dart

78 lines
2.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
const _kThemeMode = 'app_theme_mode';
const _kNotificationsEnabled = 'app_notifications_enabled';
String _themeToStr(ThemeMode m) {
return switch (m) {
ThemeMode.light => 'light',
_ => 'system',
};
}
ThemeMode _themeFromStr(String? s) {
return switch (s) {
'light' => ThemeMode.light,
// Legacy: app no longer offers dark; map old saves to light.
'dark' => ThemeMode.light,
_ => ThemeMode.system,
};
}
final themeModeProvider = NotifierProvider<ThemeModeNotifier, ThemeMode>(ThemeModeNotifier.new);
class ThemeModeNotifier extends Notifier<ThemeMode> {
@override
ThemeMode build() {
Future.microtask(_load);
return ThemeMode.system;
}
Future<void> _load() async {
final p = await SharedPreferences.getInstance();
final s = p.getString(_kThemeMode);
if (s != null) {
state = _themeFromStr(s);
}
}
Future<void> setThemeMode(ThemeMode mode) async {
state = mode;
final p = await SharedPreferences.getInstance();
await p.setString(_kThemeMode, _themeToStr(mode));
}
}
final notificationsEnabledProvider =
NotifierProvider<NotificationsEnabledNotifier, bool>(NotificationsEnabledNotifier.new);
class NotificationsEnabledNotifier extends Notifier<bool> {
@override
bool build() {
Future.microtask(_load);
return true;
}
Future<void> _load() async {
final p = await SharedPreferences.getInstance();
if (p.containsKey(_kNotificationsEnabled)) {
state = p.getBool(_kNotificationsEnabled) ?? true;
}
}
Future<void> setEnabled(bool value) async {
state = value;
final p = await SharedPreferences.getInstance();
await p.setBool(_kNotificationsEnabled, value);
}
}
/// Reads persisted value (default true if never set). Use before first notifier tick if needed.
Future<bool> readNotificationsEnabledFromPrefs() async {
final p = await SharedPreferences.getInstance();
if (!p.containsKey(_kNotificationsEnabled)) return true;
return p.getBool(_kNotificationsEnabled) ?? true;
}