import React from "react"; import { Link } from "react-router-dom"; import { useIntl } from "react-intl"; import * as GQL from "src/core/generated-graphql"; import NavUtils from "src/utils/navigation"; import TextUtils from "src/utils/text"; import { GridCard } from "../Shared/GridCard"; import { CountryFlag } from "../Shared/CountryFlag"; import { SweatDrops } from "../Shared/SweatDrops"; import { HoverPopover } from "../Shared/HoverPopover"; import { Icon } from "../Shared/Icon"; import { TagLink } from "../Shared/TagLink"; import { Button, ButtonGroup } from "react-bootstrap"; import { Criterion, CriterionValue, } from "src/models/list-filter/criteria/criterion"; import { PopoverCountButton } from "../Shared/PopoverCountButton"; import GenderIcon from "./GenderIcon"; import { faHeart, faTag } from "@fortawesome/free-solid-svg-icons"; import { RatingBanner } from "../Shared/RatingBanner"; import cx from "classnames"; import { usePerformerUpdate } from "src/core/StashService"; import { ILabeledId } from "src/models/list-filter/types"; export interface IPerformerCardExtraCriteria { scenes?: Criterion[]; images?: Criterion[]; galleries?: Criterion[]; movies?: Criterion[]; performer?: ILabeledId; } interface IPerformerCardProps { performer: GQL.PerformerDataFragment; ageFromDate?: string; selecting?: boolean; selected?: boolean; onSelectedChanged?: (selected: boolean, shiftKey: boolean) => void; extraCriteria?: IPerformerCardExtraCriteria; } export const PerformerCard: React.FC = ({ performer, ageFromDate, selecting, selected, onSelectedChanged, extraCriteria, }) => { const intl = useIntl(); const age = TextUtils.age( performer.birthdate, ageFromDate ?? performer.death_date ); const ageL10nId = ageFromDate ? "media_info.performer_card.age_context" : "media_info.performer_card.age"; const ageL10String = intl.formatMessage({ id: "years_old", defaultMessage: "years old", }); const ageString = intl.formatMessage( { id: ageL10nId }, { age, years_old: ageL10String } ); const [updatePerformer] = usePerformerUpdate(); function renderFavoriteIcon() { return ( e.preventDefault()}> ); } function onToggleFavorite(v: boolean) { if (performer.id) { updatePerformer({ variables: { input: { id: performer.id, favorite: v, }, }, }); } } function maybeRenderScenesPopoverButton() { if (!performer.scene_count) return; return ( ); } function maybeRenderImagesPopoverButton() { if (!performer.image_count) return; return ( ); } function maybeRenderGalleriesPopoverButton() { if (!performer.gallery_count) return; return ( ); } function maybeRenderOCounter() { if (!performer.o_counter) return; return (
); } function maybeRenderTagPopoverButton() { if (performer.tags.length <= 0) return; const popoverContent = performer.tags.map((tag) => ( )); return ( ); } function maybeRenderMoviesPopoverButton() { if (!performer.movie_count) return; return ( ); } function maybeRenderPopoverButtonGroup() { if ( performer.scene_count || performer.image_count || performer.gallery_count || performer.tags.length > 0 || performer.o_counter || performer.movie_count ) { return ( <>
{maybeRenderScenesPopoverButton()} {maybeRenderMoviesPopoverButton()} {maybeRenderImagesPopoverButton()} {maybeRenderGalleriesPopoverButton()} {maybeRenderTagPopoverButton()} {maybeRenderOCounter()} ); } } function maybeRenderRatingBanner() { if (!performer.rating100) { return; } return ; } function maybeRenderFlag() { if (performer.country) { return ( {performer.country} ); } } return ( } title={
{performer.name} {performer.disambiguation && ( {` (${performer.disambiguation})`} )}
} image={ <> {performer.name {renderFavoriteIcon()} {maybeRenderRatingBanner()} {maybeRenderFlag()} } details={ <> {age !== 0 ? (
{ageString}
) : ( "" )} } popovers={maybeRenderPopoverButtonGroup()} selected={selected} selecting={selecting} onSelectedChanged={onSelectedChanged} /> ); };