import {GetPersonResponse} from '@app/people/requests/use-person'; import {Accordion, AccordionItem} from '@common/ui/accordion/accordion'; import {Trans} from '@common/i18n/trans'; import {TitlePoster} from '@app/titles/title-poster/title-poster'; import {SiteSectionHeading} from '@app/titles/site-section-heading'; import {TitleLink} from '@app/titles/title-link'; import {PersonCredit} from '@app/titles/models/title'; import {BulletSeparatedItems} from '@app/titles/bullet-separated-items'; import {CompactSeasonEpisode} from '@app/episodes/compact-season-episode'; import {EpisodeLink} from '@app/episodes/episode-link'; import {Button} from '@common/ui/buttons/button'; import {Fragment, useState} from 'react'; import {useFullPersonCreditsForTitle} from '@app/people/requests/use-full-person-credits-for-title'; import {CharacterOrJob} from '@app/people/person-page/character-or-job'; import {Person} from '@app/titles/models/person'; interface Props { data: GetPersonResponse; } export function PersonPageCredits({data: {credits, person}}: Props) { return (
{Object.entries(credits).map(([department, credits]) => ( } key={department} label={ } > {credits.map((credit, index) => { const isLast = credit === credits[credits.length - 1]; return (
{credit.credited_episode_count ? ( ) : null}
{credit.year}
{!isLast && credit.year !== credits[index + 1]?.year && (
)} ); })} ))}
); } interface EpisodeListProps { credit: PersonCredit; department: string; person: Person; } function EpisodeList({credit, department, person}: EpisodeListProps) { const [loadMoreEpisodes, setLoadMoreEpisodes] = useState(false); const query = useFullPersonCreditsForTitle( {person, department, credit}, { enabled: loadMoreEpisodes, } ); const allEpisodesLoaded = credit.episodes.length === credit.credited_episode_count || query.data != null; const isLoadingMore = query.isLoading && query.fetchStatus !== 'idle'; const shouldShowLoadMoreBtn = isLoadingMore || !allEpisodesLoaded; const episodeCredits = query.data?.credits.length ? query.data.credits : credit.episodes; return (
{episodeCredits.map(episodeCredit => (
-{' '} {' '} ({episodeCredit.year})
))}
{shouldShowLoadMoreBtn && (
)}
); }