3 Commits

Author SHA1 Message Date
marco 91eccc50ef removed unused import 2026-06-18 19:02:50 +02:00
marco d4d191d5d2 added alarm handling 2026-06-18 19:02:41 +02:00
marco f9642b0230 extended logic of alarm interface 2026-06-18 19:01:00 +02:00
5 changed files with 66 additions and 2 deletions
+26
View File
@@ -1,3 +1,29 @@
import 'location_alarm.dart';
import 'time_alarm.dart';
abstract class Alarm { abstract class Alarm {
String get id; String get id;
Map<String, dynamic> toJson();
factory Alarm.fromJson(Map<String, dynamic> json) {
if (json.containsKey('triggerAt')) {
return TimeAlarm.fromJson(json);
}
if (json.containsKey('location')) {
return LocationAlarm.fromJson(json);
}
throw ArgumentError('Unknown alarm type');
}
@override
bool operator ==(Object other) {
if (other is! Alarm) return false;
return hashCode == other.hashCode;
}
@override
int get hashCode => id.hashCode;
} }
+1
View File
@@ -23,6 +23,7 @@ class LocationAlarm implements Alarm {
); );
} }
@override
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
'id': id, 'id': id,
+38 -1
View File
@@ -2,12 +2,16 @@ import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import '../alarm.dart';
import '../task.dart'; import '../task.dart';
import 'interfaces/alarm_repository.dart';
import 'interfaces/task_repository.dart'; import 'interfaces/task_repository.dart';
class LocalRepository implements TaskRepository { class LocalRepository implements TaskRepository, AlarmRepository {
static const String _tasksKey = 'tasks'; static const String _tasksKey = 'tasks';
static const String _taskOrderKey = 'taskOrder'; static const String _taskOrderKey = 'taskOrder';
static const String _alarmsKey = 'alarms';
SharedPreferencesWithCache? _prefs; SharedPreferencesWithCache? _prefs;
Future<void> initialize() async { Future<void> initialize() async {
@@ -30,6 +34,11 @@ class LocalRepository implements TaskRepository {
return _prefs!.setStringList(_taskOrderKey, jsonList); 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 // Create
@override @override
@@ -46,6 +55,13 @@ class LocalRepository implements TaskRepository {
return _saveTaskOrder(taskOrder); return _saveTaskOrder(taskOrder);
} }
@override
Future<void> createAlarm(Alarm alarm) async {
final alarms = await loadAlarms();
alarms.add(alarm);
_saveAlarms(alarms);
}
// Read // Read
@override @override
@@ -61,6 +77,12 @@ class LocalRepository implements TaskRepository {
return jsonList.map<String>((e) => jsonDecode(e)).toList(); 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 // Update
@override @override
@@ -76,6 +98,14 @@ class LocalRepository implements TaskRepository {
return _saveTaskOrder(taskOrder); return _saveTaskOrder(taskOrder);
} }
@override
Future<void> updateAlarm(Alarm alarm) async {
final alarms = await loadAlarms();
alarms.remove(alarm);
alarms.add(alarm);
_saveAlarms(alarms);
}
// Delete // Delete
@override @override
@@ -91,4 +121,11 @@ class LocalRepository implements TaskRepository {
taskOrder.remove(taskOrderEntry); taskOrder.remove(taskOrderEntry);
return _saveTaskOrder(taskOrder); return _saveTaskOrder(taskOrder);
} }
@override
Future<void> deleteAlarm(Alarm alarm) async {
final alarms = await loadAlarms();
alarms.remove(alarm);
_saveAlarms(alarms);
}
} }
+1
View File
@@ -15,6 +15,7 @@ class TimeAlarm implements Alarm {
); );
} }
@override
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return {'id': id, 'triggerAt': triggerAt.toIso8601String()}; return {'id': id, 'triggerAt': triggerAt.toIso8601String()};
} }
-1
View File
@@ -5,7 +5,6 @@ import '../model/extensions/controller_context.dart';
import '../model/task.dart'; import '../model/task.dart';
import '../service/task_controller.dart'; import '../service/task_controller.dart';
import '../service/tools.dart'; import '../service/tools.dart';
import '../service/validators.dart';
import '../widgets/time_selector.dart'; import '../widgets/time_selector.dart';
class TaskEditPage extends StatefulWidget { class TaskEditPage extends StatefulWidget {