132 lines
3.4 KiB
Dart
132 lines
3.4 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
import '../alarm.dart';
|
|
import '../task.dart';
|
|
import 'interfaces/alarm_repository.dart';
|
|
import 'interfaces/task_repository.dart';
|
|
|
|
class LocalRepository implements TaskRepository, AlarmRepository {
|
|
static const String _tasksKey = 'tasks';
|
|
static const String _taskOrderKey = 'taskOrder';
|
|
static const String _alarmsKey = 'alarms';
|
|
|
|
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);
|
|
}
|
|
|
|
Future<void> _saveAlarms(List<Alarm> alarms) async {
|
|
final jsonList = alarms.map<String>((e) => jsonEncode(e.toJson())).toList();
|
|
return _prefs!.setStringList(_alarmsKey, 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);
|
|
}
|
|
|
|
@override
|
|
Future<void> createAlarm(Alarm alarm) async {
|
|
final alarms = await loadAlarms();
|
|
alarms.add(alarm);
|
|
_saveAlarms(alarms);
|
|
}
|
|
|
|
// 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();
|
|
}
|
|
|
|
@override
|
|
Future<List<Alarm>> loadAlarms() async {
|
|
final Iterable<String> jsonList = _prefs!.getStringList(_alarmsKey) ?? [];
|
|
return jsonList.map<Alarm>((e) => Alarm.fromJson(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);
|
|
}
|
|
|
|
@override
|
|
Future<void> updateAlarm(Alarm alarm) async {
|
|
final alarms = await loadAlarms();
|
|
alarms.remove(alarm);
|
|
alarms.add(alarm);
|
|
_saveAlarms(alarms);
|
|
}
|
|
|
|
// 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);
|
|
}
|
|
|
|
@override
|
|
Future<void> deleteAlarm(Alarm alarm) async {
|
|
final alarms = await loadAlarms();
|
|
alarms.remove(alarm);
|
|
_saveAlarms(alarms);
|
|
}
|
|
}
|