import React, { ReactElement, useCallback, useEffect } from "react";
import {
fetchComicBookMetadata,
getImportJobResultStatistics,
setQueueControl,
} from "../../actions/fileops.actions";
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 } 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;
}
/**
* Returns the average of two numbers.
*
* @remarks
* This method is part of the {@link core-library#Statistics | Statistics subsystem}.
*
* @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 { importJobQueue, socketIOInstance } = useStore(
useShallow((state) => ({
importJobQueue: state.importJobQueue,
socketIOInstance: state.socketIOInstance,
})),
);
// const libraryQueueImportStatus = useSelector(
// (state: RootState) => state.fileOps.LSQueueImportStatus,
// );
//
// const allImportJobResults = useSelector(
// (state: RootState) => state.fileOps.importJobStatistics,
// );
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 },
}),
});
// 1a. Act on each comic issue successfully imported/failed, as indicated
// by the LS_COVER_EXTRACTED/LS_COVER_EXTRACTION_FAILED events
socketIOInstance.on("LS_COVER_EXTRACTED", (data) => {
const { completedJobCount, importResult } = data;
importJobQueue.setJobCount("successful", completedJobCount);
importJobQueue.setMostRecentImport(importResult.rawFileDetails.name);
});
socketIOInstance.on("LS_COVER_EXTRACTION_FAILED", (data) => {
const { failedJobCount } = data;
importJobQueue.setJobCount("failed", failedJobCount);
});
// 1b. Clear the localStorage sessionId upon receiving the
// LS_IMPORT_QUEUE_DRAINED event
socketIOInstance.on("LS_IMPORT_QUEUE_DRAINED", (data) => {
localStorage.removeItem("sessionId");
});
const toggleQueue = useCallback(
(queueAction: string, queueStatus: string) => {
// dispatch(setQueueControl(queueAction, queueStatus));
socketIOInstance.emit("call", "socket.setQueueStatus", {
queueAction,
queueStatus,
});
},
[],
);
useEffect(() => {
// dispatch(getImportJobResultStatistics());
}, []);
const libraryQueueImportStatus = undefined;
const renderQueueControls = (status: string): ReactElement | null => {
switch (status) {
case "running":
return (
);
case "paused":
return (
);
case "drained":
return null;
default:
return null;
}
};
return (
Import Comics
Import Comics
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.
<>
| Completed Jobs |
Failed Jobs |
Queue Controls |
Queue Status |
|
{importJobQueue.successfulJobCount > 0 && (
{importJobQueue.successfulJobCount}
)}
|
{importJobQueue.failedJobCount > 0 && (
{importJobQueue.failedJobCount}
)}
|
{/* {renderQueueControls(libraryQueueImportStatus)} |
{libraryQueueImportStatus !== undefined ? (
{libraryQueueImportStatus}
) : null}
| */}
Imported{" "}
{importJobQueue.mostRecentImport}
>
{/* Past imports */}
Past Imports
{/*
| Time Started |
Session Id |
Imported |
Failed |
{allImportJobResults.map((jobResult, id) => {
return (
|
{format(
new Date(jobResult.earliestTimestamp),
"EEEE, hh:mma, do LLLL Y",
)}
|
{jobResult.sessionId}
|
{jobResult.completedJobs}
|
{jobResult.failedJobs}
|
);
})}
*/}
);
};
export default Import;