From ec52906ecaee341acd47a5e0475cdef58288711d Mon Sep 17 00:00:00 2001 From: Rishi Ghan Date: Thu, 5 Mar 2026 11:48:43 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A8=20Fixed=20timestamps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/components/Import/Import.tsx | 62 +++++++------------------ 1 file changed, 16 insertions(+), 46 deletions(-) diff --git a/src/client/components/Import/Import.tsx b/src/client/components/Import/Import.tsx index b5c48a7..9025e10 100644 --- a/src/client/components/Import/Import.tsx +++ b/src/client/components/Import/Import.tsx @@ -11,24 +11,15 @@ import { useStartIncrementalImportMutation } from "../../graphql/generated"; -interface IProps { - matches?: unknown; - fetchComicMetadata?: any; +interface ImportProps { 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 + * Import component for adding comics to the ThreeTwo library. + * Provides preview statistics, smart import, and queue management. */ - -export const Import = (props: IProps): ReactElement => { +export const Import = (props: ImportProps): ReactElement => { const queryClient = useQueryClient(); const [socketReconnectTrigger, setSocketReconnectTrigger] = useState(0); const [showPreview, setShowPreview] = useState(false); @@ -40,7 +31,6 @@ export const Import = (props: IProps): ReactElement => { })), ); - // Query to get import statistics (preview) const { data: importStats, isLoading: isLoadingStats, @@ -53,7 +43,6 @@ export const Import = (props: IProps): ReactElement => { } ); - // Mutation for incremental import (smart import) const { mutate: startIncrementalImport, isPending: isStartingImport } = useStartIncrementalImportMutation({ onSuccess: (data) => { if (data.startIncrementalImport.success) { @@ -76,19 +65,10 @@ export const Import = (props: IProps): ReactElement => { const { data, isError, isLoading, refetch } = useGetJobResultStatisticsQuery(); - // Ensure socket connection is established and listen for import completion useEffect(() => { const socket = getSocket("/"); - - // Listen for import queue drained event to refresh the table - const handleQueueDrained = () => { - refetch(); - }; - - // Listen for individual import completions to refresh the table - const handleCoverExtracted = () => { - refetch(); - }; + const handleQueueDrained = () => refetch(); + const handleCoverExtracted = () => refetch(); socket.on("LS_IMPORT_QUEUE_DRAINED", handleQueueDrained); socket.on("LS_COVER_EXTRACTED", handleCoverExtracted); @@ -99,6 +79,9 @@ export const Import = (props: IProps): ReactElement => { }; }, [getSocket, refetch, socketReconnectTrigger]); + /** + * Toggles import queue pause/resume state + */ const toggleQueue = (queueAction: string, queueStatus: string) => { const socket = getSocket("/"); socket.emit( @@ -116,18 +99,16 @@ export const Import = (props: IProps): ReactElement => { refetchStats(); }; + /** + * Starts smart import, resetting session if queue was drained + */ const handleStartSmartImport = () => { - // Clear old sessionId when starting a new import after queue is drained if (importJobQueue.status === "drained") { localStorage.removeItem("sessionId"); - // Disconnect and reconnect socket to get new sessionId disconnectSocket("/"); - // Wait for socket to reconnect and get new sessionId before starting import setTimeout(() => { getSocket("/"); - // Trigger useEffect to re-attach event listeners setSocketReconnectTrigger(prev => prev + 1); - // Wait a bit more for sessionInitialized event to fire setTimeout(() => { const sessionId = localStorage.getItem("sessionId") || ""; startIncrementalImport({ sessionId }); @@ -140,11 +121,7 @@ export const Import = (props: IProps): ReactElement => { }; /** - * Method to render import job queue pause/resume controls on the UI - * - * @param status The `string` status (either `"pause"` or `"resume"`) - * @returns ReactElement A ` )} - - {/* Preview Statistics */} + {/* Import Preview Panel */} {showPreview && !isLoadingStats && importStats?.getImportStatistics && (
@@ -362,7 +337,6 @@ export const Import = (props: IProps): ReactElement => {
)} - {/* Loading state for preview */} {showPreview && isLoadingStats && (
@@ -372,7 +346,6 @@ export const Import = (props: IProps): ReactElement => {
)} - {/* Activity */} {(importJobQueue.status === "running" || importJobQueue.status === "paused") && ( <> @@ -384,7 +357,6 @@ export const Import = (props: IProps): ReactElement => {
- {/* Successful import counts */}
{importJobQueue.successfulJobCount} @@ -393,7 +365,6 @@ export const Import = (props: IProps): ReactElement => { imported
- {/* Failed job counts */}
{importJobQueue.failedJobCount} @@ -416,7 +387,6 @@ export const Import = (props: IProps): ReactElement => { )} - {/* Past imports */} {!isLoading && !isEmpty(data?.getJobResultStatistics) && (
@@ -456,9 +426,9 @@ export const Import = (props: IProps): ReactElement => { {index + 1} - {jobResult.earliestTimestamp && !isNaN(new Date(jobResult.earliestTimestamp).getTime()) + {jobResult.earliestTimestamp && !isNaN(parseInt(jobResult.earliestTimestamp)) ? format( - new Date(jobResult.earliestTimestamp), + new Date(parseInt(jobResult.earliestTimestamp)), "EEEE, hh:mma, do LLLL y", ) : "N/A"}