import { useState } from 'react' import { useNavigate, Link } from 'react-router-dom' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' import { marathonsApi } from '@/api' import { NeonButton, Input, GlassCard } from '@/components/ui' import { Globe, Lock, Users, UserCog, ArrowLeft, Gamepad2, AlertCircle, Sparkles, Calendar, Clock } from 'lucide-react' import type { GameProposalMode } from '@/types' const createSchema = z.object({ title: z.string().min(1, 'Название обязательно').max(100), description: z.string().optional(), start_date: z.string().min(1, 'Дата начала обязательна'), duration_days: z.number().min(1).max(365).default(30), is_public: z.boolean().default(false), game_proposal_mode: z.enum(['all_participants', 'organizer_only']).default('all_participants'), }) type CreateForm = z.infer export function CreateMarathonPage() { const navigate = useNavigate() const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const { register, handleSubmit, watch, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(createSchema), defaultValues: { duration_days: 30, is_public: false, game_proposal_mode: 'all_participants', }, }) const isPublic = watch('is_public') const gameProposalMode = watch('game_proposal_mode') const onSubmit = async (data: CreateForm) => { setIsLoading(true) setError(null) try { const marathon = await marathonsApi.create({ title: data.title, description: data.description, start_date: new Date(data.start_date).toISOString(), duration_days: data.duration_days, is_public: data.is_public, game_proposal_mode: data.game_proposal_mode as GameProposalMode, }) navigate(`/marathons/${marathon.id}/lobby`) } catch (err: unknown) { const apiError = err as { response?: { data?: { detail?: string } } } setError(apiError.response?.data?.detail || 'Не удалось создать марафон') } finally { setIsLoading(false) } } return (
{/* Back button */} К списку марафонов {/* Header */}

Создать марафон

Настройте свой игровой марафон

{error && (
{error}
)} {/* Basic info */}