timetracker/lib/features/settings/domain/settings_provider.dart
2026-08-03 21:51:48 +02:00

78 lines
2.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shared_preferences/shared_preferences.dart';
part 'settings_provider.g.dart';
@Riverpod(keepAlive: true)
Future<SharedPreferences> sharedPreferences(SharedPreferencesRef ref) =>
SharedPreferences.getInstance();
@riverpod
class ThemeModeNotifier extends _$ThemeModeNotifier {
static const _key = 'theme_mode';
@override
ThemeMode build() {
final prefs = ref.watch(sharedPreferencesProvider).valueOrNull;
final stored = prefs?.getString(_key);
return switch (stored) {
'light' => ThemeMode.light,
'dark' => ThemeMode.dark,
_ => ThemeMode.system,
};
}
Future<void> setThemeMode(ThemeMode mode) async {
final prefs = await ref.read(sharedPreferencesProvider.future);
await prefs.setString(_key, mode.name);
state = mode;
}
}
@riverpod
class LocaleNotifier extends _$LocaleNotifier {
static const _key = 'locale';
@override
Locale? build() {
final prefs = ref.watch(sharedPreferencesProvider).valueOrNull;
final stored = prefs?.getString(_key);
if (stored == null) return null; // use device locale
return Locale(stored);
}
Future<void> setLocale(Locale? locale) async {
final prefs = await ref.read(sharedPreferencesProvider.future);
if (locale == null) {
await prefs.remove(_key);
} else {
await prefs.setString(_key, locale.languageCode);
}
state = locale;
}
}
@riverpod
class QuickAccessCountNotifier extends _$QuickAccessCountNotifier {
static const _key = 'quick_access_count';
static const int minCount = 4;
static const int maxCount = 10;
static const int defaultCount = 6;
@override
int build() {
final prefs = ref.watch(sharedPreferencesProvider).valueOrNull;
final stored = prefs?.getInt(_key);
if (stored == null) return defaultCount;
return stored.clamp(minCount, maxCount);
}
Future<void> setCount(int count) async {
final clamped = count.clamp(minCount, maxCount);
final prefs = await ref.read(sharedPreferencesProvider.future);
await prefs.setInt(_key, clamped);
state = clamped;
}
}