50 lines
1.3 KiB
Dart
50 lines
1.3 KiB
Dart
import 'package:flutter/material.dart' show ChangeNotifier;
|
|
|
|
import '../model/repositories/interfaces/task_repository.dart';
|
|
import '../model/task.dart';
|
|
|
|
class TaskController extends ChangeNotifier {
|
|
TaskController(TaskRepository repository) : _repository = repository {
|
|
Future.wait([
|
|
_loadTaskOrder(),
|
|
_loadTasks(),
|
|
]).whenComplete(() => notifyListeners());
|
|
}
|
|
|
|
final TaskRepository _repository;
|
|
|
|
final List<Task> _tasks = [];
|
|
final List<String> _taskOrder = [];
|
|
|
|
List<Task> get orderedTasks {
|
|
final lookup = {for (final task in _tasks) task.id: task};
|
|
|
|
return _taskOrder.map((id) => lookup[id]!).toList();
|
|
}
|
|
|
|
Future<void> reorderTask(int oldIndex, int newIndex) async {
|
|
final taskId = _taskOrder.removeAt(oldIndex);
|
|
_taskOrder.insert(newIndex, taskId);
|
|
_repository.saveTaskOrder(_taskOrder);
|
|
}
|
|
|
|
Future<void> saveTask(Task task) async {
|
|
await _repository.saveTask(task);
|
|
await _loadTasks();
|
|
await _loadTaskOrder();
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> _loadTasks() async {
|
|
_tasks.clear();
|
|
return _repository.loadTasks().then((value) => _tasks.addAll(value));
|
|
}
|
|
|
|
Future<void> _loadTaskOrder() async {
|
|
_taskOrder.clear();
|
|
return _repository.loadTaskOrder().then(
|
|
(value) => _taskOrder.addAll(value),
|
|
);
|
|
}
|
|
}
|