import React from 'react'; import { useNavigate, NavLink, useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { CalendarDays, ChevronDown, PlusCircle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger, } from '@/components/ui/sheet'; import { useEventContext } from '../context/EventContext'; import { ADMIN_EVENT_CREATE_PATH, ADMIN_EVENT_INVITES_PATH, ADMIN_EVENT_MEMBERS_PATH, ADMIN_EVENT_PHOTOS_PATH, ADMIN_EVENT_TASKS_PATH, ADMIN_EVENT_TOOLKIT_PATH, ADMIN_EVENT_VIEW_PATH, } from '../constants'; import type { TenantEvent } from '../api'; import { cn } from '@/lib/utils'; function resolveEventName(event: TenantEvent): string { const name = event.name; if (typeof name === 'string' && name.trim().length > 0) { return name; } if (name && typeof name === 'object') { const first = Object.values(name).find((value) => typeof value === 'string' && value.trim().length > 0); if (first) { return first; } } return event.slug ?? 'Event'; } function formatEventDate(value?: string | null, locale = 'de-DE'): string | null { if (!value) { return null; } const date = new Date(value); if (Number.isNaN(date.getTime())) { return null; } try { return new Intl.DateTimeFormat(locale, { day: '2-digit', month: 'short', year: 'numeric' }).format(date); } catch { return date.toISOString().slice(0, 10); } } function buildEventLinks(slug: string, t: ReturnType['t']) { return [ { key: 'summary', label: t('eventMenu.summary', 'Übersicht'), href: ADMIN_EVENT_VIEW_PATH(slug) }, { key: 'photos', label: t('eventMenu.photos', 'Uploads'), href: ADMIN_EVENT_PHOTOS_PATH(slug) }, { key: 'guests', label: t('eventMenu.guests', 'Team & Gäste'), href: ADMIN_EVENT_MEMBERS_PATH(slug) }, { key: 'tasks', label: t('eventMenu.tasks', 'Aufgaben'), href: ADMIN_EVENT_TASKS_PATH(slug) }, { key: 'invites', label: t('eventMenu.invites', 'Einladungen'), href: ADMIN_EVENT_INVITES_PATH(slug) }, { key: 'toolkit', label: t('eventMenu.toolkit', 'Toolkit'), href: ADMIN_EVENT_TOOLKIT_PATH(slug) }, ]; } export function EventSwitcher() { const { events, activeEvent, selectEvent } = useEventContext(); const { t, i18n } = useTranslation('common'); const navigate = useNavigate(); const [open, setOpen] = React.useState(false); const locale = i18n.language?.startsWith('en') ? 'en-GB' : 'de-DE'; const buttonLabel = activeEvent ? resolveEventName(activeEvent) : t('eventSwitcher.placeholder', 'Event auswählen'); const buttonHint = activeEvent?.event_date ? formatEventDate(activeEvent.event_date, locale) : events.length > 1 ? t('eventSwitcher.multiple', 'Mehrere Events') : t('eventSwitcher.empty', 'Noch kein Event'); const handleSelect = (event: TenantEvent) => { selectEvent(event.slug ?? null); setOpen(false); if (event.slug) { navigate(ADMIN_EVENT_VIEW_PATH(event.slug)); } }; return ( {t('eventSwitcher.title', 'Event auswählen')} {events.length === 0 ? t('eventSwitcher.emptyDescription', 'Erstelle dein erstes Event, um loszulegen.') : t('eventSwitcher.description', 'Wähle ein Event für die Bearbeitung oder lege ein neues an.')}
{events.length === 0 ? (
{t('eventSwitcher.noEvents', 'Noch keine Events vorhanden.')}
) : (
{events.map((event) => { const isActive = activeEvent?.id === event.id; const date = formatEventDate(event.event_date, locale); return ( ); })}
)} {activeEvent?.slug ? (

{t('eventSwitcher.actions', 'Event-Funktionen')}

{buildEventLinks(activeEvent.slug, t).map((action) => ( ))}
) : null}
); } export function EventMenuBar() { const { activeEvent } = useEventContext(); const { t } = useTranslation('common'); const location = useLocation(); if (!activeEvent?.slug) { return null; } const links = buildEventLinks(activeEvent.slug, t); return (
{links.map((link) => ( cn( 'whitespace-nowrap rounded-full px-3 py-1 text-xs font-semibold transition', isActive || location.pathname.startsWith(link.href) ? 'bg-rose-600 text-white shadow shadow-rose-400/40' : 'bg-white text-slate-600 ring-1 ring-slate-200 hover:text-rose-600 dark:bg-white/10 dark:text-white dark:ring-white/10' ) } > {link.label} ))}
); }