Skip to content

Commit

Permalink
Fix more state sync issues.
Browse files Browse the repository at this point in the history
  • Loading branch information
markstory committed Sep 4, 2023
1 parent b963ece commit 9ef5377
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 8 deletions.
15 changes: 15 additions & 0 deletions flutterapp/lib/db/completedtasks.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:clock/clock.dart';
import 'package:docket/models/task.dart';
import 'package:json_cache/json_cache.dart';

import 'package:docket/db/repository.dart';
Expand Down Expand Up @@ -40,6 +41,20 @@ class CompletedTasksRepo extends Repository<ProjectWithTasks> {
return ProjectWithTasks.fromMap(data[slug]);
}

/// Remove a task and notify listeners.
Future<void> removeTask(Task task) async {
var data = await getMap() ?? {};
var slug = task.projectSlug;
if (data[slug] == null || data[slug]['tasks'] == null) {
return;
}
List<Map<String, dynamic>> tasks = data[slug]['tasks'];
tasks.removeWhere((item) => item['id'] == task.id);
await setMap(data);

notifyListeners();
}

Future<void> remove(String slug) async {
var data = await getMap() ?? {};

Expand Down
2 changes: 1 addition & 1 deletion flutterapp/lib/providers/tasks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class TasksProvider extends ChangeNotifier {
await _database.deleteTask(task);
} else {
await _database.updateTask(task);
_database.completedTasks.expireSlug(task.projectSlug);
await _database.completedTasks.removeTask(task);
}
notifyListeners();
}
Expand Down
27 changes: 21 additions & 6 deletions flutterapp/test/providers/tasks_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -80,25 +80,40 @@ void main() {
expect(request.url.path, contains('/tasks/1/complete'));
return Response('', 204);
});
var completedListener = CallCounter();

var tasks = parseTaskList(tasksTodayResponseFixture);
setTodayView(tasks);

db.dailyTasks.addListener(listener);
db.completedTasks.addListener(completedListener);
var provider = TasksProvider(db);

await provider.toggleComplete(tasks[0]);

expect(listener.callCount, greaterThan(0));
expect(completedListener.callCount, greaterThan(0));
expect(db.dailyTasks.isDayExpired(tasks[0].dueOn!), isTrue);
expect(db.completedTasks.isFreshSlug(tasks[0].projectSlug), isFalse);

var viewData = await db.dailyTasks.get();
expect(viewData[todayStr]?.tasks.length, equals(1));
db.completedTasks.removeListener(completedListener);
});

test('toggleComplete() removes from completed task list', () async {
actions.client = MockClient((request) async {
expect(request.url.path, contains('/tasks/1/incomplete'));
return Response('', 204);
});
var tasks = parseTaskList(tasksTodayResponseFixture);
tasks[0].completed = true;

var taskView = ProjectWithTasks(tasks: tasks, project: Project(slug: 'home', name: 'Home'));
await db.completedTasks.set(taskView);

db.completedTasks.addListener(listener);
var provider = TasksProvider(db);

await provider.toggleComplete(tasks[0]);

expect(listener.callCount, greaterThan(0));
var completed = await db.completedTasks.get('home');
expect(completed.tasks.length, equals(1));
});

test('toggleComplete() sends request to incomplete and expires data', () async {
Expand Down
2 changes: 1 addition & 1 deletion flutterapp/test/viewmodels/projectcompleted_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ void main() {
db.completedTasks.expireSlug('home');
await viewmodel.loadData();
expect(viewmodel.tasks.length, equals(2));
expect(callCounter.callCount, equals(2));
expect(callCounter.callCount, equals(4));
});

test('refresh() loads data from the server', () async {
Expand Down

0 comments on commit 9ef5377

Please sign in to comment.