import { PersonMini } from "@/apis/personHistoryApi"; import styles from "@/app/stackStyles/participantStyles"; import { usePersonHistory } 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 { ActivityIndicator, Image, Text, TouchableOpacity, View, } from "react-native"; import { GestureHandlerRootView, ScrollView, } from "react-native-gesture-handler"; export default function ParticipantScreen() { const { name, participantId, imageUri } = useLocalSearchParams(); const pid = Array.isArray(participantId) ? Number(participantId[0]) : Number(participantId); const imageUriString = Array.isArray(imageUri) ? imageUri[0] : imageUri; const isPravatar = imageUriString?.includes("pravatar"); 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, imageUri: p.imageUrl || "", }, }); }, [pid], ); return ( {/* Profile Hero */} {name} {appearances.length}{" "} {appearances.length === 1 ? "Auftritt" : "Auftritte"} WebBrowser.openBrowserAsync( "https://www.google.com/search?udm=2&q=" + encodeURIComponent(String(name)), ) } > Bilder WebBrowser.openBrowserAsync( "https://www.google.com/search?q=" + encodeURIComponent(`${String(name)} Instagram`), ) } > Instagram {/* Loading */} {isLoading && ( )} {/* Appearances */} {!isLoading && appearances.length > 0 && ( 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} Staffel{" "} {seasons.map((s) => s.seasonNumber).join(" & ")} {" ยท "} {formatYear(seasons[0]?.startDate)} WebBrowser.openBrowserAsync( "https://www.google.com/search?udm=2&q=" + encodeURIComponent( `${String(name)} ${show.title}`, ), ) } > {partners.length > 0 && ( Partner {partners.map((p) => ( goToPerson(p)} > {p.name} ))} )} {allParticipants.length > 0 && ( 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 )} )} ); })} )} ); }