Add event editing page with delete functionality

This commit introduces a new page for editing events at the route `dashboard/events/[slug]/edit`. It includes features for loading event details, updating event data via a form, and a confirmation dialog for deleting events. Error handling and loading states are also implemented.
This commit is contained in:
2025-03-14 03:02:46 +01:00
parent a49411d62d
commit 3e12a47e1d

View File

@@ -0,0 +1,121 @@
// src/app/dashboard/events/[slug]/edit/page.tsx
"use client";
import React, { useEffect, useState } from "react";
import { useParams, useRouter } from "next/navigation";
import { useEvents } from "@/context/event-context";
import { EventResponse } from "@/client";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { EventForm } from "@/components/events/event-form";
import { Loader2, Trash2 } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
} from "@/components/ui/alert-dialog";
export default function EditEventPage() {
const params = useParams<{ slug: string }>();
const router = useRouter();
const { getEventBySlug, updateEvent, deleteEvent, isUpdating, isDeleting } =
useEvents();
const [event, setEvent] = useState<EventResponse | null>(null);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
const fetchEvent = async () => {
try {
const eventData = await getEventBySlug(params.slug);
setEvent(eventData || null);
} catch (err) {
console.error("Failed to fetch event:", err);
setError("Failed to load event. Please try again.");
} finally {
setIsLoading(false);
}
};
if (params.slug) {
fetchEvent();
}
}, [params.slug, getEventBySlug]);
const handleDeleteEvent = async () => {
if (!event) return;
try {
await deleteEvent(event.slug);
router.push("/dashboard/events");
} catch (err) {
console.error("Failed to delete event:", err);
alert("Failed to delete event. Please try again.");
}
};
if (isLoading) {
return (
<div className="flex justify-center items-center h-64">
<Loader2 className="h-8 w-8 animate-spin" />
</div>
);
}
if (error || !event) {
return (
<div className="bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded">
{error || "Event not found"}
</div>
);
}
return (
<Card className="shadow-lg">
<CardHeader className="flex flex-row justify-between items-center">
<CardTitle className="text-2xl">Edit Event: {event.title}</CardTitle>
<AlertDialog>
<AlertDialogTrigger asChild>
<Button variant="destructive" size="sm">
<Trash2 className="h-4 w-4 mr-2" />
Delete
</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>
<AlertDialogDescription>
This will permanently delete the event "{event.title}" and all
associated data. This action cannot be undone.
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>Cancel</AlertDialogCancel>
<AlertDialogAction
onClick={handleDeleteEvent}
className="bg-red-600 hover:bg-red-700"
disabled={isDeleting}
>
{isDeleting ? "Deleting..." : "Delete Event"}
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</CardHeader>
<CardContent>
<EventForm
event={event}
mode="edit"
onSubmit={(data) => updateEvent(event.id, data)}
isSubmitting={isUpdating}
/>
</CardContent>
</Card>
);
}