DocuChat / frontend /src /components /FileList.tsx
Prateet Mishra
Fix Railway deployment: add built frontend/dist, fix railway.toml
0e78e4d
Raw
History Blame Contribute Delete
2.55 kB
import { FileText, FileSpreadsheet, FileJson, Check, Loader, AlertCircle } from 'lucide-react'
import type { UploadedFile } from '../types'
interface FileListProps {
files: UploadedFile[]
}
function getFileIcon(type: string) {
switch (type) {
case 'csv':
case 'xlsx':
return <FileSpreadsheet size={18} />
case 'json':
return <FileJson size={18} />
default:
return <FileText size={18} />
}
}
function formatSize(bytes: number): string {
if (bytes < 1024) return `${bytes} B`
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
}
export function FileList({ files }: FileListProps) {
if (files.length === 0) return null
return (
<div className="file-list">
<h3 className="file-list__title">Uploaded Files</h3>
<div className="file-list__items">
{files.map((file, idx) => (
<div key={idx} className={`file-item file-item--${file.status}`}>
<div className="file-item__icon">{getFileIcon(file.type)}</div>
<div className="file-item__info">
<span className="file-item__name" title={file.name}>
{file.name}
</span>
<span className="file-item__meta">
{formatSize(file.size)}
{file.status === 'done' && ` · ${file.documents} pages`}
</span>
</div>
<div className="file-item__status">
{file.status === 'uploading' && (
<div className="file-item__progress-ring">
<Loader size={18} className="spin" />
<span className="file-item__percent">{file.progress}%</span>
</div>
)}
{file.status === 'processing' && <Loader size={18} className="spin" />}
{file.status === 'done' && <Check size={18} className="file-item__check" />}
{file.status === 'error' && <AlertCircle size={18} className="file-item__error-icon" />}
</div>
{file.status === 'uploading' && (
<div className="file-item__progress-bar">
<div
className="file-item__progress-fill"
style={{ width: `${file.progress}%` }}
/>
</div>
)}
{file.status === 'error' && file.error && (
<div className="file-item__error">{file.error}</div>
)}
</div>
))}
</div>
</div>
)
}