Implement comprehensive recurring event support

- Add RRULE parsing for DAILY, WEEKLY, MONTHLY, YEARLY frequencies
- Support INTERVAL, COUNT, and BYDAY recurrence parameters
- Generate event occurrences across 30 days past to 365 days future
- Update event refresh to regenerate all recurring occurrences
- Clean up unused imports for cleaner compilation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Connor Johnstone
2025-08-28 17:59:23 -04:00
parent d945c46e5a
commit 0741afd0b2
3 changed files with 239 additions and 10 deletions

View File

@@ -138,16 +138,33 @@ fn CalendarView() -> Html {
match calendar_service.refresh_event(&token, &uid).await {
Ok(Some(refreshed_event)) => {
// Update the event in the existing events map
// If this is a recurring event, we need to regenerate all occurrences
let mut updated_events = (*events).clone();
// First, remove all existing occurrences of this event
for (_, day_events) in updated_events.iter_mut() {
for existing_event in day_events.iter_mut() {
if existing_event.uid == uid {
*existing_event = refreshed_event.clone();
break;
}
}
day_events.retain(|e| e.uid != uid);
}
// Then, if it's a recurring event, generate new occurrences
if refreshed_event.recurrence_rule.is_some() {
let new_occurrences = CalendarService::expand_recurring_events(vec![refreshed_event.clone()]);
// Add all new occurrences to the appropriate dates
for occurrence in new_occurrences {
let date = occurrence.get_date();
updated_events.entry(date)
.or_insert_with(Vec::new)
.push(occurrence);
}
} else {
// Non-recurring event, just add it to the appropriate date
let date = refreshed_event.get_date();
updated_events.entry(date)
.or_insert_with(Vec::new)
.push(refreshed_event);
}
events.set(updated_events);
}
Ok(None) => {