Files
tasks/lib/model/repositories/local_repository.dart
T

95 lines
2.4 KiB
Dart

import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
import '../task.dart';
import 'interfaces/task_repository.dart';
class LocalRepository implements TaskRepository {
static const String _tasksKey = 'tasks';
static const String _taskOrderKey = 'taskOrder';
SharedPreferencesWithCache? _prefs;
Future<void> initialize() async {
if (_prefs == null) {
await SharedPreferencesWithCache.create(
cacheOptions: const SharedPreferencesWithCacheOptions(
allowList: <String>{_tasksKey, _taskOrderKey},
),
).then((value) => _prefs = value);
}
}
Future<void> _saveTasks(List<Task> tasks) async {
final jsonList = tasks.map<String>((e) => jsonEncode(e.toJson())).toList();
_prefs!.setStringList(_tasksKey, jsonList);
}
Future<void> _saveTaskOrder(List<String> taskOrder) async {
final jsonList = taskOrder.map((e) => jsonEncode(e)).toList();
return _prefs!.setStringList(_taskOrderKey, jsonList);
}
// Create
@override
Future<void> createTask(Task task) async {
final tasks = await loadTasks();
tasks.add(task);
return _saveTasks(tasks);
}
@override
Future<void> createTaskOrderEntry(String taskOrderEntry) async {
final taskOrder = await loadTaskOrder();
taskOrder.add(taskOrderEntry);
return _saveTaskOrder(taskOrder);
}
// Read
@override
Future<List<Task>> loadTasks() async {
final Iterable<String> jsonList = _prefs!.getStringList(_tasksKey) ?? [];
return jsonList.map<Task>((e) => Task.fromJson(jsonDecode(e))).toList();
}
@override
Future<List<String>> loadTaskOrder() async {
final Iterable<String> jsonList =
_prefs!.getStringList(_taskOrderKey) ?? [];
return jsonList.map<String>((e) => jsonDecode(e)).toList();
}
// Update
@override
Future<void> updateTask(Task task) async {
final tasks = await loadTasks();
tasks.remove(task);
tasks.add(task);
return _saveTasks(tasks);
}
@override
Future<void> updateTaskOrder(List<String> taskOrder) async {
return _saveTaskOrder(taskOrder);
}
// Delete
@override
Future<void> deleteTask(Task task) async {
final tasks = await loadTasks();
tasks.remove(task);
return _saveTasks(tasks);
}
@override
Future<void> deleteTaskOrderEntry(String taskOrderEntry) async {
final taskOrder = await loadTaskOrder();
taskOrder.remove(taskOrderEntry);
return _saveTaskOrder(taskOrder);
}
}