feat: wire admin workflows to real APIs

This commit is contained in:
hectorzhao
2026-07-02 13:50:09 +08:00
parent f8c9b78c21
commit ab421cf8a7
42 changed files with 2596 additions and 250 deletions
+22 -4
View File
@@ -408,6 +408,7 @@ export function AdminSmsTaskProgressPage() {
const [submittedDateRange, setSubmittedDateRange] = useState<DateRangeValue>({});
const [hoveredTaskId, setHoveredTaskId] = useState<string | null>(null);
const [selectedTask, setSelectedTask] = useState<SmsTask | null>(null);
const [terminateTarget, setTerminateTarget] = useState<SmsTask | null>(null);
const enterpriseOptions = useMemo(() => {
const names = Array.from(new Set(tasks.map((item) => item.enterprise)));
@@ -443,6 +444,7 @@ export function AdminSmsTaskProgressPage() {
setTasks((current) => current.map((task) => (
task.id === taskId ? { ...task, status: 'terminated' } : task
)));
setTerminateTarget(null);
}
return (
@@ -485,7 +487,7 @@ export function AdminSmsTaskProgressPage() {
<th style={{ width: '150px' }}></th>
<th style={{ width: '190px' }}></th>
<th style={{ width: '100px' }}></th>
<th style={{ textAlign: 'right', width: '120px' }}></th>
<th style={{ textAlign: 'right', width: '170px' }}></th>
</tr>
</thead>
<tbody>
@@ -542,12 +544,11 @@ export function AdminSmsTaskProgressPage() {
<td><Tag tone={statusTones[record.status]}>{statusLabels[record.status]}</Tag></td>
<td style={{ textAlign: 'right' }}>
<div className="admin-task-actions">
<Button icon={<Eye size={15} />} iconOnly onClick={() => setSelectedTask(record)} size="sm" variant="ghost"></Button>
<Button icon={<Eye size={15} />} onClick={() => setSelectedTask(record)} size="sm" variant="ghost"></Button>
<Button
disabled={record.status !== 'sending'}
icon={<StopCircle size={15} />}
iconOnly
onClick={() => terminateTask(record.id)}
onClick={() => setTerminateTarget(record)}
size="sm"
variant="ghost"
>
@@ -577,6 +578,23 @@ export function AdminSmsTaskProgressPage() {
</div>
{selectedTask ? <TaskDetailModal onClose={() => setSelectedTask(null)} task={selectedTask} /> : null}
{terminateTarget ? (
<Modal
footer={(
<>
<Button onClick={() => setTerminateTarget(null)} variant="ghost"></Button>
<Button onClick={() => terminateTask(terminateTarget.id)} variant="danger"></Button>
</>
)}
onClose={() => setTerminateTarget(null)}
open
title="确认终止短信任务"
>
<div className="admin-confirm-text">
<strong>{terminateTarget.id}</strong>
</div>
</Modal>
) : null}
</section>
);
}