todo_app/lib/features/todo/presentation/providers/todo_providers.dart

87 lines
2.5 KiB
Dart
Raw Normal View History

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<TodoRepository>((ref) {
return InMemoryTodoRepository();
});
final todoListProvider =
AsyncNotifierProvider<TodoListNotifier, List<Todo>>(
TodoListNotifier.new,
);
final todoDetailProvider =
FutureProvider.family<Todo, String>((ref, id) {
return ref.watch(todoRepositoryProvider).getTodo(id);
});
final todoFilterProvider = StateProvider<TodoFilter>((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<List<Todo>> {
@override
Future<List<Todo>> build() async {
final repository = ref.watch(todoRepositoryProvider);
final filter = ref.watch(todoFilterProvider);
return repository.getTodos(
priorityFilter: filter.priority,
completedFilter: filter.completed,
);
}
Future<void> createTodo(CreateTodoParams params) async {
final repository = ref.read(todoRepositoryProvider);
await repository.createTodo(params);
ref.invalidateSelf();
}
Future<void> updateTodo(String id, UpdateTodoParams params) async {
final repository = ref.read(todoRepositoryProvider);
await repository.updateTodo(id, params);
ref.invalidateSelf();
}
Future<void> deleteTodo(String id) async {
final repository = ref.read(todoRepositoryProvider);
await repository.deleteTodo(id);
ref.invalidateSelf();
}
Future<void> toggleTodo(String id) async {
final repository = ref.read(todoRepositoryProvider);
await repository.toggleTodo(id);
ref.invalidateSelf();
}
Future<void> 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();
}
}