import { useRouter } from 'next/router'; import React, { useContext, useState } from 'react'; import TruncateMarkup from 'react-truncate-markup'; import useSWR from 'swr'; import type { PersonDetail } from '../../../server/models/Person'; import type { PersonCombinedCreditsResponse } from '../../../server/interfaces/api/personInterfaces'; import Error from '../../pages/_error'; import LoadingSpinner from '../Common/LoadingSpinner'; import TitleCard from '../TitleCard'; import { defineMessages, useIntl } from 'react-intl'; import { LanguageContext } from '../../context/LanguageContext'; import ImageFader from '../Common/ImageFader'; import Ellipsis from '../../assets/ellipsis.svg'; const messages = defineMessages({ appearsin: 'Appears in', crewmember: 'Crew Member', ascharacter: 'as {character}', nobiography: 'No biography available.', }); const PersonDetails: React.FC = () => { const intl = useIntl(); const { locale } = useContext(LanguageContext); const router = useRouter(); const { data, error } = useSWR( `/api/v1/person/${router.query.personId}` ); const [showBio, setShowBio] = useState(false); const { data: combinedCredits, error: errorCombinedCredits, } = useSWR( `/api/v1/person/${router.query.personId}/combined_credits?language=${locale}` ); if (!data && !error) { return ; } if (!data) { return ; } const sortedCast = combinedCredits?.cast.sort((a, b) => { const aDate = a.mediaType === 'movie' ? a.releaseDate?.slice(0, 4) ?? 0 : a.firstAirDate?.slice(0, 4) ?? 0; const bDate = b.mediaType === 'movie' ? b.releaseDate?.slice(0, 4) ?? 0 : b.firstAirDate?.slice(0, 4) ?? 0; if (aDate > bDate) { return -1; } return 1; }); const sortedCrew = combinedCredits?.crew.sort((a, b) => { const aDate = a.mediaType === 'movie' ? a.releaseDate?.slice(0, 4) ?? 0 : a.firstAirDate?.slice(0, 4) ?? 0; const bDate = b.mediaType === 'movie' ? b.releaseDate?.slice(0, 4) ?? 0 : b.firstAirDate?.slice(0, 4) ?? 0; if (aDate > bDate) { return -1; } return 1; }); const isLoading = !combinedCredits && !errorCombinedCredits; return ( <> {(sortedCrew || sortedCast) && (
media.posterPath) .map( (media) => `//image.tmdb.org/t/p/w1920_and_h800_multi_faces/${media.posterPath}` ) .slice(0, 6)} />
)}
{data.profilePath && (
)}

{data.name}

{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
setShowBio((show) => !show)} role="button" tabIndex={-1} > } >
{data.biography ? data.biography : intl.formatMessage(messages.nobiography)}
{(sortedCast ?? []).length > 0 && ( <>
{intl.formatMessage(messages.appearsin)}
    {sortedCast?.map((media, index) => { return (
  • {media.character && (
    {intl.formatMessage(messages.ascharacter, { character: media.character, })}
    )}
  • ); })}
)} {(sortedCrew ?? []).length > 0 && ( <>
{intl.formatMessage(messages.crewmember)}
    {sortedCrew?.map((media, index) => { return (
  • {media.job && (
    {media.job}
    )}
  • ); })}
)} {isLoading && } ); }; export default PersonDetails;