Files
2026-02-13 15:53:22 +01:00

68 lines
3.1 KiB
Dart

import 'package:hiddingsel_app/appflow/controller/network/calendar.dart';
import 'package:hiddingsel_app/appflow/model/event.dart';
import 'package:hiddingsel_app/appflow/model/event_organisations.dart';
import '../../constants/constant.dart';
import '../../services/storage.dart';
import '../../todo/scheduled_notification.dart';
class EventController {
static int defaultSortCompare(EventModel a, EventModel b) => a.schedule.startTime.compareTo(b.schedule.startTime);
static Stream<List<EventModel>> getEventListStream({int Function(EventModel, EventModel) sortCompare = defaultSortCompare}) async* {
List<EventModel> yieldEvents = [];
List<EventModel> allEvents = [];
List<EventModel> newEvents = [];
List<EventModel> organisationEvents = [];
List<EventModel> savedEvents = await DataConnector.getJsonEncodableList<
EventModel>(SystemStrings.dataEvents, [], EventModel.fromJson);
yield yieldEvents = yieldEvents..addAll(savedEvents)..sort(sortCompare);
for (EventOrganisationModel eventOrganisation in EventOrganisationModel.values){
organisationEvents = await CalendarController
.getOrganisationEvents(eventOrganisation);
newEvents = organisationEvents.where((a) => !yieldEvents.contains(a)).toList();
if (newEvents.isNotEmpty) {
yield yieldEvents
..addAll(newEvents)
..sort(sortCompare);
}
allEvents = allEvents..addAll(organisationEvents)..sort(sortCompare);
}
DataConnector.saveJsonEncodable(SystemStrings.dataEvents, allEvents);
}
static Future<void> scheduleNotificationsBySettings() async {
List<EventOrganisationModel> notifiableOrganisations = await _getNotifiableOrganisations();
final duration = Duration(milliseconds: await SettingsConnector.getInt(SystemStrings.keyAlertTime, 1*60*60*1000));
await ScheduledNotificationConnector.cancelAllScheduledNotification();
EventController.getEventListStream().forEach((List<EventModel> list) async{
var eventsToSchedule = list
.where((e) => e.schedule.startTime.isAfter(DateTime.now()))
.where((e) => notifiableOrganisations.any((o) => e.eventOrganizer.contains(o)))
.toList();
_scheduleNotifications(eventsToSchedule, duration);
});
}
static _getNotifiableOrganisations() async {
var notifiableOrganisations = List<EventOrganisationModel>.empty(growable: true);
for (EventOrganisationModel event in EventOrganisationModel.values) {
if(await event.eventNotificationAllowed) notifiableOrganisations.add(event);
}
return notifiableOrganisations;
}
static _scheduleNotifications(List<EventModel> eventsToSchedule,
Duration duration) {
eventsToSchedule.sort((a, b) => a.schedule.startTime.compareTo(b.schedule.startTime));
Future.forEach(eventsToSchedule.take(50), (EventModel element) async {
ScheduledNotificationConnector.scheduleNotification(
element.id.hashCode,
element.schedule.startTime.subtract(duration),
element.name,
'${element.eventOrganizer.first.name} - Der Termin beginnt bald.');
});
}
}