"use client"; import { useEffect, useState } from "react"; import { useParams, useRouter } from "next/navigation"; import { api } from "@/lib/api"; import { useAuth } from "@/lib/auth-context"; import type { Contest } from "@/types"; export default function EditContestPage() { const { user } = useAuth(); const router = useRouter(); const params = useParams(); const contestId = Number(params.id); const [isLoading, setIsLoading] = useState(true); const [isSaving, setIsSaving] = useState(false); const [error, setError] = useState(""); const [formData, setFormData] = useState({ title: "", description: "", start_time: "", end_time: "", is_active: false, }); useEffect(() => { if (!user || user.role !== "admin") { router.push("/contests"); return; } api .getContest(contestId) .then((contest: Contest) => { setFormData({ title: contest.title, description: contest.description || "", start_time: formatDateTimeLocal(contest.start_time), end_time: formatDateTimeLocal(contest.end_time), is_active: contest.is_active, }); }) .catch((err) => setError(err.message)) .finally(() => setIsLoading(false)); }, [contestId, user, router]); const formatDateTimeLocal = (isoString: string) => { const date = new Date(isoString); return date.toISOString().slice(0, 16); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); setIsSaving(true); try { await api.updateContest(contestId, { title: formData.title, description: formData.description || undefined, start_time: new Date(formData.start_time).toISOString(), end_time: new Date(formData.end_time).toISOString(), is_active: formData.is_active, }); router.push("/admin/contests"); } catch (err) { setError(err instanceof Error ? err.message : "Ошибка сохранения"); } finally { setIsSaving(false); } }; if (!user || user.role !== "admin") { return null; } if (isLoading) { return (
); } return (

Редактировать контест

{error && (
{error}
)}
setFormData({ ...formData, title: e.target.value }) } required className="w-full px-4 py-2 border border-input rounded-lg bg-background focus:outline-none focus:ring-2 focus:ring-ring" />