fix: events disappearing after iCal import/subscription refresh
This commit is contained in:
+16
-18
@@ -463,10 +463,6 @@ export const useCalendarStore = create<CalendarStore>()(
|
|||||||
const batch = prepared.slice(i, i + BATCH_SIZE);
|
const batch = prepared.slice(i, i + BATCH_SIZE);
|
||||||
try {
|
try {
|
||||||
const { created, failed } = await client.batchCreateCalendarEvents(batch, targetAccountId);
|
const { created, failed } = await client.batchCreateCalendarEvents(batch, targetAccountId);
|
||||||
const mapped = created.map(e => mapServerEventToStoreEvent(e, get().calendars, targetAccountId));
|
|
||||||
if (mapped.length > 0) {
|
|
||||||
set((state) => ({ events: [...state.events, ...mapped] }));
|
|
||||||
}
|
|
||||||
imported += created.length;
|
imported += created.length;
|
||||||
if (failed.length > 0) {
|
if (failed.length > 0) {
|
||||||
debug.warn(`Import batch ${i / BATCH_SIZE + 1}: ${failed.length} events failed`);
|
debug.warn(`Import batch ${i / BATCH_SIZE + 1}: ${failed.length} events failed`);
|
||||||
@@ -475,6 +471,14 @@ export const useCalendarStore = create<CalendarStore>()(
|
|||||||
debug.error(`Import batch ${i / BATCH_SIZE + 1} failed:`, error);
|
debug.error(`Import batch ${i / BATCH_SIZE + 1} failed:`, error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Re-fetch all events properly so the store state is consistent
|
||||||
|
// (with recurrence expansion, multi-account mapping, etc.)
|
||||||
|
const { dateRange } = get();
|
||||||
|
if (dateRange) {
|
||||||
|
await get().fetchEvents(client, dateRange.start, dateRange.end);
|
||||||
|
}
|
||||||
|
|
||||||
return imported;
|
return imported;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -774,24 +778,18 @@ export const useCalendarStore = create<CalendarStore>()(
|
|||||||
// Import only events that don't already exist on server
|
// Import only events that don't already exist on server
|
||||||
const eventsToImport = parsedEvents.filter(e => !e.uid || !existingByUid.has(e.uid));
|
const eventsToImport = parsedEvents.filter(e => !e.uid || !existingByUid.has(e.uid));
|
||||||
|
|
||||||
// Remove stale local events for this calendar
|
// Import new events (importEvents will re-fetch all events at the end)
|
||||||
set((state) => ({
|
|
||||||
events: state.events.filter(e => !e.calendarIds?.[sub.calendarId]),
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Import new events
|
|
||||||
if (eventsToImport.length > 0) {
|
if (eventsToImport.length > 0) {
|
||||||
await get().importEvents(client, eventsToImport, sub.calendarId);
|
await get().importEvents(client, eventsToImport, sub.calendarId);
|
||||||
|
} else {
|
||||||
|
// No new events to import, but stale ones may have been deleted
|
||||||
|
// Re-fetch to reflect deletions
|
||||||
|
const { dateRange } = get();
|
||||||
|
if (dateRange) {
|
||||||
|
await get().fetchEvents(client, dateRange.start, dateRange.end);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Re-fetch ALL events from server and filter for this calendar
|
|
||||||
const allUpdatedEvents = await client.getCalendarEvents();
|
|
||||||
const updatedEvents = allUpdatedEvents.filter(e => e.calendarIds?.[sub.calendarId]);
|
|
||||||
set((state) => {
|
|
||||||
const otherEvents = state.events.filter(e => !e.calendarIds?.[sub.calendarId]);
|
|
||||||
return { events: [...otherEvents, ...updatedEvents] };
|
|
||||||
});
|
|
||||||
|
|
||||||
// Update last refreshed timestamp
|
// Update last refreshed timestamp
|
||||||
set((state) => ({
|
set((state) => ({
|
||||||
icalSubscriptions: state.icalSubscriptions.map(s =>
|
icalSubscriptions: state.icalSubscriptions.map(s =>
|
||||||
|
|||||||
Reference in New Issue
Block a user