import React from 'react'; import useFilesList from '@/hooks/useFilesList'; import Link from 'next/link'; import { Loader2, AlertCircle, Download, Box, Brain } from 'lucide-react'; import { openMergeLoRAsModal } from './MergeLoRAsModal'; import { getFilename, getFoldername } from '@/utils/basic'; export default function FilesWidget({ jobID, jobName }: { jobID: string; jobName: string }) { const { files, status, refreshFiles } = useFilesList(jobID, 5000); const cleanSize = (size: number) => { if (size < 1024) { return `${size} B`; } else if (size < 1024 * 1024) { return `${(size / 1024).toFixed(1)} KB`; } else if (size < 1024 * 1024 * 1024) { return `${(size / (1024 * 1024)).toFixed(1)} MB`; } else { return `${(size / (1024 * 1024 * 1024)).toFixed(1)} GB`; } }; return (

Checkpoints

{files.length}
{files.length > 0 && ( { const outputName = `${jobName}_merged`; openMergeLoRAsModal( getFoldername(files[0].path), outputName, files.map(f => ({ path: f.path })), () => { refreshFiles(); }, ); }} > merge )}
{status === 'loading' && (
)} {status === 'error' && (
Error loading checkpoints
)} {['success', 'refreshing'].includes(status) && (
{files.map((file, index) => { const fileName = getFilename(file.path); const nameWithoutExt = fileName.replace('.safetensors', ''); return (
{nameWithoutExt}
.safetensors
{cleanSize(file.size)}
); })}
)} {['success', 'refreshing'].includes(status) && files.length === 0 && (
No checkpoints available
)}
); }