From 75d9149c76a0aea66546d850702449050cb8b89a Mon Sep 17 00:00:00 2001 From: Connor Johnstone Date: Wed, 3 Sep 2025 22:15:03 -0400 Subject: [PATCH] Add immediate refresh when new external calendars are created MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When users add a new external calendar, events now appear instantly instead of waiting for the next 5-minute auto-refresh cycle or manual refresh. Changes: - Modified ExternalCalendarModal to return newly created calendar ID - Enhanced on_success callback to immediately fetch events for new calendar - Added proper visibility checking and error handling - Removed unused imports to clean up compilation warnings User experience improvement: - Before: Add calendar → wait 5 minutes → see events - After: Add calendar → events appear immediately 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- frontend/src/app.rs | 46 ++++++++++++++++++- .../src/components/external_calendar_modal.rs | 6 +-- frontend/src/components/sidebar.rs | 1 - 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/frontend/src/app.rs b/frontend/src/app.rs index dfbbe7b..e003453 100644 --- a/frontend/src/app.rs +++ b/frontend/src/app.rs @@ -1419,7 +1419,51 @@ pub fn App() -> Html { let external_calendar_modal_open = external_calendar_modal_open.clone(); move |_| external_calendar_modal_open.set(false) })} - on_success={refresh_external_calendars.clone()} + on_success={Callback::from({ + let external_calendars = external_calendars.clone(); + let external_calendar_events = external_calendar_events.clone(); + move |new_calendar_id: i32| { + let external_calendars = external_calendars.clone(); + let external_calendar_events = external_calendar_events.clone(); + wasm_bindgen_futures::spawn_local(async move { + // First, refresh the calendar list to get the new calendar + match CalendarService::get_external_calendars().await { + Ok(calendars) => { + external_calendars.set(calendars.clone()); + + // Then immediately fetch events for the new calendar if it's visible + if let Some(new_calendar) = calendars.iter().find(|c| c.id == new_calendar_id) { + if new_calendar.is_visible { + match CalendarService::fetch_external_calendar_events(new_calendar_id).await { + Ok(mut events) => { + // Set calendar_path for color matching + for event in &mut events { + event.calendar_path = Some(format!("external_{}", new_calendar_id)); + } + + // Add the new calendar's events to existing events + let mut all_events = (*external_calendar_events).clone(); + all_events.extend(events); + external_calendar_events.set(all_events); + } + Err(e) => { + web_sys::console::log_1( + &format!("Failed to fetch events for new calendar {}: {}", new_calendar_id, e).into(), + ); + } + } + } + } + } + Err(err) => { + web_sys::console::log_1( + &format!("Failed to refresh calendars after creation: {}", err).into(), + ); + } + } + }); + } + })} /> diff --git a/frontend/src/components/external_calendar_modal.rs b/frontend/src/components/external_calendar_modal.rs index a0dd646..9b46315 100644 --- a/frontend/src/components/external_calendar_modal.rs +++ b/frontend/src/components/external_calendar_modal.rs @@ -7,7 +7,7 @@ use crate::services::calendar_service::CalendarService; pub struct ExternalCalendarModalProps { pub is_open: bool, pub on_close: Callback<()>, - pub on_success: Callback<()>, + pub on_success: Callback, // Pass the newly created calendar ID } #[function_component(ExternalCalendarModal)] @@ -75,9 +75,9 @@ pub fn external_calendar_modal(props: &ExternalCalendarModalProps) -> Html { wasm_bindgen_futures::spawn_local(async move { match CalendarService::create_external_calendar(&name, &url, &color).await { - Ok(_) => { + Ok(new_calendar) => { is_loading.set(false); - on_success.emit(()); + on_success.emit(new_calendar.id); on_close.emit(()); } Err(e) => { diff --git a/frontend/src/components/sidebar.rs b/frontend/src/components/sidebar.rs index 854351b..d8defc5 100644 --- a/frontend/src/components/sidebar.rs +++ b/frontend/src/components/sidebar.rs @@ -1,6 +1,5 @@ use crate::components::CalendarListItem; use crate::services::calendar_service::{UserInfo, ExternalCalendar}; -use chrono::{DateTime, Local, TimeZone, Utc}; use web_sys::HtmlSelectElement; use yew::prelude::*; use yew_router::prelude::*;