68 lines
3.1 KiB
Dart
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.');
|
|
});
|
|
}
|
|
} |