import React from 'react'; import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { ArrowLeft, Loader2, PlusCircle, Sparkles } from 'lucide-react'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Checkbox } from '@/components/ui/checkbox'; import { AdminLayout } from '../components/AdminLayout'; import { assignTasksToEvent, getEvent, getEventTasks, getTasks, TenantEvent, TenantTask, } from '../api'; import { isAuthError } from '../auth/tokens'; import { ADMIN_EVENTS_PATH } from '../constants'; export default function EventTasksPage() { const params = useParams<{ slug?: string }>(); const [searchParams] = useSearchParams(); const slug = params.slug ?? searchParams.get('slug') ?? null; const navigate = useNavigate(); const [event, setEvent] = React.useState(null); const [assignedTasks, setAssignedTasks] = React.useState([]); const [availableTasks, setAvailableTasks] = React.useState([]); const [selected, setSelected] = React.useState([]); const [loading, setLoading] = React.useState(true); const [saving, setSaving] = React.useState(false); const [error, setError] = React.useState(null); React.useEffect(() => { if (!slug) { setError('Kein Event-Slug angegeben.'); setLoading(false); return; } let cancelled = false; (async () => { try { setLoading(true); const eventData = await getEvent(slug); const [eventTasksResponse, libraryTasks] = await Promise.all([ getEventTasks(eventData.id, 1), getTasks({ per_page: 50 }), ]); if (cancelled) return; setEvent(eventData); const assignedIds = new Set(eventTasksResponse.data.map((task) => task.id)); setAssignedTasks(eventTasksResponse.data); setAvailableTasks(libraryTasks.data.filter((task) => !assignedIds.has(task.id))); setError(null); } catch (err) { if (!isAuthError(err)) { setError('Event-Tasks konnten nicht geladen werden.'); } } finally { if (!cancelled) { setLoading(false); } } })(); return () => { cancelled = true; }; }, [slug]); async function handleAssign() { if (!event || selected.length === 0) return; setSaving(true); try { await assignTasksToEvent(event.id, selected); const refreshed = await getEventTasks(event.id, 1); const assignedIds = new Set(refreshed.data.map((task) => task.id)); setAssignedTasks(refreshed.data); setAvailableTasks((prev) => prev.filter((task) => !assignedIds.has(task.id))); setSelected([]); } catch (err) { if (!isAuthError(err)) { setError('Tasks konnten nicht zugewiesen werden.'); } } finally { setSaving(false); } } const actions = ( ); return ( {error && ( Hinweis {error} )} {loading ? ( ) : !event ? ( Event nicht gefunden Bitte kehre zur Eventliste zurueck. ) : ( <> {renderName(event.name)} Status: {event.status === 'published' ? 'Veroeffentlicht' : 'Entwurf'}

Zugeordnete Tasks

{assignedTasks.length === 0 ? ( ) : (
{assignedTasks.map((task) => (

{task.title}

{mapPriority(task.priority)}
{task.description &&

{task.description}

}
))}
)}

Tasks aus Bibliothek hinzufuegen

{availableTasks.length === 0 ? ( ) : ( availableTasks.map((task) => ( )) )}
)}
); } function EmptyState({ message }: { message: string }) { return (

{message}

); } function TaskSkeleton() { return (
{Array.from({ length: 2 }).map((_, index) => (
))}
); } function mapPriority(priority: TenantTask['priority']): string { switch (priority) { case 'low': return 'Niedrig'; case 'high': return 'Hoch'; case 'urgent': return 'Dringend'; default: return 'Mittel'; } } function renderName(name: TenantEvent['name']): string { if (typeof name === 'string') { return name; } return name?.de ?? name?.en ?? Object.values(name ?? {})[0] ?? 'Unbenanntes Event'; }