From 2e3686f69058377e2c0d9d6ece61bc81b4426ebc Mon Sep 17 00:00:00 2001 From: Camille Moussu <66134347+Eriikah@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:30:22 +0100 Subject: [PATCH] #566 Delegation select higher calendar in list (#568) Co-authored-by: Camille Moussu --- src/features/Events/EventModal.tsx | 41 +++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/features/Events/EventModal.tsx b/src/features/Events/EventModal.tsx index 8b8c46c..ddac1a1 100644 --- a/src/features/Events/EventModal.tsx +++ b/src/features/Events/EventModal.tsx @@ -16,6 +16,7 @@ import { saveEventFormDataToTemp, showErrorNotification, } from "@/utils/eventFormTempStorage"; +import { useSelectedCalendars } from "@/utils/storage/useSelectedCalendars"; import { browserDefaultTimeZone, getTimezoneOffset, @@ -61,6 +62,7 @@ function EventPopover({ }) { const dispatch = useAppDispatch(); const { t } = useI18n(); + const selectedCalendarIds = useSelectedCalendars(); const userOrganizer = useAppSelector((state) => state.user.organiserData); const userId = @@ -98,10 +100,25 @@ function EventPopover({ const [location, setLocation] = useState(event?.location ?? ""); const [start, setStart] = useState(event?.start ? event.start : ""); const [end, setEnd] = useState(event?.end ? event.end : ""); - const defaultCalendarId = useMemo( - () => userPersonalCalendars[0]?.id ?? "", - [userPersonalCalendars] - ); + const defaultCalendarId = useMemo(() => { + const selectedAndWritable = Object.values(calList ?? {}) + .filter((cal) => selectedCalendarIds.includes(cal.id)) + .filter( + (cal) => + (cal.delegated && cal.access?.write) || + userId === cal.id?.split("/")[0] + ); + + if (selectedAndWritable.length > 0) { + return selectedAndWritable[0].id!; + } + + const firstPersonal = Object.values(calList ?? {}).find( + (cal) => + cal.id?.split("/")[0] === userId || (cal.delegated && cal.access?.write) + ); + return firstPersonal?.id ?? ""; + }, [selectedCalendarIds, calList, userId]); const [calendarid, setCalendarid] = useState( event?.calId ?? defaultCalendarId @@ -146,17 +163,20 @@ function EventPopover({ const userPersonalCalendarsRef = useRef(userPersonalCalendars); // Track when restoring from error to prevent other useEffects from overriding restored data const isRestoringFromErrorRef = useRef(false); + // Track whether the user has explicitly picked a calendar so we don't override their choice + const isCalendarIdUserSelectedRef = useRef(false); // Update ref when userPersonalCalendars changes useEffect(() => { userPersonalCalendarsRef.current = userPersonalCalendars; }, [userPersonalCalendars]); + // Sync calendarid whenever defaultCalendarId resolves, unless the user already picked one useEffect(() => { - if (!calendarid && defaultCalendarId) { + if (!isCalendarIdUserSelectedRef.current && defaultCalendarId) { setCalendarid(defaultCalendarId); } - }, [calendarid, defaultCalendarId]); + }, [defaultCalendarId]); const resetAllStateToDefault = useCallback(() => { setShowMore(false); @@ -606,6 +626,12 @@ function EventPopover({ [] ); + // Wrap setCalendarid so we can track explicit user selections + const handleCalendaridChange = useCallback((id: string) => { + isCalendarIdUserSelectedRef.current = true; + setCalendarid(id); + }, []); + const handleClose = () => { // Clear temp data when user manually closes modal clearEventFormTempData("create"); @@ -615,6 +641,7 @@ function EventPopover({ setStart(""); setEnd(""); shouldSyncFromRangeRef.current = true; // Reset for next time + isCalendarIdUserSelectedRef.current = false; // Reset so next open gets fresh default }; // Function to save current form data to temp storage @@ -926,7 +953,7 @@ function EventPopover({ timezone={timezone} setTimezone={setTimezone} calendarid={calendarid} - setCalendarid={setCalendarid} + setCalendarid={handleCalendaridChange} hasVideoConference={hasVideoConference} setHasVideoConference={setHasVideoConference} meetingLink={meetingLink}