import { isEmpty, isNil, isUndefined, map, partialRight, pick } from "lodash"; import React, { ReactElement, useState, useCallback } from "react"; import { useParams } from "react-router"; import { analyzeLibrary } from "../../actions/comicinfo.actions"; import { useQuery, useMutation, QueryClient } from "@tanstack/react-query"; import PotentialLibraryMatches from "./PotentialLibraryMatches"; import { Card } from "../shared/Carda"; import SlidingPane from "react-sliding-pane"; import { convert } from "html-to-text"; import ellipsize from "ellipsize"; import { COMICVINE_SERVICE_URI, LIBRARY_SERVICE_BASE_URI, } from "../../constants/endpoints"; import axios from "axios"; const VolumeDetails = (props): ReactElement => { // sliding panel config const [visible, setVisible] = useState(false); const [slidingPanelContentId, setSlidingPanelContentId] = useState(""); const [matches, setMatches] = useState([]); const [storyArcsData, setStoryArcsData] = useState([]); const [active, setActive] = useState(1); // sliding panel init const contentForSlidingPanel = { potentialMatchesInLibrary: { content: () => { const ids = map(matches, partialRight(pick, "_id")); const matchIds = ids.map((id: any) => id._id); { /* return ; */ } }, }, }; // sliding panel handlers const openPotentialLibraryMatchesPanel = useCallback((potentialMatches) => { setSlidingPanelContentId("potentialMatchesInLibrary"); setMatches(potentialMatches); setVisible(true); }, []); // const analyzeIssues = useCallback((issues) => { // dispatch(analyzeLibrary(issues)); // }, []); // const { comicObjectId } = useParams<{ comicObjectId: string }>(); const { data: comicObject, isSuccess: isComicObjectFetchedSuccessfully } = useQuery({ queryFn: async () => axios({ url: `${LIBRARY_SERVICE_BASE_URI}/getComicBookById`, method: "POST", data: { id: comicObjectId, }, }), queryKey: ["comicObject"], }); // get issues for a series const { data: issuesForSeries, isSuccess, isFetching, } = useQuery({ queryFn: async () => await axios({ url: `${COMICVINE_SERVICE_URI}/getIssuesForVolume`, method: "POST", data: { volumeId: comicObject?.data?.sourcedMetadata.comicvine.volumeInformation.id, }, }), queryKey: ["issuesForSeries", comicObject?.data], enabled: !isUndefined(comicObject?.data), }); // get story arcs const useGetStoryArcs = () => { return useMutation({ mutationFn: async (comicObject) => axios({ url: `${COMICVINE_SERVICE_URI}/getResource`, method: "POST", data: { comicObject, resource: "issue", filter: `id:${comicObject?.sourcedMetadata.comicvine.id}`, }, }), onSuccess: (data) => { setStoryArcsData(data?.data.results); }, }); }; const { mutate: getStoryArcs, isIdle, isError, data, error, status, } = useGetStoryArcs(); const IssuesInVolume = () => ( <> {!isUndefined(issuesForSeries) ? (
analyzeIssues(issuesForSeries)}> Analyze Library
) : null} <> {isSuccess && issuesForSeries.data.map((issue) => { return ( <> {issue.issue_number} {!isEmpty(issue.matches) ? ( <> ) : null} ); })} ); const Issues = () => ( <>
You can add a single issue or the whole volume, and it will be added to the list of `Wanted` items.
{isSuccess && issuesForSeries?.data.map((issue) => { return (

{issue.name}

{convert(issue.description, { baseElements: { selectors: ["p"], }, })}

); })}
); // Tab content and header details const tabGroup = [ { id: 1, name: "Issues in Volume", icon: , content: , }, { id: 2, icon: ( ), name: "Characters", content:
Characters
, }, { id: 3, icon: ( ), name: "Story Arcs", content: (
{status === "pending" && <>{status}} {!isEmpty(storyArcsData) && status === "success" && ( <>
    {storyArcsData.map((storyArc) => { return (
  • {storyArc?.name}
  • ); })}
)}
), }, ]; // Tabs const MetadataTabGroup = () => { return ( <>
{tabGroup.map(({ id, content }) => { return active === id ? content : null; })} ); }; if (isComicObjectFetchedSuccessfully && !isUndefined(comicObject.data)) { const { sourcedMetadata } = comicObject.data; return ( <>

Volumes

Browse your collection of volumes.

{/* Volume cover */}
{/* Title */} {sourcedMetadata.comicvine.volumeInformation.name} {/* Comicvine Id */}
ComicVine Id {sourcedMetadata.comicvine.volumeInformation.id}
{/* Publisher */}
Publisher { sourcedMetadata.comicvine.volumeInformation.publisher .name }
{/* Deck */}
{!isEmpty( sourcedMetadata.comicvine.volumeInformation.description, ) ? ellipsize( convert( sourcedMetadata.comicvine.volumeInformation .description, { baseElements: { selectors: ["p"], }, }, ), 300, ) : null}
{/*
{JSON.stringify(issuesForVolume, undefined, 2)}
*/}
setVisible(false)} title={"Potential Matches in Library"} width={"600px"} > {slidingPanelContentId !== "" && contentForSlidingPanel[slidingPanelContentId].content()}
); } else { return <>; } }; export default VolumeDetails;