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;
notifyListeners();
try {
final calendarEvents = await _calendarRepository.fetchWeekEvents(
templateId: selectedTemplateId,
displayDate: _displayDate,
parentElementsOnly: false,
);
_events = calendarEvents;
// Sort events to make sure `_events.first` is the earliest one.
_events.sort((a, b) => a.startDate.compareTo(b.startDate));
// On the first load, if the current week has no events, jump to the first event's week.
if (_isInitialLoad) {
final firstDayOfWeek =
_displayDate.subtract(Duration(days: _displayDate.weekday % 7));
final lastDayOfWeek = firstDayOfWeek.add(const Duration(days: 7));
final bool hasEventsInCurrentWeek = _events.any((event) =>
event.startDate.isBefore(lastDayOfWeek) &&
event.endDate.isAfter(firstDayOfWeek));
if (!hasEventsInCurrentWeek && _events.isNotEmpty) {
_displayDate = _events.first.startDate;
}
_isInitialLoad = false;
}
} catch (e) {
_errorMessage = 'Failed to load calendar events: $e';
debugPrint('Error fetching events in CalendarWeekViewModel: $e');
_events = [];
} finally {
_isLoading = false;
notifyListeners();
}
}