78 lines
2.1 KiB
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;
|
|
}
|