diff --git a/components/email/calendar-invitation-banner.tsx b/components/email/calendar-invitation-banner.tsx index 5e35705d..735f7375 100644 --- a/components/email/calendar-invitation-banner.tsx +++ b/components/email/calendar-invitation-banner.tsx @@ -1,6 +1,7 @@ 'use client'; -import { useState, useEffect, useCallback } from 'react'; +import { useState, useEffect, useCallback, useRef } from 'react'; +import { createPortal } from 'react-dom'; import { ArrowRight, Calendar, @@ -371,6 +372,8 @@ export function CalendarInvitationBanner({ email }: CalendarInvitationBannerProp const [actionError, setActionError] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const [showCalendarPicker, setShowCalendarPicker] = useState(false); + const [pickerPosition, setPickerPosition] = useState<{ top: number; left: number } | null>(null); + const pickerTriggerRef = useRef(null); const [selectedCalendarId, setSelectedCalendarId] = useState(''); const [rawIcsMethod, setRawIcsMethod] = useState('unknown'); const [isCollapsed, setIsCollapsed] = useState(true); @@ -437,6 +440,17 @@ export function CalendarInvitationBanner({ email }: CalendarInvitationBannerProp } }, [calendars, selectedCalendarId]); + useEffect(() => { + if (!showCalendarPicker) return; + const close = () => setShowCalendarPicker(false); + window.addEventListener('scroll', close, true); + window.addEventListener('resize', close); + return () => { + window.removeEventListener('scroll', close, true); + window.removeEventListener('resize', close); + }; + }, [showCalendarPicker]); + if (!attachment || !calendarInvitationParsingEnabled) return null; const detectedMethod = parsedEvent ? getInvitationMethod(parsedEvent, { email, attachment }) : 'unknown'; @@ -966,14 +980,23 @@ export function CalendarInvitationBanner({ email }: CalendarInvitationBannerProp )} {supportsCalendar && !existingEvent && allowsImport && !isResponseOnly && !isCancellation && ( -
+ <> - {showCalendarPicker && calendars.length > 1 && ( -
+ {showCalendarPicker && calendars.length > 1 && pickerPosition && typeof document !== 'undefined' && createPortal( +
{t('select_calendar')}
@@ -1004,9 +1030,10 @@ export function CalendarInvitationBanner({ email }: CalendarInvitationBannerProp {cal.name} ))} -
+
, + document.body, )} -
+ )} {canApplyProposal && (