Add immediate refresh when new external calendars are created
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 <noreply@anthropic.com>
This commit is contained in:
@@ -1419,7 +1419,51 @@ pub fn App() -> Html {
|
|||||||
let external_calendar_modal_open = external_calendar_modal_open.clone();
|
let external_calendar_modal_open = external_calendar_modal_open.clone();
|
||||||
move |_| external_calendar_modal_open.set(false)
|
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(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use crate::services::calendar_service::CalendarService;
|
|||||||
pub struct ExternalCalendarModalProps {
|
pub struct ExternalCalendarModalProps {
|
||||||
pub is_open: bool,
|
pub is_open: bool,
|
||||||
pub on_close: Callback<()>,
|
pub on_close: Callback<()>,
|
||||||
pub on_success: Callback<()>,
|
pub on_success: Callback<i32>, // Pass the newly created calendar ID
|
||||||
}
|
}
|
||||||
|
|
||||||
#[function_component(ExternalCalendarModal)]
|
#[function_component(ExternalCalendarModal)]
|
||||||
@@ -75,9 +75,9 @@ pub fn external_calendar_modal(props: &ExternalCalendarModalProps) -> Html {
|
|||||||
|
|
||||||
wasm_bindgen_futures::spawn_local(async move {
|
wasm_bindgen_futures::spawn_local(async move {
|
||||||
match CalendarService::create_external_calendar(&name, &url, &color).await {
|
match CalendarService::create_external_calendar(&name, &url, &color).await {
|
||||||
Ok(_) => {
|
Ok(new_calendar) => {
|
||||||
is_loading.set(false);
|
is_loading.set(false);
|
||||||
on_success.emit(());
|
on_success.emit(new_calendar.id);
|
||||||
on_close.emit(());
|
on_close.emit(());
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use crate::components::CalendarListItem;
|
use crate::components::CalendarListItem;
|
||||||
use crate::services::calendar_service::{UserInfo, ExternalCalendar};
|
use crate::services::calendar_service::{UserInfo, ExternalCalendar};
|
||||||
use chrono::{DateTime, Local, TimeZone, Utc};
|
|
||||||
use web_sys::HtmlSelectElement;
|
use web_sys::HtmlSelectElement;
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
use yew_router::prelude::*;
|
use yew_router::prelude::*;
|
||||||
|
|||||||
Reference in New Issue
Block a user