diff --git a/src/app/page.tsx b/src/app/page.tsx index 671f622..72a3f99 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -7,15 +7,18 @@ import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from ' import { Input } from '@/components/ui/input' import { type CalendarEvent } from '@/lib/types' -import { addEvent, deleteEvent, getAllEvents, clearEvents } from '@/lib/db' +import { addEvent, deleteEvent, getAllEvents, clearEvents, getDB } from '@/lib/db' import { parseICS, generateICS } from '@/lib/ical' export default function HomePage() { const [events, setEvents] = useState([]) - const [open, setOpen] = useState(false) + const [dialogOpen, setDialogOpen] = useState(false) const [title, setTitle] = useState('') const [start, setStart] = useState('') + const [editingId, setEditingId] = useState(null) + const [isDragOver, setIsDragOver] = useState(false) + // Load events only in the browser useEffect(() => { (async () => { const stored = await getAllEvents() @@ -23,13 +26,29 @@ export default function HomePage() { })() }, []) - const handleAdd = async () => { - const newEvent = { id: nanoid(), title, start } - await addEvent(newEvent) - setEvents(prev => [...prev, newEvent]) + const resetForm = () => { setTitle('') setStart('') - setOpen(false) + setEditingId(null) + } + + const handleSave = async () => { + if (editingId) { + // EDIT EXISTING + const updatedEvent = { id: editingId, title, start } + const db = await getDB() + if (db) { + await db.put('events', updatedEvent) + setEvents(prev => prev.map(e => (e.id === editingId ? updatedEvent : e))) + } + } else { + // ADD NEW + const newEvent = { id: nanoid(), title, start } + await addEvent(newEvent) + setEvents(prev => [...prev, newEvent]) + } + resetForm() + setDialogOpen(false) } const handleDelete = async (id: string) => { @@ -47,7 +66,6 @@ export default function HomePage() { const text = await file.text() const parsed = parseICS(text) - // Save to DB and update state for (const ev of parsed) { await addEvent(ev) } @@ -60,7 +78,6 @@ export default function HomePage() { const icsData = generateICS(events) const blob = new Blob([icsData], { type: 'text/calendar' }) const url = URL.createObjectURL(blob) - const a = document.createElement('a') a.href = url a.download = 'events.ics' @@ -70,18 +87,44 @@ export default function HomePage() { URL.revokeObjectURL(url) } + // --- DRAG & DROP --- + const handleDragOver = (e: React.DragEvent) => { + e.preventDefault() + setIsDragOver(true) + } + + const handleDragLeave = (e: React.DragEvent) => { + e.preventDefault() + setIsDragOver(false) + } + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault() + setIsDragOver(false) + if (e.dataTransfer.files?.length) { + const file = e.dataTransfer.files[0] + if (file.name.endsWith('.ics')) { + handleImport(file) + } else { + alert('Please drop an .ics file') + } + } + } + return ( -
-
- +
+
+ {events.length > 0 && ( <> - - + + )}
+ {events.length === 0 && ( +

No events yet. Add or drop an .ics file here.

+ )} +
    {events.map(ev => ( -
  • +
  • {ev.title} — {ev.start}
    - +
    + + +
  • ))}
- + { + if (!val) resetForm() + setDialogOpen(val) + }}> - Add Event + {editingId ? 'Edit Event' : 'Add Event'} setTitle(e.target.value)} /> setStart(e.target.value)} /> - +