import React, { useState, useEffect, ReactElement, useContext } from "react"; import { useDispatch, useSelector } from "react-redux"; import { useParams } from "react-router-dom"; import Card from "./Carda"; import { ComicVineMatchPanel } from "./ComicDetail/ComicVineMatchPanel"; import { VolumeInformation } from "./ComicDetail/Tabs/VolumeInformation"; import { ComicVineDetails } from "./ComicDetail/ComicVineDetails"; import { RawFileDetails } from "./ComicDetail/RawFileDetails"; import { ArchiveOperations } from "./ComicDetail/Tabs/ArchiveOperations"; import AcquisitionPanel from "./ComicDetail/AcquisitionPanel"; import DownloadsPanel from "./ComicDetail/DownloadsPanel"; import { EditMetadataPanel } from "./ComicDetail/EditMetadataPanel"; import { Menu } from "./ComicDetail/ActionMenu/Menu"; import { isEmpty, isUndefined, isNil } from "lodash"; import { RootState } from "threetwo-ui-typings"; import { getComicBookDetailById } from "../actions/comicinfo.actions"; import "react-sliding-pane/dist/react-sliding-pane.css"; import "react-loader-spinner/dist/loader/css/react-spinner-loader.css"; import Loader from "react-loader-spinner"; import SlidingPane from "react-sliding-pane"; import { escapePoundSymbol } from "../shared/utils/formatting.utils"; import { LIBRARY_SERVICE_HOST } from "../constants/endpoints"; import { getSettings } from "../actions/settings.actions"; import { AirDCPPSocketContext } from "../context/AirDCPPSocket"; import AirDCPPSocket from "../services/DcppSearchService"; type ComicDetailProps = {}; /** * Component for displaying the metadata for a comic in greater detail. * * @component * @example * return ( * * ) */ export const ComicDetail = ({}: ComicDetailProps): ReactElement => { const [active, setActive] = useState(1); const [page, setPage] = useState(1); const [visible, setVisible] = useState(false); const [slidingPanelContentId, setSlidingPanelContentId] = useState(""); 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 userSettings = useSelector((state: RootState) => state.settings.data); const { ADCPPSocket, setADCPPSocket } = useContext(AirDCPPSocketContext); const dispatch = useDispatch(); useEffect(() => { dispatch(getComicBookDetailById(comicObjectId)); dispatch(getSettings()); }, [page, dispatch]); useEffect(() => { if (isEmpty(ADCPPSocket) && !isNil(userSettings.directConnect)) { setADCPPSocket( new AirDCPPSocket({ protocol: `${userSettings.directConnect.client.host.protocol}`, hostname: `${userSettings.directConnect.client.host.hostname}`, }), ); } }, [userSettings]); // sliding panel init const contentForSlidingPanel = { CVMatches: { content: () => { if (!comicVineAPICallProgress) { return ( ); } else { return (
); } }, }, editComicBookMetadata: { content: () => , }, }; const isComicBookMetadataAvailable = comicBookDetailData.sourcedMetadata && !isUndefined(comicBookDetailData.sourcedMetadata.comicvine) && !isEmpty(comicBookDetailData.sourcedMetadata); // Tab content and header details const tabGroup = [ { id: 1, name: "Volume Information", icon: , content: isComicBookMetadataAvailable ? ( ) : null, }, { id: 2, icon: , name: "Archive Operations", content: , }, { id: 3, icon: , name: "Acquisition", content: ( ), }, { id: 4, icon: null, name: !isNil(comicBookDetailData) && !isEmpty(comicBookDetailData) ? ( Downloads ) : ( "Downloads" ), content: !isNil(comicBookDetailData) && !isEmpty(comicBookDetailData) && ( ), }, ]; // Tabs const MetadataTabGroup = () => { return ( <> {tabGroup.map(({ id, content }) => { return active === id ? content : null; })} ); }; // Determine which cover image to use: // 1. from the locally imported or // 2. from the CV-scraped version let imagePath = ""; let comicBookTitle = ""; if (!isNil(comicBookDetailData.rawFileDetails)) { const encodedFilePath = encodeURI( `${LIBRARY_SERVICE_HOST}/${comicBookDetailData.rawFileDetails.cover.filePath}`, ); 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; } return (
{!isNil(comicBookDetailData) && !isEmpty(comicBookDetailData) && ( <>

{comicBookTitle}

{/* action dropdown */}
{/* raw file details */}
{!isNil(comicBookDetailData.rawFileDetails) && ( <> )} {/* comic vine scraped metadata */} {!isNil(comicBookDetailData.sourcedMetadata.comicvine) && ( )}
{isComicBookMetadataAvailable ? : null} setVisible(false)} title={"Comic Vine Search Matches"} width={"600px"} > {slidingPanelContentId !== "" && contentForSlidingPanel[slidingPanelContentId].content()} )}
); };