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 { type TenantEvent } from '../api'; 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_VIEW_PATH, ADMIN_EVENT_PHOTOBOOTH_PATH, ADMIN_EVENT_BRANDING_PATH, } from '../constants'; import { cn } from '@/lib/utils'; import { resolveEventDisplayName, formatEventDate } from '../lib/events'; 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: 'photobooth', label: t('eventMenu.photobooth', 'Photobooth'), href: ADMIN_EVENT_PHOTOBOOTH_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', 'QR-Codes'), href: ADMIN_EVENT_INVITES_PATH(slug) }, { key: 'branding', label: t('eventMenu.branding', 'Branding & Fonts'), href: ADMIN_EVENT_BRANDING_PATH(slug) }, ]; } type EventSwitcherProps = { buttonClassName?: string; compact?: boolean; }; export function EventSwitcher({ buttonClassName, compact = false }: EventSwitcherProps = {}) { 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 ? resolveEventDisplayName(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)); } }; const buttonClasses = cn( 'rounded-full border-rose-100 bg-white/80 px-4 text-sm font-semibold text-slate-700 shadow-sm hover:bg-rose-50 dark:border-white/20 dark:bg-white/10 dark:text-white', compact && 'px-3 text-xs sm:text-sm', buttonClassName, ); const buttonLabelClasses = compact ? 'text-sm' : 'hidden sm:inline'; const hintClasses = compact ? 'text-xs text-slate-500 dark:text-slate-300' : 'text-xs text-slate-500 dark:text-slate-300 sm:ml-2'; 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} ))}
); }