fetchEvents method
Fetches calendar events for the given displayDate and selected template.
Updates loading and error states, and sorts events by start date. On initial load, it may adjust the display date if the current month has no events and other months do.
Implementation
Future<void> fetchEvents(DateTime displayDate) async {
_displayDate = displayDate;
final selectedTemplateId = _templateProvider?.selectedTemplateId;
_isLoading = true;
_errorMessage = null;
try {
final calendarEvents = await _calendarRepository.fetchMonthEvents(
templateId: selectedTemplateId,
displayDate: _displayDate,
parentElementsOnly: false,
);
_events = calendarEvents;
_events.sort((a, b) => a.startDate.compareTo(b.startDate));
if (_isInitialLoad) {
final firstDayOfDisplayMonth =
DateTime(_displayDate.year, _displayDate.month, 1);
final lastDayOfDisplayMonth =
DateTime(_displayDate.year, _displayDate.month + 1, 0)
.add(const Duration(days: 1));
final bool hasEventsInCurrentMonth = _events.any((event) =>
event.startDate.isBefore(lastDayOfDisplayMonth) &&
event.endDate.isAfter(firstDayOfDisplayMonth));
if (!hasEventsInCurrentMonth && _events.isNotEmpty) {
_displayDate = _events.first.startDate;
}
_isInitialLoad = false;
}
} catch (e) {
_errorMessage = 'Failed to load calendar events: $e';
debugPrint('Error fetching events in CalendarMonthViewModel: $e');
_events = [];
} finally {
_isLoading = false;
notifyListeners();
}
}