import React from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { CalendarDays, ChevronDown, MapPin } from 'lucide-react'; import { YStack, XStack } from '@tamagui/stacks'; import { SizableText as Text } from '@tamagui/text'; import { MobileShell } from './components/MobileShell'; import { MobileCard, CTAButton } from './components/Primitives'; import { createEvent, getEvent, updateEvent, TenantEvent } from '../api'; import { adminPath } from '../constants'; import { isAuthError } from '../auth/tokens'; import { getApiErrorMessage } from '../lib/apiError'; type FormState = { name: string; date: string; eventType: string; description: string; location: string; enableBranding: boolean; }; const EVENT_TYPES = ['Wedding', 'Corporate', 'Party', 'Other']; export default function MobileEventFormPage() { const { slug: slugParam } = useParams<{ slug?: string }>(); const slug = slugParam ?? null; const isEdit = Boolean(slug); const navigate = useNavigate(); const { t } = useTranslation('management'); const [form, setForm] = React.useState({ name: '', date: '', eventType: EVENT_TYPES[0], description: '', location: '', enableBranding: false, }); const [loading, setLoading] = React.useState(isEdit); const [saving, setSaving] = React.useState(false); const [error, setError] = React.useState(null); React.useEffect(() => { if (!slug) return; (async () => { setLoading(true); try { const data = await getEvent(slug); setForm({ name: renderName(data.name), date: data.event_date ?? '', eventType: data.event_type?.name ?? EVENT_TYPES[0], description: typeof data.description === 'string' ? data.description : '', location: resolveLocation(data), enableBranding: Boolean((data.settings as Record)?.branding_allowed ?? true), }); setError(null); } catch (err) { if (!isAuthError(err)) { setError(getApiErrorMessage(err, t('events.errors.loadFailed', 'Event konnte nicht geladen werden.'))); } } finally { setLoading(false); } })(); }, [slug, t, isEdit]); async function handleSubmit() { setSaving(true); setError(null); try { if (isEdit && slug) { await updateEvent(slug, { name: form.name, event_date: form.date || undefined, settings: { branding_allowed: form.enableBranding, location: form.location }, }); navigate(adminPath(`/mobile/events/${slug}`)); } else { const payload = { name: form.name || 'Event', slug: `${Date.now()}`, event_type_id: 1, event_date: form.date || undefined, status: 'draft' as const, settings: { branding_allowed: form.enableBranding, location: form.location }, }; const { event } = await createEvent(payload as any); navigate(adminPath(`/mobile/events/${event.slug}`)); } } catch (err) { if (!isAuthError(err)) { setError(getApiErrorMessage(err, t('events.errors.saveFailed', 'Event konnte nicht gespeichert werden.'))); } } finally { setSaving(false); } } return ( navigate(-1)} > {error ? ( {error} ) : null} setForm((prev) => ({ ...prev, name: e.target.value }))} placeholder="e.g., Smith Wedding" style={inputStyle} /> setForm((prev) => ({ ...prev, date: e.target.value }))} style={{ ...inputStyle, flex: 1 }} /> {EVENT_TYPES.map((type) => { const active = form.eventType === type; return ( ); })}