From 56fb0e034863bfb26cf65883125d62a9a334c6e9 Mon Sep 17 00:00:00 2001 From: sanjanamanivannan Date: Fri, 6 Mar 2026 15:13:05 -0800 Subject: [PATCH] BSL-40: add admin events UI with table, create form, and error handling --- app/admin/events/page.tsx | 167 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 app/admin/events/page.tsx diff --git a/app/admin/events/page.tsx b/app/admin/events/page.tsx new file mode 100644 index 0000000..96058cc --- /dev/null +++ b/app/admin/events/page.tsx @@ -0,0 +1,167 @@ +"use client"; + +import { useEffect, useState } from "react"; +import AdminLayout from "@/components/admin/AdminLayout"; + +type Event = { + id: string; + title: string; + description?: string | null; + startAt: string; + endAt?: string | null; + location?: string | null; + link?: string | null; +}; + +export default function AdminEventsPage() { + const [events, setEvents] = useState([]); + const [loading, setLoading] = useState(true); + + const [title, setTitle] = useState(""); + const [startAt, setStartAt] = useState(""); + const [location, setLocation] = useState(""); + + const [message, setMessage] = useState(""); + + async function loadEvents() { + setLoading(true); + setMessage(""); + + try { + const res = await fetch("/api/admin/events"); + const data = await res.json(); + + if (!res.ok) { + setEvents([]); + setMessage(data?.error || "Failed to load events"); + return; + } + + // Ensure events is always an array + setEvents(Array.isArray(data) ? data : []); + } catch { + setEvents([]); + setMessage("Failed to load events"); + } finally { + setLoading(false); + } + } + + useEffect(() => { + loadEvents(); + }, []); + + async function createEvent(e: React.FormEvent) { + e.preventDefault(); + setMessage(""); + + try { + const res = await fetch("/api/admin/events", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ title, startAt, location }), + }); + + const data = await res.json(); + + if (!res.ok) { + setMessage(data?.error || "Failed to create event"); + return; + } + + setMessage("Event created successfully"); + + setTitle(""); + setStartAt(""); + setLocation(""); + + loadEvents(); + } catch { + setMessage("Failed to create event"); + } + } + + return ( + +

Admin Events

+ + {/* Create Event Form */} +
+
+ + setTitle(e.target.value)} + required + /> +
+ +
+ + setStartAt(e.target.value)} + required + /> +
+ +
+ + setLocation(e.target.value)} + /> +
+ + + + {message && ( +

+ {message} +

+ )} +
+ + {/* Events Table */} +
+

Events

+ + {loading ? ( +

Loading...

+ ) : events.length === 0 ? ( +

No events yet.

+ ) : ( + + + + + + + + + + + {events.map((event) => ( + + + + + + ))} + +
TitleStartLocation
{event.title} + {new Date(event.startAt).toLocaleString()} + {event.location || "-"}
+ )} +
+
+ ); +} \ No newline at end of file