import React, { ReactElement, useCallback, useEffect } from "react";
import "react-loader-spinner/dist/loader/css/react-spinner-loader.css";
import { format } from "date-fns";
import Loader from "react-loader-spinner";
import { isEmpty, isNil, isUndefined } from "lodash";
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { useStore } from "../../store";
import { useShallow } from "zustand/react/shallow";
import axios from "axios";
interface IProps {
matches?: unknown;
fetchComicMetadata?: any;
path: string;
covers?: any;
}
/**
* Component to facilitate the import of comics to the ThreeTwo library
*
* @param x - The first input number
* @param y - The second input number
* @returns The arithmetic mean of `x` and `y`
*
* @beta
*/
export const Import = (props: IProps): ReactElement => {
const queryClient = useQueryClient();
const { importJobQueue, socketIOInstance } = useStore(
useShallow((state) => ({
importJobQueue: state.importJobQueue,
socketIOInstance: state.socketIOInstance,
})),
);
const sessionId = localStorage.getItem("sessionId");
const { mutate: initiateImport } = useMutation({
mutationFn: async () =>
await axios.request({
url: `http://localhost:3000/api/library/newImport`,
method: "POST",
data: { sessionId },
}),
});
const { data, isError, isLoading } = useQuery({
queryKey: ["allImportJobResults"],
queryFn: async () =>
await axios({
method: "GET",
url: "http://localhost:3000/api/jobqueue/getJobResultStatistics",
}),
});
const toggleQueue = (queueAction: string, queueStatus: string) => {
socketIOInstance.emit(
"call",
"socket.setQueueStatus",
{
queueAction,
queueStatus,
},
(data) => console.log(data),
);
};
/**
* Method to render import job queue pause/resume controls on the UI
*
* @param status The `string` status (either `"pause"` or `"resume"`)
* @returns ReactElement A `` that toggles queue status
* @remarks Sets the global `importJobQueue.status` state upon toggling
*/
const renderQueueControls = (status: string): ReactElement | null => {
switch (status) {
case "running":
return (
);
case "paused":
return (
);
case "drained":
return null;
default:
return null;
}
};
return (
Import
Import comics into the ThreeTwo library.
Importing will add comics identified from the mapped folder into
ThreeTwo's database.
Metadata from ComicInfo.xml, if present, will also be extracted.
This process could take a while, if you have a lot of comics, or
are importing over a network connection.
{importJobQueue.status === "drained" ||
(importJobQueue.status === undefined && (
))}
{/* Activity */}
{(importJobQueue.status === "running" ||
importJobQueue.status === "paused") && (
<>
Import Activity
{/* Successful import counts */}
-
{importJobQueue.successfulJobCount}
-
imported
{/* Failed job counts */}
-
{importJobQueue.failedJobCount}
-
failed
- {renderQueueControls(importJobQueue.status)}
Imported: {importJobQueue.mostRecentImport}
>
)}
{/* Past imports */}
{!isLoading && !isEmpty(data?.data) && (
Past Imports
|
Time Started
|
Session Id
|
Imported
|
Failed
|
{data?.data.map((jobResult, id) => {
return (
|
{format(
new Date(jobResult.earliestTimestamp),
"EEEE, hh:mma, do LLLL Y",
)}
|
{jobResult.sessionId}
|
{jobResult.completedJobs}
|
{jobResult.failedJobs}
|
);
})}
)}
);
};
export default Import;