import { useEffect, useState } from "react"; import { ByteSize } from "~/client/components/bytes-size"; import { Card } from "~/client/components/ui/card"; import { Progress } from "~/client/components/ui/progress"; import { type RestoreProgressEvent, useServerEvents } from "~/client/hooks/use-server-events"; import { formatBytes } from "~/utils/format-bytes"; import { formatDuration } from "~/utils/utils"; type Props = { repositoryId: string; snapshotId: string; }; export const RestoreProgress = ({ repositoryId, snapshotId }: Props) => { const { addEventListener } = useServerEvents(); const [progress, setProgress] = useState(null); useEffect(() => { const abortController = new AbortController(); addEventListener( "restore:progress", (progressData) => { if (progressData.repositoryId === repositoryId && progressData.snapshotId === snapshotId) { setProgress(progressData); } }, { signal: abortController.signal }, ); addEventListener( "restore:completed", (completedData) => { if (completedData.repositoryId === repositoryId && completedData.snapshotId === snapshotId) { setProgress(null); } }, { signal: abortController.signal }, ); return () => abortController.abort(); }, [addEventListener, repositoryId, snapshotId]); if (!progress) { return (
Restore in progress
); } const percentDone = Math.round(progress.percent_done * 100); const speed = progress.seconds_elapsed > 0 ? formatBytes(progress.bytes_restored / progress.seconds_elapsed) : null; return (
Restore in progress
{percentDone}%

Files

{progress.files_restored.toLocaleString()}  /  {progress.total_files.toLocaleString()}

Data

 / 

Elapsed

{formatDuration(progress.seconds_elapsed)}

Speed

{speed ? `${speed.text} ${speed.unit}/s` : "Calculating..."}

); };