import { useEffect, useMemo, useState } from 'react'; import { Search, X } from 'lucide-react'; import { Breadcrumb, Button, Input, RiskAction, Select, Table, Tag, type TableColumn } from '@/components/ui'; import { adminApi, type SmsTemplateAudit } from '@/api/adminApi'; import { formatDateTime } from '@/utils/dateTime'; const auditStatusLabelMap: Record = { pending: '待审核', approved: '已通过', rejected: '已驳回', draft: '草稿', }; const statusOptions = [ { label: '全部状态', value: 'all' }, { label: '待审核', value: 'pending' }, { label: '已通过', value: 'approved' }, { label: '已驳回', value: 'rejected' }, ]; export function AdminTemplateAuditPage() { const [audits, setAudits] = useState([]); const [keyword, setKeyword] = useState(''); const [status, setStatus] = useState('all'); useEffect(() => { adminApi.listTemplateAudits({ keyword, status }) .then(setAudits) .catch(() => setAudits([])); }, [keyword, status]); async function rejectTemplate(id: string) { const updated = await adminApi.rejectTemplate(id); setAudits((items) => items.map((item) => (item.id === id ? updated : item))); } const columns = useMemo>>( () => [ { key: 'customer', title: '客户', render: (record) => record.tenant?.name ?? record.tenantId }, { key: 'application', title: '短信应用', render: (record) => record.application?.name ?? record.applicationId }, { key: 'content', title: '短信模板内容', render: (record) => record.content }, { key: 'submittedAt', title: '提交时间', render: (record) => formatDateTime(record.createdAt) }, { key: 'status', title: '状态', render: (record) => ( {auditStatusLabelMap[record.auditStatus] ?? record.auditStatus} ), }, { key: 'actions', title: '操作', align: 'right', render: (record) => (
adminApi.listTemplateAudits({ keyword, status }).then(setAudits)} targetId={record.id} targetType="template" />
), }, ], [keyword, status], ); const templateAudits = audits; return (
setKeyword(event.target.value)} placeholder="搜索客户、应用或模板内容" value={keyword} />