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

{/* {allImportJobResults.map((jobResult, id) => { return ( ); })}
Time Started Session Id Imported Failed
{format( new Date(jobResult.earliestTimestamp), "EEEE, hh:mma, do LLLL Y", )} {jobResult.sessionId} {jobResult.completedJobs} {jobResult.failedJobs}
*/}
); }; export default Import;