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> getEventListStream({int Function(EventModel, EventModel) sortCompare = defaultSortCompare}) async* { List yieldEvents = []; List allEvents = []; List newEvents = []; List organisationEvents = []; List 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 scheduleNotificationsBySettings() async { List notifiableOrganisations = await _getNotifiableOrganisations(); final duration = Duration(milliseconds: await SettingsConnector.getInt(SystemStrings.keyAlertTime, 1*60*60*1000)); await ScheduledNotificationConnector.cancelAllScheduledNotification(); EventController.getEventListStream().forEach((List 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.empty(growable: true); for (EventOrganisationModel event in EventOrganisationModel.values) { if(await event.eventNotificationAllowed) notifiableOrganisations.add(event); } return notifiableOrganisations; } static _scheduleNotifications(List 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.'); }); } }