diff --git a/app/api/calendar/route.ts b/app/api/calendar/route.ts index 4f30916..01ac34d 100644 --- a/app/api/calendar/route.ts +++ b/app/api/calendar/route.ts @@ -145,3 +145,31 @@ export async function POST(req: Request) { return NextResponse.json({ error: err.message || 'Failed to create event' }, { status: 500 }) } } + +export async function DELETE(req: Request) { + const { searchParams } = new URL(req.url) + const eventId = searchParams.get('eventId') + const calendarId = searchParams.get('calendarId') + + if (!eventId) { + return NextResponse.json({ error: 'eventId is required' }, { status: 400 }) + } + + const auth = getAuth(false) + if (!auth) { + return NextResponse.json({ error: 'not_configured' }, { status: 500 }) + } + + const targetCalendarId = calendarId || process.env.DANIIL_CALENDAR_ID || 'daniilklimov25@gmail.com' + const calendarClient = google.calendar({ version: 'v3', auth: auth as any }) + + try { + await calendarClient.events.delete({ + calendarId: targetCalendarId, + eventId, + }) + return NextResponse.json({ success: true }) + } catch (err: any) { + return NextResponse.json({ error: err.message || 'Failed to delete event' }, { status: 500 }) + } +} diff --git a/components/CalendarTab.tsx b/components/CalendarTab.tsx index 92cca14..b5b3123 100644 --- a/components/CalendarTab.tsx +++ b/components/CalendarTab.tsx @@ -1,6 +1,6 @@ 'use client' import { useState, useEffect } from 'react' -import { ChevronLeft, ChevronRight, Plus, X, Clock, MapPin } from 'lucide-react' +import { ChevronLeft, ChevronRight, Plus, X, Clock, MapPin, Trash2 } from 'lucide-react' interface CalendarEvent { id: string @@ -102,6 +102,8 @@ export default function CalendarTab() { const [loading, setLoading] = useState(true) const [selectedEvent, setSelectedEvent] = useState(null) const [showAddModal, setShowAddModal] = useState(false) + const [deleting, setDeleting] = useState(false) + const [confirmDelete, setConfirmDelete] = useState(false) const [addDate, setAddDate] = useState('') useEffect(() => { @@ -112,6 +114,23 @@ export default function CalendarTab() { .catch(() => setLoading(false)) }, [year, month]) + + const deleteEvent = async (event: CalendarEvent) => { + setDeleting(true) + try { + const r = await fetch(`/api/calendar?eventId=${event.id}`, { method: 'DELETE' }) + const d = await r.json() + if (d.error) throw new Error(d.error) + setEvents(prev => prev.filter(e => e.id !== event.id)) + setSelectedEvent(null) + setConfirmDelete(false) + } catch (e: any) { + alert(e.message || 'Ошибка удаления') + } finally { + setDeleting(false) + } + } + // Upcoming events (next 30 days) const upcoming = events .filter(e => new Date(e.start) >= new Date()) @@ -273,7 +292,7 @@ export default function CalendarTab() { {/* Event detail modal */} {selectedEvent && ( -
setSelectedEvent(null)}> +
{ setSelectedEvent(null); setConfirmDelete(false) }}>
e.stopPropagation()}>
@@ -299,6 +318,34 @@ export default function CalendarTab() { {selectedEvent.description && (
{selectedEvent.description}
)} + {/* Delete button */} +
+ {!confirmDelete ? ( + + ) : ( +
+ + +
+ )} +