import { PersonMini } from "@/apis/personHistoryApi"; import styles from "@/app/stackStyles/participantStyles"; import { usePersonHistory, AppearanceGroup } from "@/hooks/usePersonHistory"; import Ionicons from "@expo/vector-icons/Ionicons"; import { router, useLocalSearchParams } from "expo-router"; import * as WebBrowser from "expo-web-browser"; import React from "react"; import { Image, Text, TouchableOpacity, View } from "react-native"; import { GestureHandlerRootView, ScrollView, } from "react-native-gesture-handler"; export default function ParticipantScreen() { const { name, participantId } = useLocalSearchParams(); const pid = Array.isArray(participantId) ? Number(participantId[0]) : Number(participantId); const { data: appearances = [], isLoading, isError } = usePersonHistory(pid); const formatYear = (iso?: string | null) => { if (!iso) return null; const [y] = iso.split("-"); return y || null; }; const [expandedShows, setExpandedShows] = React.useState>( new Set() ); const toggleExpand = React.useCallback((showId: number) => { setExpandedShows((prev) => { const next = new Set(prev); if (next.has(showId)) next.delete(showId); else next.add(showId); return next; }); }, []); const goToShow = React.useCallback((id: number) => { router.push({ pathname: "/showDetails", params: { id: String(id) } }); }, []); const goToPerson = React.useCallback( (p: PersonMini) => { if (!p?.personId) return; if (p.personId === pid) return; router.push({ pathname: "/participant", params: { participantId: String(p.personId), name: p.name }, }); }, [pid] ); return ( {name} router.back()} > WebBrowser.openBrowserAsync( "https://www.google.com/search?udm=2&q=" + encodeURIComponent(String(name)) ) } > Auftritte: {appearances.toReversed().map(({ show, seasons }) => { const partners = Array.from( new Map( seasons .map((s) => s.partner) .filter((p): p is NonNullable => !!p) .map((p) => [p.personId, p]) ).values() ); const allParticipants = Array.from( new Map( seasons .flatMap((s) => s.participants) .filter((p) => p.personId !== pid) .map((p) => [p.personId, p]) ).values() ); const isExpanded = expandedShows.has(show.id); const visible = isExpanded ? allParticipants : allParticipants.slice(0, 12); const restCount = Math.max( allParticipants.length - visible.length, 0 ); return ( goToShow(show.id)} > {show.title} ({formatYear(seasons[0]?.startDate)}) Staffel {seasons.map((s) => s.seasonNumber).join(" und ")} Weitere Teilnehmer {visible.map((p) => ( goToPerson(p)} > {p.name} ))} {!isExpanded && restCount > 0 && ( toggleExpand(show.id)} style={styles.moreChip} > +{restCount} mehr )} {isExpanded && allParticipants.length > 12 && ( toggleExpand(show.id)} style={styles.moreChip} > Weniger )} {partners.length > 0 && ( <> Partner {partners.map((p) => ( {p.name} ))} )} ); })} ); }