import { View, Image, Text, TouchableOpacity } from "react-native"; import styles from "@/app/stackStyles/participantStyles"; import Ionicons from "@expo/vector-icons/Ionicons"; import React, { useEffect, useMemo, useState } from "react"; import { router, useLocalSearchParams } from "expo-router"; import { usePersonContext } from "@/contexts/PersonContext"; import * as WebBrowser from "expo-web-browser"; import { ScrollView, GestureHandlerRootView, } from "react-native-gesture-handler"; import { useShowContext } from "@/contexts/ShowContext"; export default function ParticipantScreen() { const { getPersonAppearances, isLoading, getError } = usePersonContext(); const [appearances, setAppearances] = useState< { showId: number; seasons: number[]; }[] >([]); const { shows, error, loading } = useShowContext(); const { participantId, name, season } = useLocalSearchParams(); const numericId = Array.isArray(participantId) ? Number(participantId[0]) : Number(participantId); useEffect(() => { let active = true; (async () => { if (!numericId || Number.isNaN(numericId)) return; const data = await getPersonAppearances(numericId); if (!active) return; const grouped = data.showIds.map((id) => ({ showId: id, seasons: data.byShow[id], partners: data.partnersByShow[id] || [], })); setAppearances(grouped as any); })(); return () => { active = false; }; }, [numericId, getPersonAppearances]); const resolved = useMemo( () => (appearances as any[]) .map((a) => { const show = shows.find((s) => s.id === a.showId); if (!show) return null; return { show, seasons: a.seasons as number[], partners: a.partners as { seasonNumber: number; partner?: { id: number; name: string; imageUrl?: string | null }; }[], }; }) .filter( ( v ): v is { show: (typeof shows)[number]; seasons: number[]; partners: { seasonNumber: number; partner?: { id: number; name: string; imageUrl?: string | null }; }[]; } => !!v ), [appearances, shows] ); return ( {name ? (Array.isArray(name) ? name[0] : name) : "Teilnehmer"} router.back()} > Single 24 Jahre Köln Auftritte: {isLoading(numericId) && ( Lädt... )} {getError(numericId) && ( {getError(numericId)} )} {!isLoading(numericId) && resolved.length === 0 && !getError(numericId) && ( Keine Einträge. )} {resolved.map(({ show, seasons, partners }) => { const seasonPartnerLines = partners.map((p) => { const label = `Staffel ${p.seasonNumber}`; if (!p.partner) return label; return `${label} • Partner: ${p.partner.name}`; }); return ( {show.title} {seasonPartnerLines.join("\n")} ); })} ); }