diff --git a/src/components/PersonDetails/index.tsx b/src/components/PersonDetails/index.tsx index bccd25bdf..a1dedcb02 100644 --- a/src/components/PersonDetails/index.tsx +++ b/src/components/PersonDetails/index.tsx @@ -7,6 +7,7 @@ import TitleCard from '@app/components/TitleCard'; import globalMessages from '@app/i18n/globalMessages'; import Error from '@app/pages/_error'; import defineMessages from '@app/utils/defineMessages'; +import { CircleStackIcon } from '@heroicons/react/24/solid'; import type { PersonCombinedCreditsResponse } from '@server/interfaces/api/personInterfaces'; import type { PersonDetails as PersonDetailsType } from '@server/models/Person'; import { groupBy } from 'lodash'; @@ -25,9 +26,12 @@ const messages = defineMessages('components.PersonDetails', { ascharacter: 'as {character}', }); +type MediaType = 'all' | 'movie' | 'tv'; + const PersonDetails = () => { const intl = useIntl(); const router = useRouter(); + const [currentMediaType, setCurrentMediaType] = useState('all'); const { data, error } = useSWR( `/api/v1/person/${router.query.personId}` ); @@ -39,7 +43,11 @@ const PersonDetails = () => { ); const sortedCast = useMemo(() => { - const grouped = groupBy(combinedCredits?.cast ?? [], 'id'); + const filtered = (combinedCredits?.cast ?? []).filter( + (media) => + currentMediaType === 'all' || media.mediaType === currentMediaType + ); + const grouped = groupBy(filtered, 'id'); const reduced = Object.values(grouped).map((objs) => ({ ...objs[0], @@ -54,10 +62,14 @@ const PersonDetails = () => { } return 1; }); - }, [combinedCredits]); + }, [combinedCredits, currentMediaType]); const sortedCrew = useMemo(() => { - const grouped = groupBy(combinedCredits?.crew ?? [], 'id'); + const filtered = (combinedCredits?.crew ?? []).filter( + (media) => + currentMediaType === 'all' || media.mediaType === currentMediaType + ); + const grouped = groupBy(filtered, 'id'); const reduced = Object.values(grouped).map((objs) => ({ ...objs[0], @@ -72,7 +84,7 @@ const PersonDetails = () => { } return 1; }); - }, [combinedCredits]); + }, [combinedCredits, currentMediaType]); if (!data && !error) { return ; @@ -122,6 +134,29 @@ const PersonDetails = () => { const isLoading = !combinedCredits && !errorCombinedCredits; + const mediaTypePicker = ( +
+ + + + +
+ ); + const cast = (sortedCast ?? []).length > 0 && ( <>
@@ -235,8 +270,11 @@ const PersonDetails = () => { />
)} -
-

{data.name}

+
+
+

{data.name}

+
{mediaTypePicker}
+
{personAttributes.join(' | ')}
{(data.alsoKnownAs ?? []).length > 0 && (