diff --git a/src/client/components/AcquisitionPanel.tsx b/src/client/components/ComicDetail/AcquisitionPanel.tsx
similarity index 98%
rename from src/client/components/AcquisitionPanel.tsx
rename to src/client/components/ComicDetail/AcquisitionPanel.tsx
index 4a95a88..8ff55fb 100644
--- a/src/client/components/AcquisitionPanel.tsx
+++ b/src/client/components/ComicDetail/AcquisitionPanel.tsx
@@ -9,12 +9,12 @@ import {
search,
downloadAirDCPPItem,
getBundlesForComic,
-} from "../actions/airdcpp.actions";
+} from "../../actions/airdcpp.actions";
import { useDispatch, useSelector } from "react-redux";
import { RootState, SearchInstance } from "threetwo-ui-typings";
import ellipsize from "ellipsize";
import { isEmpty, isNil, map } from "lodash";
-import { AirDCPPSocketContext } from "../context/AirDCPPSocket";
+import { AirDCPPSocketContext } from "../../context/AirDCPPSocket";
interface IAcquisitionPanelProps {
comicBookMetadata: any;
}
diff --git a/src/client/components/ComicDetail/ComicVineDetails.tsx b/src/client/components/ComicDetail/ComicVineDetails.tsx
new file mode 100644
index 0000000..c5461df
--- /dev/null
+++ b/src/client/components/ComicDetail/ComicVineDetails.tsx
@@ -0,0 +1,74 @@
+import React, { ReactElement } from "react";
+import PropTypes from "prop-types";
+import { detectIssueTypes } from "../../shared/utils/tradepaperback.utils";
+import dayjs from "dayjs";
+import { isUndefined } from "lodash";
+
+export const ComicVineDetails = (props): ReactElement => {
+ const { data, updatedAt } = props;
+ return (
+
+
+ - ComicVine Metadata
+ -
+ Last scraped on {dayjs(updatedAt).format("MMM D YYYY [at] h:mm a")}
+
+ -
+
{data.name}
+
+ {data.issue_number && (
+ -
+
+ Issue Number
+ {data.issue_number}
+
+
+ )}
+ -
+
+ {!isUndefined(
+ detectIssueTypes(data.volumeInformation.description),
+ ) ? (
+
+
+ Detected Type
+
+ {
+ detectIssueTypes(data.volumeInformation.description)
+ .displayName
+ }
+
+
+
+ ) : (
+
+
+ Type
+ {data.resource_type}
+
+
+ )}
+
+
+ ComicVine Issue ID
+ {data.id}
+
+
+
+
+
+
+ );
+};
+
+export default ComicVineDetails;
+
+ComicVineDetails.propTypes = {
+ updatedAt: PropTypes.string,
+ data: PropTypes.shape({
+ name: PropTypes.string,
+ number: PropTypes.string,
+ resource_type: PropTypes.string,
+ id: PropTypes.number,
+ }),
+};
diff --git a/src/client/components/DownloadsPanel.tsx b/src/client/components/ComicDetail/DownloadsPanel.tsx
similarity index 97%
rename from src/client/components/DownloadsPanel.tsx
rename to src/client/components/ComicDetail/DownloadsPanel.tsx
index aa06022..e0979de 100644
--- a/src/client/components/DownloadsPanel.tsx
+++ b/src/client/components/ComicDetail/DownloadsPanel.tsx
@@ -2,14 +2,14 @@ import React, { useEffect, useContext, ReactElement } from "react";
import {
getDownloadProgress,
getBundlesForComic,
-} from "../actions/airdcpp.actions";
+} from "../../actions/airdcpp.actions";
import { useDispatch, useSelector } from "react-redux";
import { RootState } from "threetwo-ui-typings";
import { isEmpty, isNil, map } from "lodash";
import prettyBytes from "pretty-bytes";
import dayjs from "dayjs";
import ellipsize from "ellipsize";
-import { AirDCPPSocketContext } from "../context/AirDCPPSocket";
+import { AirDCPPSocketContext } from "../../context/AirDCPPSocket";
interface IDownloadsPanelProps {
data: any;
diff --git a/src/client/components/ComicDetail/RawFileDetails.tsx b/src/client/components/ComicDetail/RawFileDetails.tsx
new file mode 100644
index 0000000..4586a8b
--- /dev/null
+++ b/src/client/components/ComicDetail/RawFileDetails.tsx
@@ -0,0 +1,52 @@
+import React, { ReactElement } from "react";
+import PropTypes from "prop-types";
+import prettyBytes from "pretty-bytes";
+
+export const RawFileDetails = (props): ReactElement => {
+ const { data } = props;
+ return (
+
+
+ - Raw File Details
+ -
+ {data.containedIn + "/" + data.name + data.extension}
+
+ -
+
+
+
+ Size
+
+ {prettyBytes(data.fileSize)}
+
+
+
+
+
+ Extension
+
+ {data.extension}
+
+
+
+
+
+
+
+ );
+};
+
+export default RawFileDetails;
+
+RawFileDetails.propTypes = {
+ data: PropTypes.shape({
+ containedIn: PropTypes.string,
+ name: PropTypes.string,
+ fileSize: PropTypes.number,
+ path: PropTypes.string,
+ extension: PropTypes.string,
+ cover: PropTypes.shape({
+ filePath: PropTypes.string,
+ }),
+ }),
+};
diff --git a/src/client/components/ComicDetail/Tabs/VolumeInformation.tsx b/src/client/components/ComicDetail/Tabs/VolumeInformation.tsx
new file mode 100644
index 0000000..d3290e4
--- /dev/null
+++ b/src/client/components/ComicDetail/Tabs/VolumeInformation.tsx
@@ -0,0 +1,58 @@
+import React, { ReactElement } from "react";
+
+export const VolumeInformation = (props): ReactElement => {
+ const { data } = props;
+ const createDescriptionMarkup = (html) => {
+ return { __html: html };
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ -
+ Is a part of{" "}
+
+ {data.sourcedMetadata.comicvine.volumeInformation.name}
+
+
+ -
+ Published by
+
+ {" "}
+ {
+ data.sourcedMetadata.comicvine.volumeInformation.publisher
+ .name
+ }
+
+
+ -
+ Total issues in this volume:
+ {data.sourcedMetadata.comicvine.volumeInformation.count_of_issues}
+
+
+
+
+
+
+ );
+};
+
+export default VolumeInformation;