import React from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Bell, RefreshCcw } from 'lucide-react'; import { YStack, XStack } from '@tamagui/stacks'; import { SizableText as Text } from '@tamagui/text'; import { Pressable } from '@tamagui/react-native-web-lite'; import { MobileScaffold } from './components/Scaffold'; import { MobileCard, PillBadge } from './components/Primitives'; import { BottomNav } from './components/BottomNav'; import { GuestNotificationSummary, listGuestNotifications } from '../api'; import { isAuthError } from '../auth/tokens'; import { getApiErrorMessage } from '../lib/apiError'; import toast from 'react-hot-toast'; import { useMobileNav } from './hooks/useMobileNav'; import { MobileSheet } from './components/Sheet'; import { getEvents, TenantEvent } from '../api'; type AlertItem = { id: string; title: string; body: string; time: string; tone: 'info' | 'warning'; }; async function loadNotifications(slug?: string): Promise { try { const result = slug ? await listGuestNotifications(slug) : []; return (result ?? []).map((item: GuestNotificationSummary) => ({ id: String(item.id), title: item.title || 'Alert', body: item.body ?? '', time: item.created_at ?? '', tone: item.type === 'support_tip' ? 'warning' : 'info', })); } catch (err) { throw err; } } export default function MobileAlertsPage() { const navigate = useNavigate(); const { t } = useTranslation('management'); const search = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : ''); const slug = search.get('event') ?? undefined; const [alerts, setAlerts] = React.useState([]); const [loading, setLoading] = React.useState(true); const [error, setError] = React.useState(null); const { go } = useMobileNav(slug ?? null); const [events, setEvents] = React.useState([]); const [showEventPicker, setShowEventPicker] = React.useState(false); const reload = React.useCallback(async () => { setLoading(true); try { const data = await loadNotifications(slug ?? undefined); setAlerts(data); setError(null); } catch (err) { if (!isAuthError(err)) { const message = getApiErrorMessage(err, t('events.errors.loadFailed', 'Alerts konnten nicht geladen werden.')); setError(message); toast.error(message); } } finally { setLoading(false); } }, [slug, t]); React.useEffect(() => { void reload(); }, [reload]); React.useEffect(() => { (async () => { try { const list = await getEvents(); setEvents(list); } catch { // non-fatal } })(); }, []); return ( navigate(-1)} rightSlot={ reload()}> } footer={ } > {error ? ( {error} ) : null} {loading ? ( {Array.from({ length: 4 }).map((_, idx) => ( ))} ) : alerts.length === 0 ? ( {t('alerts.empty', 'Keine Alerts vorhanden.')} ) : ( {events.length ? ( setShowEventPicker(true)}> {t('alerts.filterByEvent', 'Filter by event')} ) : null} {alerts.map((item) => ( {item.title} {item.body} {item.time} ))} )} setShowEventPicker(false)} title={t('alerts.filterByEvent', 'Filter by event')} footer={null} > {events.length === 0 ? ( {t('events.list.empty.description', 'Starte jetzt mit deinem ersten Event.')} ) : ( events.map((ev) => ( { setShowEventPicker(false); if (ev.slug) { navigate(`/admin/mobile/alerts?event=${ev.slug}`); } }} > {ev.name} {ev.slug} {ev.status ?? '—'} )) )} ); }