import { View, Text, TouchableOpacity, ActivityIndicator, StyleSheet } from 'react-native' import { Ionicons } from '@expo/vector-icons' import { Badge } from '@/components/ui/Badge' import { TERMIN_TYP_LABELS } from '@innungsapp/shared/types' import { format } from 'date-fns' import { de } from 'date-fns/locale' interface TerminCardProps { termin: { id: string titel: string datum: Date uhrzeit: string | null ort: string | null typ: string isAngemeldet: boolean teilnehmerAnzahl: number } onPress: () => void onToggleAnmeldung?: () => void isToggling?: boolean isPast?: boolean } export function TerminCard({ termin, onPress, onToggleAnmeldung, isToggling = false, isPast = false, }: TerminCardProps) { const datum = new Date(termin.datum) return ( {/* Date column */} {format(datum, 'dd')} {format(datum, 'MMM', { locale: de }).toUpperCase()} {!isPast && termin.isAngemeldet && } {isPast && ( vorbei )} {/* Divider */} {/* Content */} {termin.titel} {termin.uhrzeit && ( {termin.uhrzeit} Uhr )} {termin.ort && ( {termin.ort} )} {/* Registration status chip — only for upcoming events */} {!isPast && termin.isAngemeldet && onToggleAnmeldung && ( { e.stopPropagation?.() onToggleAnmeldung() }} style={styles.registeredChip} disabled={isToggling} activeOpacity={0.75} > {isToggling ? ( ) : ( )} Angemeldet · Abmelden )} {/* Chevron */} ) } const styles = StyleSheet.create({ card: { backgroundColor: '#FFFFFF', borderRadius: 16, flexDirection: 'row', alignItems: 'center', overflow: 'hidden', shadowColor: '#1C1917', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.08, shadowRadius: 12, elevation: 3, }, cardPast: { shadowOpacity: 0.04, elevation: 1, }, dateColumn: { width: 64, alignItems: 'center', justifyContent: 'center', paddingVertical: 18, backgroundColor: '#EFF6FF', }, dateColumnPast: { backgroundColor: '#F4F4F5', }, dayNumber: { fontSize: 28, fontWeight: '800', color: '#003B7E', lineHeight: 30, }, dayNumberPast: { color: '#94A3B8', }, monthLabel: { fontSize: 10, fontWeight: '700', color: '#003B7E', letterSpacing: 1, opacity: 0.75, marginTop: 1, }, monthLabelPast: { color: '#94A3B8', opacity: 1, }, registeredDot: { width: 6, height: 6, borderRadius: 3, backgroundColor: '#059669', marginTop: 6, }, pastBadge: { marginTop: 6, backgroundColor: '#E2E8F0', borderRadius: 99, paddingHorizontal: 6, paddingVertical: 2, }, pastBadgeText: { fontSize: 9, fontWeight: '700', color: '#94A3B8', letterSpacing: 0.5, textTransform: 'uppercase', }, divider: { width: 1, alignSelf: 'stretch', marginVertical: 14, backgroundColor: '#F0EDED', }, dividerPast: { backgroundColor: '#F4F4F5', }, content: { flex: 1, paddingHorizontal: 14, paddingVertical: 14, gap: 8, }, title: { fontSize: 15, fontWeight: '600', color: '#0F172A', letterSpacing: -0.2, lineHeight: 21, marginTop: 2, }, titlePast: { color: '#94A3B8', fontWeight: '500', }, metaRow: { flexDirection: 'column', gap: 4, marginTop: 4, }, metaItem: { flexDirection: 'row', alignItems: 'center', gap: 4, }, metaText: { fontSize: 12, color: '#64748B', }, metaTextPast: { color: '#94A3B8', }, registeredChip: { flexDirection: 'row', alignItems: 'center', gap: 5, marginTop: 4, alignSelf: 'flex-start', backgroundColor: '#ECFDF5', borderRadius: 99, paddingHorizontal: 10, paddingVertical: 5, borderWidth: 1, borderColor: '#A7F3D0', }, registeredChipText: { fontSize: 12, fontWeight: '600', color: '#047857', }, abmeldenText: { color: '#DC2626', fontWeight: '600', }, chevronWrap: { paddingRight: 12, }, })