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); } } // Create @override Future saveTask(Task task) async { final tasks = await loadTasks(); if (tasks.contains(task)) { tasks.remove(task); } else { final taskOrder = (await loadTaskOrder()).toList(); taskOrder.add(task.id); await saveTaskOrder(taskOrder); } tasks.add(task); return saveTasks(tasks); } @override Future saveTasks(List tasks) async { final jsonList = tasks.map((e) => jsonEncode(e.toJson())).toList(); return _prefs!.setStringList(_tasksKey, jsonList); } @override Future saveTaskOrder(Iterable taskOrder) { final jsonList = taskOrder.map((e) => jsonEncode(e)).toList(); return _prefs!.setStringList(_taskOrderKey, jsonList); } // Read @override Future> loadTaskOrder() async { final Iterable jsonList = _prefs!.getStringList(_taskOrderKey) ?? []; return jsonList.map((e) => jsonDecode(e)); } @override Future> loadTasks() async { final Iterable jsonList = _prefs!.getStringList(_tasksKey) ?? []; return jsonList.map((e) => Task.fromJson(jsonDecode(e))).toList(); } // Delete @override Future deleteTask(Task task) async { final tasks = await loadTasks(); tasks.remove(task); saveTasks(tasks); } }