Skip to content

Commit 4a70506

Browse files
committed
Unify global modals:
step4: Update useConfirmModals, make sure every modal.confirm use same style
1 parent cdd75de commit 4a70506

File tree

9 files changed

+49
-53
lines changed

9 files changed

+49
-53
lines changed

frontend/app/[locale]/agents/components/AgentSetupOrchestrator.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2003,7 +2003,7 @@ export default function AgentSetupOrchestrator({
20032003
content: t("agentConfig.agents.copyConfirmContent", {
20042004
name: agent?.display_name || agent?.name || "",
20052005
}),
2006-
onConfirm: () => handleCopyAgentFromList(agent),
2006+
onOk: () => handleCopyAgentFromList(agent),
20072007
});
20082008
};
20092009

@@ -2326,10 +2326,6 @@ export default function AgentSetupOrchestrator({
23262326
>
23272327
<div className="py-2">
23282328
<div className="flex items-center">
2329-
<WarningFilled
2330-
className="text-yellow-500 mt-1 mr-2"
2331-
style={{ fontSize: "48px" }}
2332-
/>
23332329
<div className="ml-3 mt-2">
23342330
<div className="text-sm leading-6">
23352331
{t("businessLogic.config.modal.deleteContent", {

frontend/app/[locale]/agents/components/McpConfigModal.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
checkMcpServerHealth,
3535
} from "@/services/mcpService";
3636
import { McpServer, McpTool } from "@/types/agentConfig";
37+
import { useConfirmModal } from "@/hooks/useConfirmModal";
3738
import log from "@/lib/logger";
3839

3940
const { Text, Title } = Typography;
@@ -43,7 +44,8 @@ export default function McpConfigModal({
4344
onCancel,
4445
}: McpConfigModalProps) {
4546
const { t } = useTranslation("common");
46-
const { message, modal } = App.useApp();
47+
const { message } = App.useApp();
48+
const { confirm } = useConfirmModal();
4749
const [serverList, setServerList] = useState<McpServer[]>([]);
4850
const [loading, setLoading] = useState(false);
4951
const [addingServer, setAddingServer] = useState(false);
@@ -159,16 +161,12 @@ export default function McpConfigModal({
159161

160162
// Delete MCP server
161163
const handleDeleteServer = async (server: McpServer) => {
162-
modal.confirm({
164+
confirm({
163165
title: t("mcpConfig.delete.confirmTitle"),
164166
content: t("mcpConfig.delete.confirmContent", {
165167
name: server.service_name,
166168
}),
167169
okText: t("common.delete", "Delete"),
168-
cancelText: t("common.cancel", "Cancel"),
169-
okType: "danger",
170-
cancelButtonProps: { disabled: updatingTools },
171-
okButtonProps: { disabled: updatingTools, loading: updatingTools },
172170
onOk: async () => {
173171
try {
174172
const result = await deleteMcpServer(

frontend/app/[locale]/chat/components/chatLeftSidebar.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
import { StaticScrollArea } from "@/components/ui/scrollArea";
2929
import { USER_ROLES } from "@/const/modelConfig";
3030
import { useTranslation } from "react-i18next";
31+
import { useConfirmModal } from "@/hooks/useConfirmModal";
3132
import { ConversationListItem, ChatSidebarProps } from "@/types/chat";
3233

3334
// conversation status indicator component
@@ -114,7 +115,7 @@ export function ChatSidebar({
114115
userRole = USER_ROLES.USER,
115116
}: ChatSidebarProps) {
116117
const { t } = useTranslation();
117-
const { modal } = App.useApp();
118+
const { confirm } = useConfirmModal();
118119
const router = useRouter();
119120
const { today, week, older } = categorizeDialogs(conversationList);
120121
const [editingId, setEditingId] = useState<number | null>(null);
@@ -179,14 +180,9 @@ export function ChatSidebar({
179180
onDropdownOpenChange(false, null);
180181

181182
// Show confirmation modal
182-
modal.confirm({
183+
confirm({
183184
title: t("chatLeftSidebar.confirmDeletionTitle"),
184185
content: t("chatLeftSidebar.confirmDeletionDescription"),
185-
okText: t("common.confirm"),
186-
cancelText: t("common.cancel"),
187-
okType: "danger",
188-
centered: true,
189-
maskClosable: false,
190186
onOk: () => {
191187
onDelete(dialogId);
192188
},

frontend/app/[locale]/knowledges/KnowledgeBaseConfiguration.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ function DataConfig({ isActive }: DataConfigProps) {
497497
okText: t("common.confirm"),
498498
cancelText: t("common.cancel"),
499499
danger: true,
500-
onConfirm: async () => {
500+
onOk: async () => {
501501
try {
502502
await deleteKnowledgeBase(id);
503503

@@ -554,7 +554,7 @@ function DataConfig({ isActive }: DataConfigProps) {
554554
okText: t("common.confirm"),
555555
cancelText: t("common.cancel"),
556556
danger: true,
557-
onConfirm: async () => {
557+
onOk: async () => {
558558
try {
559559
await deleteDocument(kbId, docId);
560560
message.success(t("document.message.deleteSuccess"));

frontend/app/[locale]/space/components/AgentCard.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
} from "@/services/agentConfigService";
2424
import { generateAvatarFromName } from "@/lib/avatar";
2525
import { useAuth } from "@/hooks/useAuth";
26+
import { useConfirmModal } from "@/hooks/useConfirmModal";
2627
import { USER_ROLES } from "@/const/modelConfig";
2728
import log from "@/lib/logger";
2829

@@ -45,8 +46,9 @@ interface AgentCardProps {
4546

4647
export default function AgentCard({ agent, onRefresh, onChat, onEdit }: AgentCardProps) {
4748
const { t } = useTranslation("common");
48-
const { message, modal } = App.useApp();
49+
const { message } = App.useApp();
4950
const { user, isSpeedMode } = useAuth();
51+
const { confirm } = useConfirmModal();
5052

5153
const [isDeleting, setIsDeleting] = useState(false);
5254
const [isExporting, setIsExporting] = useState(false);
@@ -63,15 +65,12 @@ export default function AgentCard({ agent, onRefresh, onChat, onEdit }: AgentCar
6365

6466
// Handle delete agent
6567
const handleDelete = () => {
66-
modal.confirm({
68+
confirm({
6769
title: t("space.deleteConfirm.title", "Delete Agent"),
6870
content: t(
6971
"space.deleteConfirm.content",
7072
`Are you sure you want to delete agent "${agent.display_name}"? This action cannot be undone.`
7173
),
72-
okText: t("common.confirm", "Confirm"),
73-
cancelText: t("common.cancel", "Cancel"),
74-
okButtonProps: { danger: true },
7574
onOk: async () => {
7675
setIsDeleting(true);
7776
try {

frontend/components/auth/avatarDropdown.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import type { ItemType } from "antd/es/menu/interface";
1515

1616
import { useAuth } from "@/hooks/useAuth";
17+
import { useConfirmModal } from "@/hooks/useConfirmModal";
1718
import { getRoleColor } from "@/lib/auth";
1819

1920
export function AvatarDropdown() {
@@ -22,6 +23,7 @@ export function AvatarDropdown() {
2223
const [dropdownOpen, setDropdownOpen] = useState(false);
2324
const { t } = useTranslation("common");
2425
const { modal } = App.useApp();
26+
const { confirm } = useConfirmModal();
2527

2628
if (isLoading) {
2729
return <Spin size="small" />;
@@ -115,11 +117,9 @@ export function AvatarDropdown() {
115117
icon: <LogoutOutlined />,
116118
label: t("auth.logout"),
117119
onClick: () => {
118-
modal.confirm({
120+
confirm({
119121
title: t("auth.confirmLogout"),
120122
content: t("auth.confirmLogoutPrompt"),
121-
okText: t("auth.confirm"),
122-
cancelText: t("auth.cancel"),
123123
onOk: () => {
124124
logout();
125125
},
@@ -141,13 +141,10 @@ export function AvatarDropdown() {
141141
okText: t("auth.confirm"),
142142
});
143143
} else {
144-
modal.confirm({
144+
confirm({
145145
title: t("auth.confirmRevoke"),
146146
content: t("auth.confirmRevokePrompt"),
147-
icon: <CloseCircleFilled style={{ color: "red" }} />,
148147
okText: t("auth.confirmRevokeOk"),
149-
cancelText: t("auth.cancel"),
150-
okButtonProps: { danger: true },
151148
onOk: () => {
152149
revoke();
153150
},

frontend/components/auth/sessionListeners.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { App, Modal } from "antd";
77
import { ExclamationCircleOutlined } from "@ant-design/icons";
88

99
import { useAuth } from "@/hooks/useAuth";
10+
import { useConfirmModal } from "@/hooks/useConfirmModal";
1011
import { authService } from "@/services/authService";
1112
import { sessionService } from "@/services/sessionService";
1213
import { getSessionFromStorage } from "@/lib/auth";
@@ -29,6 +30,7 @@ export function SessionListeners() {
2930
const { openLoginModal, setIsFromSessionExpired, clearLocalSession, isSpeedMode } =
3031
useAuth();
3132
const { modal } = App.useApp();
33+
const { confirm } = useConfirmModal();
3234
const modalShownRef = useRef<boolean>(false);
3335

3436
const isLocaleHomePath = (path?: string | null) => {
@@ -52,7 +54,12 @@ export function SessionListeners() {
5254
content: t("login.expired.content"),
5355
okText: t("login.expired.okText"),
5456
cancelText: t("login.expired.cancelText"),
57+
centered: true,
5558
closable: false,
59+
okButtonProps: {
60+
danger: true,
61+
type: "primary"
62+
},
5663
onOk() {
5764
// Clear local session state (session already expired on backend)
5865
clearLocalSession();

frontend/hooks/useConfirmModal.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
1+
import { App } from "antd";
2+
import { ExclamationCircleFilled } from "@ant-design/icons";
3+
4+
import React from "react";
15
import i18next from "i18next";
26

3-
import { App } from "antd";
4-
import { StaticConfirmProps } from "@/types/setupConfig";
7+
interface ConfirmProps {
8+
title: string;
9+
content: React.ReactNode;
10+
okText?: string;
11+
cancelText?: string;
12+
danger?: boolean; // 默认为 true,使用 danger 样式
13+
onOk?: () => void;
14+
onCancel?: () => void;
15+
}
516

617
export const useConfirmModal = () => {
718
const { modal } = App.useApp();
@@ -11,20 +22,25 @@ export const useConfirmModal = () => {
1122
content,
1223
okText,
1324
cancelText,
14-
danger = false,
15-
onConfirm,
25+
danger = true,
26+
onOk,
1627
onCancel,
17-
}: StaticConfirmProps) => {
28+
}: ConfirmProps) => {
1829
return modal.confirm({
1930
title,
2031
content,
32+
centered: true,
33+
icon: React.createElement(ExclamationCircleFilled),
2134
okText: okText || i18next.t("common.confirm"),
2235
cancelText: cancelText || i18next.t("common.cancel"),
23-
okButtonProps: { danger },
24-
onOk: onConfirm,
36+
okButtonProps: {
37+
danger,
38+
type: "primary"
39+
},
40+
onOk: onOk,
2541
onCancel,
2642
});
2743
};
2844

2945
return { confirm };
30-
};
46+
};

frontend/types/setupConfig.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)