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 initialize() async { if (_prefs == null) { await SharedPreferencesWithCache.create( cacheOptions: const SharedPreferencesWithCacheOptions( allowList: {_tasksKey, _taskOrderKey}, ), ).then((value) => _prefs = value); } } Future _saveTasks(List tasks) async { final jsonList = tasks.map((e) => jsonEncode(e.toJson())).toList(); _prefs!.setStringList(_tasksKey, jsonList); } Future _saveTaskOrder(List taskOrder) async { final jsonList = taskOrder.map((e) => jsonEncode(e)).toList(); return _prefs!.setStringList(_taskOrderKey, jsonList); } // Create @override Future createTask(Task task) async { final tasks = await loadTasks(); tasks.add(task); return _saveTasks(tasks); } @override Future createTaskOrderEntry(String taskOrderEntry) async { final taskOrder = await loadTaskOrder(); taskOrder.add(taskOrderEntry); return _saveTaskOrder(taskOrder); } // Read @override Future> loadTasks() async { final Iterable jsonList = _prefs!.getStringList(_tasksKey) ?? []; return jsonList.map((e) => Task.fromJson(jsonDecode(e))).toList(); } @override Future> loadTaskOrder() async { final Iterable jsonList = _prefs!.getStringList(_taskOrderKey) ?? []; return jsonList.map((e) => jsonDecode(e)).toList(); } // Update @override Future updateTask(Task task) async { final tasks = await loadTasks(); tasks.remove(task); tasks.add(task); return _saveTasks(tasks); } @override Future updateTaskOrder(List taskOrder) async { return _saveTaskOrder(taskOrder); } // Delete @override Future deleteTask(Task task) async { final tasks = await loadTasks(); tasks.remove(task); return _saveTasks(tasks); } @override Future deleteTaskOrderEntry(String taskOrderEntry) async { final taskOrder = await loadTaskOrder(); taskOrder.remove(taskOrderEntry); return _saveTaskOrder(taskOrder); } }