diff --git a/src/app/page.tsx b/src/app/page.tsx index f78beb8..2741f56 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -5,6 +5,7 @@ import { nanoid } from 'nanoid' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' +import { Card } from '@/components/ui/card' import { addEvent, deleteEvent, getAllEvents, clearEvents, getDB } from '@/lib/db' import { parseICS, generateICS } from '@/lib/ical' @@ -28,6 +29,8 @@ export default function HomePage() { // AI const [aiPrompt, setAiPrompt] = useState('') const [aiLoading, setAiLoading] = useState(false) + const [summary, setSummary] = useState(null) + const [summaryUpdated, setSummaryUpdated] = useState(null) useEffect(() => { (async () => { @@ -62,7 +65,6 @@ export default function HomePage() { : new Date().toISOString(), lastModified: new Date().toISOString(), } - if (editingId) { const db = await getDB() if (db) { @@ -110,15 +112,9 @@ 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) - } + // Drag-and-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) @@ -132,7 +128,7 @@ export default function HomePage() { } } - // --- AI CREATE --- + // AI Create Event const handleAiCreate = async () => { if (!aiPrompt.trim()) return setAiLoading(true) @@ -156,17 +152,18 @@ export default function HomePage() { } else { alert('AI could not parse event.') } - } catch (err) { - console.error(err) - alert('AI request error') + } catch { + alert('Error creating event') } finally { setAiLoading(false) } } + // AI Summarize Events const handleAiSummarize = async () => { - if (events.length === 0) { - alert("No events to summarize") + if (!events.length) { + setSummary("No events to summarize.") + setSummaryUpdated(new Date().toLocaleString()) return } setAiLoading(true) @@ -178,30 +175,30 @@ export default function HomePage() { }) const data = await res.json() if (data.summary) { - alert(data.summary) + setSummary(data.summary) + setSummaryUpdated(new Date().toLocaleString()) } else { - alert('No summary generated.') + setSummary("No summary generated.") + setSummaryUpdated(new Date().toLocaleString()) } - } catch (err) { - console.error(err) - alert('Error summarizing events') + } catch { + setSummary("Error summarizing events") + setSummaryUpdated(new Date().toLocaleString()) } finally { setAiLoading(false) } } return ( -
-
- + setAiPrompt(e.target.value)} /> @@ -209,47 +206,49 @@ export default function HomePage() { {aiLoading ? 'Thinking...' : 'AI Create'}
-
+ {/* Summary Panel */} + {summary && ( + +
+ Summary updated {summaryUpdated} +
+
{summary}
+
+ )} + + {/* Control Toolbar */} +
{events.length > 0 && ( <> - - + + )}
- {events.length === 0 &&

No events yet.

} - + {/* Event List */} + {events.length === 0 &&

No events yet

}
    {events.map(ev => ( -
  • +
  • - {ev.title} — {ev.allDay - ? ev.start.split('T')[0] - : new Date(ev.start).toLocaleString()} - {ev.location &&
    {ev.location}
    } +
    {ev.title}
    +
    + {ev.allDay ? ev.start.split('T')[0] : new Date(ev.start).toLocaleString()} + {ev.location && @ {ev.location}} +
    + {ev.description &&
    {ev.description}
    }
+ {/* Add/Edit Dialog */} { if (!val) resetForm(); setDialogOpen(val) }}> {editingId ? 'Edit Event' : 'Add Event'} setTitle(e.target.value)} /> - +