import { Button, Divider, Link, Popover, PopoverContent, PopoverTrigger, Progress, ScrollShadow, Spinner } from "@heroui/react"; import {useSnapshot} from "valtio/react"; import {scanState} from "Frontend/state/ScanState"; import {libraryState} from "Frontend/state/LibraryState"; import {TargetIcon, WarningIcon} from "@phosphor-icons/react"; import {timeBetween, timeUntil, toTitleCase} from "Frontend/util/utils"; import LibraryScanStatus from "Frontend/generated/org/gameyfin/app/libraries/dto/LibraryScanStatus"; import {useEffect, useState} from "react"; export default function ScanProgressPopover() { const libraries = useSnapshot(libraryState).state; const scans = useSnapshot(scanState).sortedByStartTime; 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 (
{scans.length === 0 ?

No scans in progress or in history.

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

{toTitleCase(scan.type)} 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.status === LibraryScanStatus.COMPLETED &&

{scan.result?.new} new /  {(scan as any).result?.updated != null && `${(scan as any).result.updated} updated / `} {scan.result?.removed} removed /  {scan.result?.unmatched} unmatched  (in {timeBetween(scan.startedAt, scan.finishedAt!)})

} {scan.status === LibraryScanStatus.FAILED &&

Scan failed (check logs for details)

} {scans.length > 1 && index < (scans.length - 1) && }
)}
}
); }