This update introduces a button to the "Your Events" section of the dashboard, allowing users to quickly navigate to the event creation page. The enhancement improves user flow and accessibility for managing events.
116 lines
4.1 KiB
TypeScript
116 lines
4.1 KiB
TypeScript
"use client";
|
|
|
|
import Navbar from "@/components/layout/navbar";
|
|
import { useEvents } from "@/context/event-context";
|
|
import Link from "next/link";
|
|
import { Button } from "@/components/ui/button";
|
|
import {
|
|
Card,
|
|
CardContent,
|
|
CardFooter,
|
|
CardHeader,
|
|
CardTitle,
|
|
CardDescription,
|
|
} from "@/components/ui/card";
|
|
import { Badge } from "@/components/ui/badge";
|
|
import { Loader2Icon, CalendarIcon, MapPinIcon } from "lucide-react";
|
|
import { EventResponse } from "@/client";
|
|
|
|
export default function DashboardPage() {
|
|
const {
|
|
userEvents,
|
|
isLoadingUserEvents,
|
|
userEvents: eventsData,
|
|
} = useEvents();
|
|
|
|
return (
|
|
<>
|
|
<Navbar />
|
|
<div className="container mx-auto px-4 py-12">
|
|
<div className="max-w-7xl mx-auto">
|
|
<h1 className="text-3xl font-bold mb-8">Dashboard</h1>
|
|
|
|
<div className="flex items-center justify-between mb-8">
|
|
<div>
|
|
<h2 className="text-xl font-semibold">Your Events</h2>
|
|
<p className="text-gray-500 dark:text-gray-400">
|
|
Manage your scheduled events.
|
|
</p>
|
|
</div>
|
|
<Button asChild>
|
|
<Link href="/dashboard/events/new">+ Add New Event</Link>
|
|
</Button>
|
|
</div>
|
|
|
|
{isLoadingUserEvents && (
|
|
<div className="flex items-center gap-2">
|
|
<Loader2Icon className="h-6 w-6 animate-spin text-blue-500" />
|
|
<span>Loading your events...</span>
|
|
</div>
|
|
)}
|
|
|
|
{!isLoadingUserEvents &&
|
|
userEvents?.items &&
|
|
userEvents.items.length > 0 && (
|
|
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
|
|
{userEvents.items.map((event: EventResponse) => (
|
|
<Card
|
|
key={event.id}
|
|
className="hover:shadow-lg transition-shadow"
|
|
>
|
|
<CardHeader>
|
|
<CardTitle>{event.title}</CardTitle>
|
|
{event.is_public ? (
|
|
<Badge variant="default">Public</Badge>
|
|
) : (
|
|
<Badge variant="secondary">Private</Badge>
|
|
)}
|
|
</CardHeader>
|
|
<CardContent>
|
|
<CardDescription className="line-clamp-2">
|
|
{event.description || "No description provided."}
|
|
</CardDescription>
|
|
{event.location_address && (
|
|
<div className="flex items-center gap-2 mt-2 text-sm text-gray-500 dark:text-gray-400">
|
|
<MapPinIcon className="h-4 w-4" />
|
|
{event.location_address}
|
|
</div>
|
|
)}
|
|
{event.event_start_time && (
|
|
<div className="flex items-center gap-2 mt-1 text-sm text-gray-500 dark:text-gray-400">
|
|
<CalendarIcon className="h-4 w-4" />
|
|
{new Date(event.event_start_time).toLocaleString()}
|
|
</div>
|
|
)}
|
|
</CardContent>
|
|
<CardFooter>
|
|
<Button size="sm" asChild>
|
|
<Link href={`/dashboard/events/${event.slug}`}>
|
|
View Event
|
|
</Link>
|
|
</Button>
|
|
</CardFooter>
|
|
</Card>
|
|
))}
|
|
</div>
|
|
)}
|
|
|
|
{!isLoadingUserEvents &&
|
|
(!userEvents?.items || userEvents.items.length === 0) && (
|
|
<div className="bg-gray-100 dark:bg-slate-700 rounded p-8 text-center">
|
|
<p className="text-gray-500 dark:text-gray-400">
|
|
You haven't created any events yet.
|
|
</p>
|
|
<Button asChild className="mt-4">
|
|
<Link href="/dashboard/events/new">
|
|
Create Your First Event
|
|
</Link>
|
|
</Button>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|