diff --git a/src/app/events/page.tsx b/src/app/events/page.tsx
new file mode 100644
index 0000000..75c6720
--- /dev/null
+++ b/src/app/events/page.tsx
@@ -0,0 +1,61 @@
+'use client';
+
+import { RedirectButton } from '@/components/buttons/redirect-button';
+import EventListEntry from '@/components/custom-ui/event-list-entry';
+import { ThemePicker } from '@/components/misc/theme-picker';
+import { Label } from '@/components/ui/label';
+import { useGetApiEvent } from '@/generated/api/event/event';
+
+export default function Events() {
+ const { data: eventsData, isLoading, error } = useGetApiEvent();
+
+ if (isLoading) return
Loading...
;
+ if (error)
+ return (
+ Error loading events
+ );
+
+ const events = eventsData?.data?.events || [];
+
+ return (
+
+
+
+
+
+ {/* Heading */}
+
+ My Events
+
+
+ {/* Scrollable event list */}
+
+
+ {events.length > 0 ? (
+ events.map((event) => (
+
+ ))
+ ) : (
+
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/src/components/custom-ui/event-list-entry.tsx b/src/components/custom-ui/event-list-entry.tsx
new file mode 100644
index 0000000..61beb73
--- /dev/null
+++ b/src/components/custom-ui/event-list-entry.tsx
@@ -0,0 +1,72 @@
+import { Card } from '@/components/ui/card';
+import Logo from '@/components/misc/logo';
+import { Label } from '@/components/ui/label';
+import Link from 'next/link';
+
+type EventListEntryProps = {
+ title: string;
+ id: string;
+ start_time: string;
+ end_time: string;
+ location: string | null | undefined;
+};
+
+export default function EventListEntry({
+ title,
+ id,
+ start_time,
+ end_time,
+ location,
+}: EventListEntryProps) {
+ const formatDate = (isoString?: string) => {
+ if (!isoString) return '-';
+ return new Date(isoString).toLocaleDateString();
+ };
+ const formatTime = (isoString?: string) => {
+ if (!isoString) return '-';
+ return new Date(isoString).toLocaleTimeString([], {
+ hour: '2-digit',
+ minute: '2-digit',
+ });
+ };
+ return (
+
+
+
+
+
+
+
+
{title}
+
+
+
+
+
+
+
+
+
+
+ {location && (
+
+
+
+
+ )}
+
+
+
+
+ );
+}