import React, { useState, useEffect, useCallback, ReactElement } from "react"; import { useParams } from "react-router-dom"; import Card from "./Carda"; import MatchResult from "./MatchResult"; import ComicVineSearchForm from "./ComicVineSearchForm"; import AcquisitionPanel from "./AcquisitionPanel"; import DownloadsPanel from "./DownloadsPanel"; import SlidingPane from "react-sliding-pane"; import Select, { components } from "react-select"; import { css } from "@emotion/react"; import "react-sliding-pane/dist/react-sliding-pane.css"; import PuffLoader from "react-spinners/PuffLoader"; import { isEmpty, isUndefined, isNil } from "lodash"; import { RootState } from "threetwo-ui-typings"; import { fetchComicVineMatches } from "../actions/fileops.actions"; import { getComicBookDetailById } from "../actions/comicinfo.actions"; import dayjs from "dayjs"; const prettyBytes = require("pretty-bytes"); import { useDispatch, useSelector } from "react-redux"; import { removeLeadingPeriod, escapePoundSymbol, } from "../shared/utils/formatting.utils"; type ComicDetailProps = {}; /** * Component for displaying the metadata for a comic in greater detail. * * @component * @example * return ( * * ) */ export const ComicDetail = ({}: ComicDetailProps): ReactElement => { const [page, setPage] = useState(1); const [visible, setVisible] = useState(false); const comicVineSearchResults = useSelector( (state: RootState) => state.comicInfo.searchResults, ); const comicVineSearchQueryObject = useSelector( (state: RootState) => state.comicInfo.searchQuery, ); const comicVineAPICallProgress = useSelector( (state: RootState) => state.comicInfo.inProgress, ); const comicBookDetailData = useSelector( (state: RootState) => state.comicInfo.comicBookDetail, ); const { comicObjectId } = useParams<{ comicObjectId: string }>(); const dispatch = useDispatch(); useEffect(() => { dispatch(getComicBookDetailById(comicObjectId)); }, [page, dispatch]); const openDrawerWithCVMatches = useCallback(() => { setVisible(true); dispatch(fetchComicVineMatches(comicBookDetailData)); }, [dispatch, comicBookDetailData]); const onClose = () => { setVisible(false); }; const [active, setActive] = useState(1); const createDescriptionMarkup = (html) => { return { __html: html }; }; const isComicBookMetadataAvailable = comicBookDetailData.sourcedMetadata && !isUndefined(comicBookDetailData.sourcedMetadata.comicvine) && !isEmpty(comicBookDetailData.sourcedMetadata); // Tab groups for ComicVine metadata const tabGroup = [ { id: 1, name: "Volume Information", icon: , content: isComicBookMetadataAvailable ? (
Is a part of{" "} { comicBookDetailData.sourcedMetadata.comicvine .volumeInformation.name }
Published by {" "} { comicBookDetailData.sourcedMetadata.comicvine .volumeInformation.publisher.name }
Total issues in this volume:{" "} { comicBookDetailData.sourcedMetadata.comicvine .volumeInformation.count_of_issues }
) : null, }, { id: 2, icon: , name: "Other Metadata", content:
bastard
, }, { id: 3, icon: , name: "Acquisition", content: ( ), }, { id: 4, icon: , name: "Downloads", content: , }, ]; const MetadataTabGroup = () => { return ( <>
    {tabGroup.map(({ id, name, icon }) => (
  • setActive(id)} > {icon} {name}
  • ))}
{tabGroup.map(({ id, content }) => { return active === id ? content : null; })} ); }; const RawFileDetails = (props) => (
Raw File Details
{props.data.containedIn}
{prettyBytes(props.data.fileSize)}
{props.data.path}
{props.data.extension}
); const ComicVineDetails = (props) => (
ComicVine Metadata
Last scraped on{" "} {dayjs(props.updatedAt).format("MMM D YYYY [at] h:mm a")}
{props.data.name}
{props.data.number}
Type {props.data.resource_type}
ComicVine Issue ID {props.data.id}
); let imagePath = ""; let comicBookTitle = ""; if (!isNil(comicBookDetailData.rawFileDetails)) { const encodedFilePath = encodeURI( "http://localhost:3000" + removeLeadingPeriod(comicBookDetailData.rawFileDetails.path), ); imagePath = escapePoundSymbol(encodedFilePath); comicBookTitle = comicBookDetailData.rawFileDetails.name; } else if ( !isNil(comicBookDetailData.sourcedMetadata) && !isNil(comicBookDetailData.sourcedMetadata.comicvine) ) { imagePath = comicBookDetailData.sourcedMetadata.comicvine.image.small_url; comicBookTitle = comicBookDetailData.sourcedMetadata.comicvine.name; } // actions menu options and handler const CVMatchLabel = ( Match on ComicVine ); const editLabel = ( Edit Metadata ); const deleteLabel = ( Delete Comic ); const Placeholder = (props) => { return ; }; const actionOptions = [ { value: "match-on-comic-vine", label: CVMatchLabel }, { value: "edit-metdata", label: editLabel }, { value: "delete-comic", label: deleteLabel }, ]; const handleActionSelection = (action) => { switch (action.value) { case "match-on-comic-vine": openDrawerWithCVMatches(); break; default: console.log("No valid action selected."); break; } }; return (
{!isNil(comicBookDetailData) && !isEmpty(comicBookDetailData) && ( <>

{comicBookTitle}

{/* raw file details */}
{!isNil(comicBookDetailData.rawFileDetails) && ( <> )} {/* comic vine scraped metadata */} {!isNil(comicBookDetailData.sourcedMetadata.comicvine) && ( )}
{/* action dropdown */}