import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; import '../alarm.dart'; import '../location.dart'; import '../task.dart'; import 'interfaces/alarm_repository.dart'; import 'interfaces/location_repository.dart'; import 'interfaces/task_repository.dart'; class LocalRepository implements TaskRepository, AlarmRepository, LocationRepository { static const String _tasksKey = 'tasks'; static const String _taskOrderKey = 'taskOrder'; static const String _alarmsKey = 'alarms'; static const String _locationsKey = 'locations'; SharedPreferencesWithCache? _prefs; Future initialize() async { if (_prefs == null) { await SharedPreferencesWithCache.create( cacheOptions: const SharedPreferencesWithCacheOptions( allowList: { _tasksKey, _taskOrderKey, _alarmsKey, _locationsKey, }, ), ).then((value) => _prefs = value); } } Future _saveTasks(List tasks) async { final jsonList = tasks.map((e) => jsonEncode(e.toJson())).toList(); _prefs!.setStringList(_tasksKey, jsonList); } Future _saveLocations(List locations) async { final jsonList = locations .map((e) => jsonEncode(e.toJson())) .toList(); _prefs!.setStringList(_locationsKey, jsonList); } Future _saveTaskOrder(List taskOrder) async { final jsonList = taskOrder.map((e) => jsonEncode(e)).toList(); return _prefs!.setStringList(_taskOrderKey, jsonList); } Future _saveAlarms(List alarms) async { final jsonList = alarms.map((e) => jsonEncode(e.toJson())).toList(); return _prefs!.setStringList(_alarmsKey, 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); } @override Future createAlarm(Alarm alarm) async { final alarms = await loadAlarms(); alarms.add(alarm); _saveAlarms(alarms); } @override Future createLocation(Location location) async { final locations = await loadLocations(); locations.add(location); _saveLocations(locations); } // 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(); } @override Future> loadAlarms() async { final Iterable jsonList = _prefs!.getStringList(_alarmsKey) ?? []; return jsonList.map((e) => Alarm.fromJson(jsonDecode(e))).toList(); } @override Future> loadLocations() async { final Iterable jsonList = _prefs!.getStringList(_locationsKey) ?? []; return jsonList .map((e) => Location.fromJson(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); } @override Future updateAlarm(Alarm alarm) async { final alarms = await loadAlarms(); alarms.remove(alarm); alarms.add(alarm); _saveAlarms(alarms); } @override Future updateLocation(Location location) async { final locations = await loadLocations(); locations.remove(location); locations.add(location); _saveLocations(locations); } // 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); } @override Future deleteAlarm(Alarm alarm) async { final alarms = await loadAlarms(); alarms.remove(alarm); _saveAlarms(alarms); } @override Future deleteLocation(Location location) async { final locations = await loadLocations(); locations.remove(location); _saveLocations(locations); } }