From 9a836fc8661a6da9f1487cf18a9d02ea93462c5d Mon Sep 17 00:00:00 2001 From: Dmytro Stanchiev Date: Wed, 20 Aug 2025 13:14:29 -0400 Subject: [PATCH] refactor ai event creation into a promise toast --- src/app/page.tsx | 130 ++++++++++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 52 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 5dc021c..6dfc60c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -138,62 +138,88 @@ export default function HomePage() { const handleAiCreate = async () => { if (!aiPrompt.trim()) return setAiLoading(true) - try { - const res = await fetch('/api/ai-event', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ prompt: aiPrompt }) - }) - if (res.status === 401) { - toast.info('Please sign in to use AI features.') - setAiLoading(false) - return - } + const promise = (): Promise<{ message: string }> => new Promise(async (resolve, reject) => { + try { + const res = await fetch('/api/ai-event', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ prompt: aiPrompt }) + }) - const data = await res.json() - - if (Array.isArray(data) && data.length > 0) { - if (data.length === 1) { - // Prefill dialog directly (same as before) - const ev = data[0] - setTitle(ev.title || '') - setDescription(ev.description || '') - setLocation(ev.location || '') - setUrl(ev.url || '') - setStart(ev.start || '') - setEnd(ev.end || '') - setAllDay(ev.allDay || false) - setEditingId(null) - setAiPrompt("") - setDialogOpen(true) - setRecurrenceRule(ev.recurrenceRule || undefined) - } else { - // Save them all directly to DB - for (const ev of data) { - const newEvent = { - id: nanoid(), - ...ev, - createdAt: new Date().toISOString(), - lastModified: new Date().toISOString(), - } - await addEvent(newEvent) - } - const stored = await getAllEvents() - setEvents(stored) - setAiPrompt("") - setSummary(`Added ${data.length} AI-generated events.`) - setSummaryUpdated(new Date().toLocaleString()) + if (res.status === 401) { + setAiLoading(false) + reject({ + message: 'Please sign in to use AI features.' + }) + return } - } else { - toast.error('AI did not return event data.') + + const data = await res.json() + + if (Array.isArray(data) && data.length > 0) { + if (data.length === 1) { + // Prefill dialog directly (same as before) + const ev = data[0] + setTitle(ev.title || '') + setDescription(ev.description || '') + setLocation(ev.location || '') + setUrl(ev.url || '') + setStart(ev.start || '') + setEnd(ev.end || '') + setAllDay(ev.allDay || false) + setEditingId(null) + setAiPrompt("") + setDialogOpen(true) + setRecurrenceRule(ev.recurrenceRule || undefined) + resolve({ + message: 'Event has been created!' + }) + + } else { + // Save them all directly to DB + for (const ev of data) { + const newEvent = { + id: nanoid(), + ...ev, + createdAt: new Date().toISOString(), + lastModified: new Date().toISOString(), + } + await addEvent(newEvent) + } + const stored = await getAllEvents() + setEvents(stored) + setAiPrompt("") + setSummary(`Added ${data.length} AI-generated events.`) + setSummaryUpdated(new Date().toLocaleString()) + resolve({ + message: 'Event has been created!' + }) + } + } else { + reject({ + message: 'AI did not return event data.' + }) + } + } catch (err) { + console.error(err) + reject({ + message: 'Error from AI service.' + }) } - } catch (err) { - console.error(err) - toast.error('Error from AI service.') - } finally { - setAiLoading(false) - } + }) + + toast.promise(promise, { + loading: "Generating event...", + success: ({ message }) => { + return message + }, + error: ({ message }) => { + return message + } + }) + + setAiLoading(false) } // AI Summarize Events