import { useEffect, useMemo, useState } from 'react'; import { FilePenLine, Plus, Search, Trash2, Upload } from 'lucide-react'; import { Button, Input, Modal, Select, Tag } from '@/components/ui'; import { clientApi, type ClientSmsApplication, type ClientSmsSignature } from '@/api/adminApi'; const statusTone: Record = { approved: 'success', pending: 'info', rejected: 'danger', draft: 'warning', }; const statusLabel: Record = { approved: '已通过', pending: '审核中', rejected: '已驳回', draft: '草稿', disabled: '已禁用', }; export function ClientSignaturesPage() { const [applications, setApplications] = useState([]); const [signatures, setSignatures] = useState([]); const [keyword, setKeyword] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(true); const [modalOpen, setModalOpen] = useState(false); const [applicationId, setApplicationId] = useState(''); const [name, setName] = useState(''); const [purpose, setPurpose] = useState(''); const [file, setFile] = useState(null); function loadData() { setLoading(true); Promise.all([clientApi.listApplications(), clientApi.listSignatures()]) .then(([applicationItems, signatureItems]) => { setApplications(applicationItems.filter((item) => item.status === 'active')); setSignatures(signatureItems.filter((item) => item.auditStatus !== 'disabled' && item.auditStatus !== 'deleted')); setError(''); }) .catch((reason: Error) => setError(reason.message || '签名数据加载失败')) .finally(() => setLoading(false)); } useEffect(() => { loadData(); }, []); const filteredSignatures = useMemo(() => signatures.filter((item) => ( !keyword || [item.name, item.purpose, item.applicationId].join(' ').includes(keyword) )), [keyword, signatures]); async function createSignature() { try { const signature = await clientApi.createSignature({ applicationId: applicationId || undefined, name, purpose }); if (file) { const fileObject = await clientApi.uploadFileObject(file, { purpose: 'signature_material', prefix: `signature-materials/${signature.id}`, }); await clientApi.createSignatureMaterial(signature.id, { fileObjectId: fileObject.id, materialType: file.type.startsWith('image/') ? 'image' : 'file', title: file.name, }); } await clientApi.submitSignature(signature.id); setModalOpen(false); setApplicationId(''); setName(''); setPurpose(''); setFile(null); loadData(); } catch (reason) { setError(reason instanceof Error ? reason.message : '签名提交失败'); } } function disableSignature(id: string) { clientApi.changeSignatureStatus(id, 'disabled') .then(loadData) .catch((reason: Error) => setError(reason.message || '签名禁用失败')); } return (

签名与报备材料

setKeyword(event.target.value)} placeholder="搜索签名名称、用途或应用" prefix={} value={keyword} />
{loading ?

正在加载签名...

: null} {error ?

{error}

: null}
{filteredSignatures.map((signature) => (
签名名称 {signature.name}
用途 {signature.purpose ?? '-'}
审核状态 {statusLabel[signature.auditStatus] ?? signature.auditStatus}
材料 {signature.materials?.length ?? 0} 份
))}
{!loading && !error && filteredSignatures.length === 0 ?

暂无签名记录。

: null} )} onClose={() => setModalOpen(false)} open={modalOpen} size="xl" title="添加签名" >
setName(event.target.value)} placeholder="请输入短信签名,如【某某科技】" value={name} /> setPurpose(event.target.value)} placeholder="请输入签名用途" value={purpose} />
); }