diff --git a/gameyfin/src/main/frontend/components/general/ScanProgressPopover.tsx b/gameyfin/src/main/frontend/components/general/ScanProgressPopover.tsx index 42e80a9..3804475 100644 --- a/gameyfin/src/main/frontend/components/general/ScanProgressPopover.tsx +++ b/gameyfin/src/main/frontend/components/general/ScanProgressPopover.tsx @@ -10,25 +10,42 @@ import { Spinner } from "@heroui/react"; import {useSnapshot} from "valtio/react"; -import {clear, scanState} from "Frontend/state/ScanState"; +import {scanState} from "Frontend/state/ScanState"; import LibraryScanProgress from "Frontend/generated/de/grimsi/gameyfin/libraries/dto/LibraryScanProgress"; import {libraryState} from "Frontend/state/LibraryState"; import {Target} from "@phosphor-icons/react"; -import {timeUntil} from "Frontend/util/utils"; +import {timeBetween, timeUntil} from "Frontend/util/utils"; import LibraryScanStatus from "Frontend/generated/de/grimsi/gameyfin/libraries/dto/LibraryScanStatus"; +import {useEffect, useState} from "react"; export default function ScanProgressPopover() { const libraries = useSnapshot(libraryState).state; const scans = useSnapshot(scanState).sortedByStartTime as LibraryScanProgress[]; const scanInProgress = useSnapshot(scanState).isScanning; + // Add state to track current time and force re-renders + const [currentTime, setCurrentTime] = useState(Date.now()); + + // Set up an interval to update the time every second + useEffect(() => { + const intervalId = setInterval(() => { + setCurrentTime(Date.now()); + }, 1000); + + // Clean up the interval when component unmounts + return () => clearInterval(intervalId); + }, []); + return ( @@ -36,56 +53,56 @@ export default function ScanProgressPopover() {
{scans.length === 0 ?

- No scans in progress. + No scans in progress or in history.

: -
- - Clear - - - {scans.map((scan, index) => -
-
-

Scan for library  - - {libraries[scan.libraryId].name} - -

- {scan.finishedAt ? -

Finished {timeUntil(scan.finishedAt)}

: -

Started {timeUntil(scan.startedAt)}

- } -
- {scan.status === LibraryScanStatus.IN_PROGRESS ? - scan.currentStep.current && scan.currentStep.total ? -
-

- {`${scan.currentStep.description} (${scan.currentStep.current} / ${scan.currentStep.total})`} -

- -
: -
-

{scan.currentStep.description}

- -
- : -

- {scan.result?.new} new /  - {scan.result?.removed} removed /  - {scan.result?.unmatched} unmatched + + {scans.map((scan, index) => +

+
+

Scan for library  + + {libraries[scan.libraryId].name} + +

+ {scan.finishedAt ? +

+ Finished {timeUntil(scan.finishedAt)} +

: +

+ Started {timeUntil(scan.startedAt)}

} - {scans.length > 1 && index < (scans.length - 1) && }
- )} - -
+ {scan.status === LibraryScanStatus.IN_PROGRESS ? + scan.currentStep.current && scan.currentStep.total ? +
+

+ {`${scan.currentStep.description} (${scan.currentStep.current}/${scan.currentStep.total})`} +

+ +
: +
+

{scan.currentStep.description}

+ +
+ : +

+ {scan.result?.new} new /  + {scan.result?.removed} removed /  + {scan.result?.unmatched} unmatched  + (in {timeBetween(scan.startedAt, scan.finishedAt!)}) +

+ } + {scans.length > 1 && index < (scans.length - 1) && } +
+ )} +
}
diff --git a/gameyfin/src/main/frontend/state/ScanState.ts b/gameyfin/src/main/frontend/state/ScanState.ts index d4e3c6d..e56ce2b 100644 --- a/gameyfin/src/main/frontend/state/ScanState.ts +++ b/gameyfin/src/main/frontend/state/ScanState.ts @@ -44,10 +44,6 @@ export function initializeScanState() { }); } -export function clear() { - scanState.state = {}; -} - export function handleLibraryDeletion(libraryId: number) { for (const scanId in scanState.state) { if (scanState.state[scanId].libraryId === libraryId) {