import { useMemo } from "react"; import { Button, ButtonGroup } from "react-bootstrap"; import * as GQL from "src/core/generated-graphql"; import { Icon } from "../Shared/Icon"; import { TagLink } from "../Shared/TagLink"; import { HoverPopover } from "../Shared/HoverPopover"; import NavUtils from "src/utils/navigation"; import TextUtils from "src/utils/text"; import { useConfigurationContext } from "src/hooks/Config"; import { GridCard } from "../Shared/GridCard/GridCard"; import { faTag } from "@fortawesome/free-solid-svg-icons"; import { markerTitle } from "src/core/markers"; import { Link } from "react-router-dom"; import { objectTitle } from "src/core/files"; import { PerformerPopoverButton } from "../Shared/PerformerPopoverButton"; import { ScenePreview } from "./SceneCard"; import { TruncatedText } from "../Shared/TruncatedText"; interface ISceneMarkerCardProps { marker: GQL.SceneMarkerDataFragment; cardWidth?: number; previewHeight?: number; index?: number; compact?: boolean; selecting?: boolean; selected?: boolean | undefined; zoomIndex?: number; onSelectedChanged?: (selected: boolean, shiftKey: boolean) => void; } const SceneMarkerCardPopovers = (props: ISceneMarkerCardProps) => { function maybeRenderPerformerPopoverButton() { if (props.marker.scene.performers.length <= 0) return; return ( ); } function renderTagPopoverButton() { const popoverContent = [ , ]; props.marker.tags.map((tag) => popoverContent.push( ) ); return ( ); } function renderPopoverButtonGroup() { if (!props.compact) { return ( <>
{maybeRenderPerformerPopoverButton()} {renderTagPopoverButton()} ); } } return <>{renderPopoverButtonGroup()}; }; const SceneMarkerCardDetails = (props: ISceneMarkerCardProps) => { return (
{TextUtils.formatTimestampRange( props.marker.seconds, props.marker.end_seconds ?? undefined )} {objectTitle(props.marker.scene)} } />
); }; const SceneMarkerCardImage = (props: ISceneMarkerCardProps) => { const { configuration } = useConfigurationContext(); const file = useMemo( () => props.marker.scene.files.length > 0 ? props.marker.scene.files[0] : undefined, [props.marker.scene] ); function isPortrait() { const width = file?.width ? file.width : 0; const height = file?.height ? file.height : 0; return height > width; } function maybeRenderSceneSpecsOverlay() { return (
{props.marker.end_seconds && ( {TextUtils.secondsToTimestamp( props.marker.end_seconds - props.marker.seconds )} )}
); } return ( <> {maybeRenderSceneSpecsOverlay()} ); }; export const SceneMarkerCard = (props: ISceneMarkerCardProps) => { function zoomIndex() { if (!props.compact && props.zoomIndex !== undefined) { return `zoom-${props.zoomIndex}`; } return ""; } return ( } details={} popovers={} selected={props.selected} selecting={props.selecting} onSelectedChanged={props.onSelectedChanged} /> ); };