import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../data/repositories/in_memory_todo_repository.dart'; import '../../domain/entities/todo.dart'; import '../../domain/entities/create_todo_params.dart'; import '../../domain/entities/update_todo_params.dart'; import '../../domain/repositories/todo_repository.dart'; final todoRepositoryProvider = Provider((ref) { return InMemoryTodoRepository(); }); final todoListProvider = AsyncNotifierProvider>( TodoListNotifier.new, ); final todoDetailProvider = FutureProvider.family((ref, id) { return ref.watch(todoRepositoryProvider).getTodo(id); }); final todoFilterProvider = StateProvider((ref) { return const TodoFilter(); }); class TodoFilter { final String? priority; final bool? completed; const TodoFilter({this.priority, this.completed}); TodoFilter copyWith({String? priority, bool? completed, bool clearPriority = false, bool clearCompleted = false}) { return TodoFilter( priority: clearPriority ? null : (priority ?? this.priority), completed: clearCompleted ? null : (completed ?? this.completed), ); } } class TodoListNotifier extends AsyncNotifier> { @override Future> build() async { final repository = ref.watch(todoRepositoryProvider); final filter = ref.watch(todoFilterProvider); return repository.getTodos( priorityFilter: filter.priority, completedFilter: filter.completed, ); } Future createTodo(CreateTodoParams params) async { final repository = ref.read(todoRepositoryProvider); await repository.createTodo(params); ref.invalidateSelf(); } Future updateTodo(String id, UpdateTodoParams params) async { final repository = ref.read(todoRepositoryProvider); await repository.updateTodo(id, params); ref.invalidateSelf(); } Future deleteTodo(String id) async { final repository = ref.read(todoRepositoryProvider); await repository.deleteTodo(id); ref.invalidateSelf(); } Future toggleTodo(String id) async { final repository = ref.read(todoRepositoryProvider); await repository.toggleTodo(id); ref.invalidateSelf(); } Future reorderTodos(int oldIndex, int newIndex) async { final repository = ref.read(todoRepositoryProvider); await repository.reorderTodos(oldIndex, newIndex); ref.invalidateSelf(); } void setFilter(TodoFilter filter) { ref.read(todoFilterProvider.notifier).state = filter; ref.invalidateSelf(); } }