import React, { useCallback, useEffect, useState } from 'react'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import IconButton from '@mui/material/IconButton'; import DeleteIcon from '@mui/icons-material/Delete'; import { listAttachments, deleteAttachment } from '../../api/upload.js'; import { showSnack } from '../snack.jsx'; import ConfirmDialog from '../ConfirmDialog.jsx'; /** 附件管理:列表/删除(迁移自 v1 附件卡片) */ export default function Uploads() { const [list, setList] = useState(null); const [confirm, setConfirm] = useState(null); const load = useCallback(() => { listAttachments() .then((rows) => setList(rows || [])) .catch((e) => showSnack(e.message, 'error')); }, []); useEffect(() => { load(); }, [load]); const doDelete = async () => { if (!confirm) return; try { await deleteAttachment(confirm.id); showSnack('已删除'); setConfirm(null); load(); } catch (e) { showSnack(e.message, 'error'); } }; return ( 附件管理 ID 文件名 原始名 大小 类型 上传者 时间 操作 {list === null ? ( 加载中... ) : list.length === 0 ? ( 暂无附件 ) : list.map((f) => ( {f.id} {f.filename} {f.original_name} {((f.size || 0) / 1024).toFixed(0)} KB {f.mime_type || '-'} UID {f.user_id} {f.created_at} setConfirm({ id: f.id, label: f.filename })}> ))}
setConfirm(null)} onConfirm={doDelete} confirmText="确认删除" />
); }