import React from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { ArrowRight, CalendarDays, Plus, Settings, Sparkles, Share2 } 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 { AdminLayout } from '../components/AdminLayout'; import { getEvents, TenantEvent } from '../api'; import { isAuthError } from '../auth/tokens'; import { adminPath, ADMIN_SETTINGS_PATH, ADMIN_EVENT_VIEW_PATH, ADMIN_EVENT_EDIT_PATH, ADMIN_EVENT_PHOTOS_PATH, ADMIN_EVENT_MEMBERS_PATH, ADMIN_EVENT_TASKS_PATH, } from '../constants'; export default function EventsPage() { const [rows, setRows] = React.useState([]); const [loading, setLoading] = React.useState(true); const [error, setError] = React.useState(null); const navigate = useNavigate(); React.useEffect(() => { (async () => { try { setRows(await getEvents()); } catch (err) { if (!isAuthError(err)) { setError('Laden fehlgeschlagen. Bitte spaeter erneut versuchen.'); } } finally { setLoading(false); } })(); }, []); const actions = ( <> ); return ( {error && ( Fehler beim Laden {error} )}
Uebersicht {rows.length === 0 ? 'Noch keine Events - starte jetzt und lege dein erstes Event an.' : `${rows.length} ${rows.length === 1 ? 'Event' : 'Events'} aktiv verwaltet.`}
Tenant Dashboard
{loading ? ( ) : rows.length === 0 ? ( navigate(adminPath('/events/new'))} /> ) : (
{rows.map((event) => ( ))}
)}
); } function EventCard({ event }: { event: TenantEvent }) { const slug = event.slug; const isPublished = event.status === 'published'; const photoCount = event.photo_count ?? 0; const likeCount = event.like_count ?? 0; return (

{renderName(event.name)}

Slug: {event.slug}

{formatDate(event.event_date)} Photos: {photoCount} Likes: {likeCount}
{isPublished ? 'Veroeffentlicht' : 'Entwurf'}
); } function LoadingState() { return (
{Array.from({ length: 3 }).map((_, index) => (
))}
); } function EmptyState({ onCreate }: { onCreate: () => void }) { return (

Noch kein Event angelegt

Starte jetzt mit deinem ersten Event und lade Gaeste in dein farbenfrohes Erlebnisportal ein.

); } function formatDate(iso: string | null): string { if (!iso) return 'Noch kein Datum'; const date = new Date(iso); if (Number.isNaN(date.getTime())) { return 'Unbekanntes Datum'; } return date.toLocaleDateString('de-DE', { day: '2-digit', month: 'short', year: 'numeric', }); } function renderName(name: TenantEvent['name']): string { if (typeof name === 'string') return name; if (name && typeof name === 'object') { return name.de ?? name.en ?? Object.values(name)[0] ?? 'Unbenanntes Event'; } return 'Unbenanntes Event'; }