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;