From c7843f8d695d54b5a1bfc261edb561ceaf711b2f Mon Sep 17 00:00:00 2001 From: Camille Moussu <66134347+Eriikah@users.noreply.github.com> Date: Tue, 17 Feb 2026 09:47:57 +0100 Subject: [PATCH] [#465] changed render to show delete option when event is Own (#543) Co-authored-by: Camille Moussu --- .../Calendars/services/refreshCalendar.test.tsx | 6 +++--- src/features/Calendars/CalendarSlice.ts | 11 ++++++----- .../Calendars/utils/processSyncTokenUpdates.ts | 11 ++--------- src/features/Events/EventDisplayPreview.tsx | 2 +- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/__test__/features/Calendars/services/refreshCalendar.test.tsx b/__test__/features/Calendars/services/refreshCalendar.test.tsx index 9ea8d60..5bcfe32 100644 --- a/__test__/features/Calendars/services/refreshCalendar.test.tsx +++ b/__test__/features/Calendars/services/refreshCalendar.test.tsx @@ -110,7 +110,7 @@ describe("refreshCalendarWithSyncToken", () => { expect(result.type).toBe("calendars/refreshWithSyncToken/fulfilled"); expect(result.payload).toMatchObject({ calId: mockCalendar.id, - deletedEvents: ["deleted-event"], + deletedEvents: ["/calendars/user1/cal1/deleted-event.ics"], createdOrUpdatedEvents: [], syncToken: "new-sync-token-456", }); @@ -236,8 +236,8 @@ describe("refreshCalendarWithSyncToken", () => { if (result.type === "calendars/refreshWithSyncToken/fulfilled") { const payload = result.payload as SyncTokenUpdates; expect(payload?.deletedEvents).toEqual([ - "deleted-event", - "updated-event", + "/calendars/user1/cal1/deleted-event.ics", + "/calendars/user1/cal1/updated-event.ics", ]); expect(payload?.createdOrUpdatedEvents).toHaveLength(1); expect(payload?.createdOrUpdatedEvents[0].uid).toBe("updated-event"); diff --git a/src/features/Calendars/CalendarSlice.ts b/src/features/Calendars/CalendarSlice.ts index bb75005..1b9d2ff 100644 --- a/src/features/Calendars/CalendarSlice.ts +++ b/src/features/Calendars/CalendarSlice.ts @@ -334,12 +334,13 @@ const CalendarSlice = createSlice({ if (syncStatus === "SUCCESS") { const deletedSet = new Set(deletedEvents); // working with a Set for deletion avoids O(nxm) complexity - Object.keys(target.events) - .filter((eventKey) => { - const baseUid = extractEventBaseUuid(eventKey); - return deletedSet.has(eventKey) || deletedSet.has(baseUid); + Object.values(target.events) + .filter((event) => { + return deletedSet.has(event.URL); }) - .forEach((eventKey) => delete target.events[eventKey]); + .forEach((event) => { + delete target.events[event.uid]; + }); for (const event of createdOrUpdatedEvents) { target.events[event.uid] = event; diff --git a/src/features/Calendars/utils/processSyncTokenUpdates.ts b/src/features/Calendars/utils/processSyncTokenUpdates.ts index c249cf3..a00746f 100644 --- a/src/features/Calendars/utils/processSyncTokenUpdates.ts +++ b/src/features/Calendars/utils/processSyncTokenUpdates.ts @@ -14,13 +14,11 @@ export function processSyncUpdates( for (const update of updates) { const href = update?._links?.self?.href; if (!href) continue; - const fileName = extractFileNameFromHref(href); - if (update.status === 404) { - toDelete.push(fileName); + toDelete.push(href); } else if (update.status === 200) { toExpand.push(href); - toDelete.push(fileName); // we delete the old version of the event to replace it by the new when it's updated + toDelete.push(href); // we delete the old version of the event to replace it by the new when it's updated } else if (update.status === 410) { throw new Error("SYNC_TOKEN_INVALID"); } @@ -28,8 +26,3 @@ export function processSyncUpdates( return { toDelete, toExpand }; } - -function extractFileNameFromHref(href: string): string { - const fileNameMatch = href.match(/\/([^/]+)\.ics$/); // CalDAV href are like /calendars/userID/CalendarID/EventId.ics - return fileNameMatch ? fileNameMatch[1] : href; -} diff --git a/src/features/Events/EventDisplayPreview.tsx b/src/features/Events/EventDisplayPreview.tsx index 9b7d3ae..552283a 100644 --- a/src/features/Events/EventDisplayPreview.tsx +++ b/src/features/Events/EventDisplayPreview.tsx @@ -380,7 +380,7 @@ export default function EventPreviewModal({ setOpenDuplicateModal(true); }} /> - {isOrganizer && ( + {isOwn && ( { if (isRecurring) {