diff --git a/package.json b/package.json index df26363..5fe09cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "my-weekly-todo-list", - "version": "1.61.1", + "version": "1.62.0", "description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view", "main": "index.js", "scripts": { diff --git a/src/app/api/calendar/events/route.ts b/src/app/api/calendar/events/route.ts index 155ce4d..3c8686f 100644 --- a/src/app/api/calendar/events/route.ts +++ b/src/app/api/calendar/events/route.ts @@ -156,8 +156,9 @@ export async function DELETE(request: NextRequest) { const { searchParams } = new URL(request.url); const calendarId = searchParams.get('calendarId'); const eventId = searchParams.get('eventId'); + const deleteMode = searchParams.get('deleteMode') || 'all'; - console.log('[API] Deleting event:', { calendarId, eventId }); + console.log('[API] Deleting event:', { calendarId, eventId, deleteMode }); if (!calendarId || !eventId) { return NextResponse.json({ error: 'Missing required fields' }, { status: 400 }); @@ -170,11 +171,14 @@ export async function DELETE(request: NextRequest) { return NextResponse.json({ error: 'Calendar connection not found' }, { status: 404 }); } - await deleteCalendarEvent(connection, calendarId, eventId); + await deleteCalendarEvent(connection, calendarId, eventId, deleteMode); // Remove from cache - await to ensure consistency try { - await deleteCachedEvent(userId, eventId, connection.provider); + if (deleteMode === 'all') { + await deleteCachedEvent(userId, eventId, connection.provider); + } + // For 'this' and 'future', force a full cache refresh } catch (e) { console.error('[CACHE] Failed to delete cached event:', e); } diff --git a/src/components/CalendarEventModal.tsx b/src/components/CalendarEventModal.tsx index 4b4217c..3a3f6d6 100644 --- a/src/components/CalendarEventModal.tsx +++ b/src/components/CalendarEventModal.tsx @@ -42,7 +42,7 @@ interface CalendarEventModalProps { connections: any[]; onClose: () => void; onSave: (eventData: any) => Promise; - onDelete?: (eventId: string, calendarId: string) => Promise; + onDelete?: (eventId: string, calendarId: string, deleteMode?: string) => Promise; } export default function CalendarEventModal({ @@ -210,11 +210,19 @@ export default function CalendarEventModal({ }; const [isDeleteConfirming, setIsDeleteConfirming] = useState(false); + const [showRecurringDeleteOptions, setShowRecurringDeleteOptions] = useState(false); - const handleDelete = async () => { + const handleDelete = async (mode?: string) => { if (!event?.id || !onDelete) return; - if (!isDeleteConfirming) { + // For recurring events, show options first + if (event.isRecurring && !mode && !showRecurringDeleteOptions) { + setShowRecurringDeleteOptions(true); + return; + } + + // For non-recurring events, use confirm flow + if (!event.isRecurring && !isDeleteConfirming) { setIsDeleteConfirming(true); setTimeout(() => setIsDeleteConfirming(false), 3000); return; @@ -222,12 +230,13 @@ export default function CalendarEventModal({ setIsDeleting(true); try { - await onDelete(event.id, event.calendarId); + await onDelete(event.id, event.calendarId, mode || 'all'); onClose(); } catch (err: any) { setError(err.message || 'Failed to delete event'); setIsDeleting(false); setIsDeleteConfirming(false); + setShowRecurringDeleteOptions(false); } }; @@ -765,10 +774,10 @@ export default function CalendarEventModal({ {/* Actions */}
-
- {event && onDelete && ( +
+ {event && onDelete && !showRecurringDeleteOptions && ( )} + {event && onDelete && showRecurringDeleteOptions && ( +
+ Delete: + {[ + { mode: 'this', label: 'This event' }, + { mode: 'future', label: 'This & future' }, + { mode: 'all', label: 'All events' }, + ].map(({ mode, label }) => ( + + ))} + +
+ )} {!event && (