import { useState } from 'react' import { useTranslation } from 'react-i18next' import { FileJson, FileSpreadsheet, FileText, Download, Eye } from 'lucide-react' import { Card, CardContent } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { dataApi } from '@/lib/api' import { formatFileSize, formatDateTime } from '@/lib/utils' import { DataPreviewDialog } from './preview/DataPreviewDialog' import type { DataFile } from '@/types/crawler' interface FileCardProps { file: DataFile } const fileIcons: Record = { json: FileJson, csv: FileSpreadsheet, xlsx: FileSpreadsheet, xls: FileSpreadsheet, } const fileStyles: Record = { json: { icon: 'text-cyber-neon-yellow', border: 'hover:border-cyber-neon-yellow/50', badge: 'border-cyber-neon-yellow/30 bg-cyber-neon-yellow/10 text-cyber-neon-yellow' }, csv: { icon: 'text-cyber-neon-green', border: 'hover:border-cyber-neon-green/50', badge: 'border-cyber-neon-green/30 bg-cyber-neon-green/10 text-cyber-neon-green' }, xlsx: { icon: 'text-cyber-neon-cyan', border: 'hover:border-cyber-neon-cyan/50', badge: 'border-cyber-neon-cyan/30 bg-cyber-neon-cyan/10 text-cyber-neon-cyan' }, xls: { icon: 'text-cyber-neon-cyan', border: 'hover:border-cyber-neon-cyan/50', badge: 'border-cyber-neon-cyan/30 bg-cyber-neon-cyan/10 text-cyber-neon-cyan' }, } export function FileCard({ file }: FileCardProps) { const { t } = useTranslation('data') const [previewOpen, setPreviewOpen] = useState(false) const Icon = fileIcons[file.type] || FileText const styles = fileStyles[file.type] || { icon: 'text-cyber-text-muted', border: 'hover:border-cyber-neon-cyan/50', badge: 'border-cyber-border-DEFAULT bg-cyber-bg-tertiary text-cyber-text-secondary' } // 检查是否支持预览 const isPreviewable = ['json', 'csv', 'xlsx', 'xls'].includes(file.type.toLowerCase()) const handleDownload = () => { const url = dataApi.getDownloadUrl(file.path) window.open(url, '_blank') } return ( <> {/* Scan effect overlay */}

{file.name}

{formatFileSize(file.size)} {file.record_count !== null && ( | {t('file.entries', { count: file.record_count })} )}

{formatDateTime(file.modified_at)}

.{file.type.toUpperCase()}
{isPreviewable && ( )}
{/* 预览对话框 */} {isPreviewable && ( )} ) }