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 ` ); 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
{data?.data.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;