import React, { ReactElement } from "react"; import ellipsize from "ellipsize"; import prettyBytes from "pretty-bytes"; import { Card } from "../shared/Carda"; import { convert } from "html-to-text"; import { determineCoverFile } from "../../shared/utils/metadata.utils"; import { find, isUndefined } from "lodash"; /** * Props for the MetadataPanel component. */ interface MetadataPanelProps { /** * Comic metadata object passed into the panel. */ data: any; /** * Optional custom styling for the cover image. */ imageStyle?: React.CSSProperties; /** * Optional custom styling for the title section. */ titleStyle?: React.CSSProperties; } /** * MetadataPanel component * * Displays structured comic metadata based on the best available source * (raw file data, ComicVine, or League of Comic Geeks). * * @component * @param {MetadataPanelProps} props * @returns {ReactElement} */ export const MetadataPanel = (props: MetadataPanelProps): ReactElement => { const { rawFileDetails, inferredMetadata, sourcedMetadata: { comicvine, locg }, } = props.data; const { issueName, url, objectReference } = determineCoverFile({ comicvine, locg, rawFileDetails, }); const metadataContentPanel = [ { name: "rawFileDetails", content: () => (

{issueName}

is a part of{" "} {inferredMetadata.issue.name}
{inferredMetadata.issue.number && (
{inferredMetadata.issue.number}
)}
{rawFileDetails.mimeType} {prettyBytes(rawFileDetails.fileSize)} {rawFileDetails.archive?.uncompressed && ( )}
), }, { name: "comicvine", content: () => { return ( !isUndefined(comicvine?.volumeInformation) && (
{/* Title */}
{ellipsize(issueName, 28)}
{/* Volume Name */}
Part of{" "} {comicvine.volumeInformation.name}
{/* Description */}
{ellipsize( convert(comicvine.description || "", { baseElements: { selectors: ["p"] }, }), 160, )}
{/* Misc Info */}
{comicvine.volumeInformation.start_year} {comicvine.volumeInformation.count_of_issues} issues ID: {comicvine.id}
) ); }, }, { name: "locg", content: () => (
{ellipsize(issueName, 28)}
{ellipsize(locg?.description || "", 120)}
{locg?.price} {locg?.pulls}
rating {locg?.rating}
), }, ]; const metadataPanel = find(metadataContentPanel, { name: objectReference, }); return (
{metadataPanel?.content()}
); }; export default MetadataPanel;