diff --git a/web/src/pages/creator/workbench/index.tsx b/web/src/pages/creator/workbench/index.tsx
index 4140c06..9efd404 100644
--- a/web/src/pages/creator/workbench/index.tsx
+++ b/web/src/pages/creator/workbench/index.tsx
@@ -2,7 +2,7 @@
// 六个页签:评论/线索/规则/事件监听/私信/操作记录;实时更新走 /creator/updates SSE;仅用 antd 默认组件。
import { useEffect, useRef, useState } from 'react';
import type { ReactNode } from 'react';
-import { Flex, Alert, Button, Card, Checkbox, Col, Empty, Input, Modal, Row, Select, Space, Spin, Table, Tabs, Tag, Typography, message } from 'antd';
+import { Alert, App, Button, Card, Checkbox, Col, Empty, Flex, Input, Modal, Row, Select, Space, Spin, Table, Tabs, Tag, Typography } from 'antd';
import type { ColumnsType } from 'antd/es/table';
import { create, creatorAction, creatorCreate, creatorGet, creatorSubscribe, creatorSyncConversation, creatorUpdate, getList } from '@/services/api';
import { conflictMessage, dateTime } from '@/utils/helpers';
@@ -53,8 +53,7 @@ function operationStatus(state?: string, reason?: string): string {
failed: '失败(平台明确拒绝或执行前失败)',
blocked: '已阻止(未发送)',
processing: '处理中(尚未获得最终结果)',
- uncertain: '结果不明(禁止自动重试)',
- };
+ uncertain: '结果不明(禁止自动重试)' };
return `${labels[state || ''] || state || '未知状态'}${reason ? `:${reason}` : ''}`;
}
@@ -129,7 +128,7 @@ export default function Page() {
const [pendingDMSwitch, setPendingDMSwitch] = useState<{ kind: 'account' | 'conversation'; id: string } | null>(null);
const loadSequence = useRef(0);
const messageSequence = useRef(0);
- const [messageApi, contextHolder] = message.useMessage();
+ const { message: messageApi } = App.useApp();
const visibleData = dataTab === tab ? data : [];
const visibleConversations = conversationAccountID === dmAccountID ? conversations : [];
@@ -245,8 +244,7 @@ export default function Page() {
setMessages(items);
setMessagePageInfo({
total: Array.isArray(result) ? items.length : (result.total ?? items.length),
- hasNext: Array.isArray(result) ? false : Boolean(result.has_next),
- });
+ hasNext: Array.isArray(result) ? false : Boolean(result.has_next) });
})
.catch((loadError) => {
if (sequence === messageSequence.current) setMessageError(loadError);
@@ -378,8 +376,7 @@ export default function Page() {
topic: ruleForm.topic,
include_keywords: parseKeywords(ruleForm.include_keywords),
exclude_keywords: parseKeywords(ruleForm.exclude_keywords),
- ai_requirement: ruleForm.ai_requirement,
- };
+ ai_requirement: ruleForm.ai_requirement };
const result = editingRuleID
? await creatorUpdate(`/creator/rules/${encodeURIComponent(editingRuleID)}`, variables)
: (await create('creator-rules', variables)).data;
@@ -418,8 +415,7 @@ export default function Page() {
text: draft?.text || '',
target_uid: comment.author_uid || '',
target_comment_id: comment.id,
- operation_key: draft?.operation_key || '',
- });
+ operation_key: draft?.operation_key || '' });
messageApi.info(mode === 'dm' ? '请填写发送账号和私信文案,再进行逐次确认。' : '请填写发送账号和文案,再进行逐次确认。');
}
@@ -448,8 +444,7 @@ export default function Page() {
account_id: reply.account_id,
target_uid: reply.target_uid,
...(replyMode === 'comment' ? { target_comment_id: reply.target_comment_id } : {}),
- text: reply.text,
- });
+ text: reply.text });
const result = await creatorAction(`/creator/operations/${encodeURIComponent(created.id)}/execute`);
messageApi[result.state === 'succeeded' ? 'success' : 'warning'](operationStatus(result.state, result.reason));
if (result.state === 'succeeded') {
@@ -532,8 +527,7 @@ export default function Page() {
platform: dmConfirm.platform,
account_id: dmAccountID,
target_uid: dmConfirm.peer_uid,
- text: dmText,
- });
+ text: dmText });
const result = await creatorAction(`/creator/operations/${encodeURIComponent(created.id)}/execute`);
messageApi[result.state === 'succeeded' ? 'success' : 'warning'](operationStatus(result.state, result.reason));
if (result.state === 'succeeded') {
@@ -826,8 +820,7 @@ export default function Page() {
topic: rule.topic,
include_keywords: (rule.include_keywords || []).join(', '),
exclude_keywords: (rule.exclude_keywords || []).join(', '),
- ai_requirement: rule.ai_requirement,
- });
+ ai_requirement: rule.ai_requirement });
}}
disabled={busy}
>
@@ -877,8 +870,7 @@ export default function Page() {
padding: '8px 8px',
textAlign: 'left',
whiteSpace: 'normal',
- background: conversation.id === conversationID ? '#e6f4ff' : undefined,
- }}
+ background: conversation.id === conversationID ? '#e6f4ff' : undefined }}
type={conversation.id === conversationID ? 'primary' : 'default'}
ghost={conversation.id === conversationID}
onClick={() => switchConversation(conversation.id)}
@@ -935,8 +927,7 @@ export default function Page() {
maxWidth: '80%',
background: msg.direction === 'outbound' ? '#e6f4ff' : '#fafafa',
borderRadius: 6,
- padding: 12,
- }}
+ padding: 12 }}
>
{msg.text || `[${msg.message_type}]`}
@@ -992,8 +983,7 @@ export default function Page() {
statusTag(
item.state === 'succeeded' ? 'success' : item.state === 'uncertain' || item.state === 'processing' ? 'warning' : item.state === 'failed' ? 'error' : 'default',
operationStatus(item.state, item.reason),
- ),
- },
+ ) },
{ title: '时间', dataIndex: 'created_at', render: (value: string) => {dateTime(value)} },
{ title: '原因', dataIndex: 'reason', render: (value?: string) => {value || '—'} },
];
@@ -1013,7 +1003,6 @@ export default function Page() {
return (
- {contextHolder}
{
setPending(true);
@@ -112,7 +100,6 @@ export default function Page() {
return (
- {contextHolder}
{draft.account.platform_account_key} · 草稿版本 {draft.version}
diff --git a/web/src/pages/gateways/index.tsx b/web/src/pages/gateways/index.tsx
index 607c089..76297be 100644
--- a/web/src/pages/gateways/index.tsx
+++ b/web/src/pages/gateways/index.tsx
@@ -1,6 +1,6 @@
// 网关管理:语义对齐 web.archived GatewaysPage.jsx(注册/编辑 Modal、令牌显隐复制、删除)。
import { useCallback, useEffect, useState } from 'react';
-import { Alert, Button, Card, Flex, Form, Input, Modal, Popconfirm, Space, Table, Typography, message } from 'antd';
+import { Alert, App, Button, Card, Flex, Form, Input, Modal, Popconfirm, Space, Table, Typography } from 'antd';
import { CopyOutlined, EyeInvisibleOutlined, EyeOutlined, PlusOutlined } from '@ant-design/icons';
import type { ColumnsType } from 'antd/es/table';
import { create, getList, remove, update } from '@/services/api';
@@ -15,8 +15,7 @@ function GatewayFormModal({
busy,
error,
onCancel,
- onSubmit,
-}: {
+ onSubmit }: {
open: boolean;
initial: any | null;
busy: boolean;
@@ -79,7 +78,7 @@ export default function Page() {
const [editing, setEditing] = useState(null);
const [busy, setBusy] = useState('');
const [created, setCreated] = useState(null);
- const [messageApi, contextHolder] = message.useMessage();
+ const { message: messageApi } = App.useApp();
const load = useCallback(async () => {
setPending(true);
@@ -148,8 +147,7 @@ export default function Page() {
{
title: '令牌',
dataIndex: 'token',
- render: (token: string, gateway) => ,
- },
+ render: (token: string, gateway) => },
{
title: '操作',
key: 'actions',
@@ -165,13 +163,11 @@ export default function Page() {
- ),
- },
+ ) },
];
return (
- {contextHolder}
共 {gateways.length} 个网关
} onClick={() => setCreateOpen(true)}>
diff --git a/web/src/pages/network-exits/index.tsx b/web/src/pages/network-exits/index.tsx
index 41048b2..5c6d2d5 100644
--- a/web/src/pages/network-exits/index.tsx
+++ b/web/src/pages/network-exits/index.tsx
@@ -1,7 +1,7 @@
// 网络出口:语义对齐 web.archived NetworkExitsPage.jsx(列表 + 创建/编辑 Modal + 检测/启停/删除动作 + 出口详情页)。
import { useCallback, useEffect, useMemo, useState } from 'react';
import { history } from '@umijs/max';
-import { Alert, Button, Card, Flex, Form, Input, InputNumber, Modal, Popconfirm, Select, Space, Table, Tag, Typography, message } from 'antd';
+import { Alert, App, Button, Card, Flex, Form, Input, InputNumber, Modal, Popconfirm, Select, Space, Table, Tag, Typography } from 'antd';
import { PlusOutlined } from '@ant-design/icons';
import type { ColumnsType } from 'antd/es/table';
import { create, getOne, getList, networkExitAction, remove, update } from '@/services/api';
@@ -11,8 +11,7 @@ const healthText: Record = {
unchecked: '未检测',
healthy: '健康',
unhealthy: '不健康',
- disabled: '已停用',
-};
+ disabled: '已停用' };
const protocolOptions = ['http', 'https', 'socks4', 'socks5'].map((value) => ({ value, label: value }));
function healthTag(status?: string) {
@@ -39,8 +38,7 @@ function ExitFormModal({
busy,
error,
onCancel,
- onSubmit,
-}: {
+ onSubmit }: {
open: boolean;
initial: any | null;
title: string;
@@ -87,8 +85,7 @@ function ExitFormModal({
validator: (_rule, value) =>
!value || getFieldValue('username')
? Promise.resolve()
- : Promise.reject(new Error('填写密码时必须同时填写用户名')),
- }),
+ : Promise.reject(new Error('填写密码时必须同时填写用户名')) }),
]}
>
@@ -114,7 +111,7 @@ export default function Page() {
const [createOpen, setCreateOpen] = useState(false);
const [editing, setEditing] = useState(null);
const [busy, setBusy] = useState('');
- const [messageApi, contextHolder] = message.useMessage();
+ const { message: messageApi } = App.useApp();
const load = useCallback(async () => {
setPending(true);
@@ -225,8 +222,7 @@ export default function Page() {
{`${exit.protocol}://${exit.host}:${exit.port}`}
- ),
- },
+ ) },
{ title: '状态', dataIndex: 'health_status', render: (value?: string) => healthTag(value) },
{ title: '用户名', dataIndex: 'username', render: (value?: string) => value || '无' },
{ title: '密码', dataIndex: 'password', render: (value?: string) => value || '无' },
@@ -242,8 +238,7 @@ export default function Page() {
{accountsByExit.get(exit.id)?.join('、') || '未绑定'}
- ),
- },
+ ) },
{
title: '操作',
key: 'actions',
@@ -273,13 +268,11 @@ export default function Page() {
- ),
- },
+ ) },
];
return (
- {contextHolder}
共 {exits.length} 个网络出口
} onClick={() => setCreateOpen(true)}>
diff --git a/web/src/pages/tasks/$id/index.tsx b/web/src/pages/tasks/$id/index.tsx
index ba749da..3b19137 100644
--- a/web/src/pages/tasks/$id/index.tsx
+++ b/web/src/pages/tasks/$id/index.tsx
@@ -2,7 +2,7 @@
// 四卡改用 Tabs(当前状态 / 确认快照 / 执行关联 / 唯一安全动作)——antd 默认组件的信息组织方式。
import { useCallback, useEffect, useState } from 'react';
import { history, useParams } from '@umijs/max';
-import { Flex, Alert, Button, Card, Descriptions, Select, Space, Tabs, Tag, Typography, message } from 'antd';
+import { Alert, App, Button, Card, Descriptions, Flex, Select, Space, Tabs, Tag, Typography } from 'antd';
import { getOne, taskAction } from '@/services/api';
import { dateTime } from '@/utils/helpers';
@@ -13,8 +13,7 @@ const stateText: Record = {
failed: '失败',
needs_confirmation: '需要人工确认',
policy_hold: '策略暂停',
- cancelled: '已取消',
-};
+ cancelled: '已取消' };
const stateColor: Record = {
queued: 'default',
executing: 'processing',
@@ -22,8 +21,7 @@ const stateColor: Record = {
failed: 'error',
needs_confirmation: 'warning',
policy_hold: 'warning',
- cancelled: 'default',
-};
+ cancelled: 'default' };
const holdText: Record = {
account_paused: '账号已暂停',
@@ -43,8 +41,7 @@ const holdText: Record = {
confirmation_missing: '确认快照缺失',
confirmation_version_changed: '确认版本已变化',
binding_version_changed: '环境或出口版本已变化',
- legacy_confirmation_required: '历史任务结果未知,等待人工核验',
-};
+ legacy_confirmation_required: '历史任务结果未知,等待人工核验' };
const holdLabel = (reason?: string) => (reason ? holdText[reason] || `未知停止原因:${reason}` : '无');
function actionErrorText(error: any): string {
@@ -61,7 +58,7 @@ export default function Page() {
const [error, setError] = useState(null);
const [verification, setVerification] = useState('not_executed');
const [busy, setBusy] = useState(false);
- const [messageApi, contextHolder] = message.useMessage();
+ const { message: messageApi } = App.useApp();
const load = useCallback(async () => {
setPending(true);
@@ -117,8 +114,7 @@ export default function Page() {
{task.verification_result || '尚未记录'}
- ),
- },
+ ) },
{
key: 'confirmation',
label: '确认快照',
@@ -142,8 +138,7 @@ export default function Page() {
- ),
- },
+ ) },
{
key: 'execution',
label: '执行关联',
@@ -169,8 +164,7 @@ export default function Page() {
) : null}
- ),
- },
+ ) },
{
key: 'action',
label: '唯一安全动作',
@@ -217,13 +211,11 @@ export default function Page() {
) : null}
{task.allowed_action ? null : 当前没有可安全执行的动作。}
- ),
- },
+ ) },
];
return (
- {contextHolder}