87 lines
2.5 KiB
Dart
87 lines
2.5 KiB
Dart
|
|
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();
|
||
|
|
}
|
||
|
|
}
|