feat(07-01): create TaskSortOption enum, SortPreferenceNotifier, and localization strings

- TaskSortOption enum with alphabetical, interval, effort values
- SortPreferenceNotifier persists sort preference to SharedPreferences
- Follows ThemeNotifier pattern: sync default (alphabetical), async load
- Generated sort_preference_notifier.g.dart via build_runner
- Added sortAlphabetical/sortInterval/sortEffort/sortLabel to app_de.arb
- Regenerated app_localizations.dart and app_localizations_de.dart
This commit is contained in:
2026-03-16 22:32:06 +01:00
parent a9f298350e
commit 13c7d623ba
6 changed files with 203 additions and 1 deletions

View File

@@ -0,0 +1,57 @@
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:household_keeper/features/tasks/domain/task_sort_option.dart';
part 'sort_preference_notifier.g.dart';
const _sortOptionKey = 'task_sort_option';
/// Notifier that manages the active task sort preference.
///
/// Defaults to [TaskSortOption.alphabetical] synchronously (matching the
/// existing A-Z sort in CalendarDayList), then loads the persisted value
/// asynchronously on first build.
///
/// Follows the same pattern as [ThemeNotifier] in
/// `lib/core/theme/theme_provider.dart`.
@Riverpod(keepAlive: true)
class SortPreferenceNotifier extends _$SortPreferenceNotifier {
@override
TaskSortOption build() {
_loadPersisted();
return TaskSortOption.alphabetical;
}
Future<void> _loadPersisted() async {
final prefs = await SharedPreferences.getInstance();
final persisted = prefs.getString(_sortOptionKey);
if (persisted != null) {
state = _fromString(persisted);
}
}
/// Update the active sort preference and persist it.
Future<void> setSortOption(TaskSortOption option) async {
state = option;
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_sortOptionKey, _toString(option));
}
static TaskSortOption _fromString(String value) {
switch (value) {
case 'alphabetical':
return TaskSortOption.alphabetical;
case 'interval':
return TaskSortOption.interval;
case 'effort':
return TaskSortOption.effort;
default:
return TaskSortOption.alphabetical;
}
}
static String _toString(TaskSortOption option) {
return option.name;
}
}

View File

@@ -0,0 +1,96 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'sort_preference_notifier.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Notifier that manages the active task sort preference.
///
/// Defaults to [TaskSortOption.alphabetical] synchronously (matching the
/// existing A-Z sort in CalendarDayList), then loads the persisted value
/// asynchronously on first build.
///
/// Follows the same pattern as [ThemeNotifier] in
/// `lib/core/theme/theme_provider.dart`.
@ProviderFor(SortPreferenceNotifier)
final sortPreferenceProvider = SortPreferenceNotifierProvider._();
/// Notifier that manages the active task sort preference.
///
/// Defaults to [TaskSortOption.alphabetical] synchronously (matching the
/// existing A-Z sort in CalendarDayList), then loads the persisted value
/// asynchronously on first build.
///
/// Follows the same pattern as [ThemeNotifier] in
/// `lib/core/theme/theme_provider.dart`.
final class SortPreferenceNotifierProvider
extends $NotifierProvider<SortPreferenceNotifier, TaskSortOption> {
/// Notifier that manages the active task sort preference.
///
/// Defaults to [TaskSortOption.alphabetical] synchronously (matching the
/// existing A-Z sort in CalendarDayList), then loads the persisted value
/// asynchronously on first build.
///
/// Follows the same pattern as [ThemeNotifier] in
/// `lib/core/theme/theme_provider.dart`.
SortPreferenceNotifierProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'sortPreferenceProvider',
isAutoDispose: false,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$sortPreferenceNotifierHash();
@$internal
@override
SortPreferenceNotifier create() => SortPreferenceNotifier();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(TaskSortOption value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<TaskSortOption>(value),
);
}
}
String _$sortPreferenceNotifierHash() =>
r'5d7f2c5d06b82b4114262ee05cf890ebe717fe2a';
/// Notifier that manages the active task sort preference.
///
/// Defaults to [TaskSortOption.alphabetical] synchronously (matching the
/// existing A-Z sort in CalendarDayList), then loads the persisted value
/// asynchronously on first build.
///
/// Follows the same pattern as [ThemeNotifier] in
/// `lib/core/theme/theme_provider.dart`.
abstract class _$SortPreferenceNotifier extends $Notifier<TaskSortOption> {
TaskSortOption build();
@$mustCallSuper
@override
void runBuild() {
final ref = this.ref as $Ref<TaskSortOption, TaskSortOption>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<TaskSortOption, TaskSortOption>,
TaskSortOption,
Object?,
Object?
>;
element.handleCreate(ref, build);
}
}