+
{row.kind}
@@ -423,7 +423,7 @@ export default function InboxDrawer({ onOpenResource }: InboxDrawerProps) {
)}
- )}
+ )}
/>
>
) : loadError ? (
diff --git a/frontend/src/components/KnowledgeCreateModal.tsx b/frontend/src/components/KnowledgeCreateModal.tsx
index d0abb49..ee5bee6 100644
--- a/frontend/src/components/KnowledgeCreateModal.tsx
+++ b/frontend/src/components/KnowledgeCreateModal.tsx
@@ -1,6 +1,7 @@
import {useState} from 'react'
import type {SelectProps} from 'antd'
-import {DatePicker, Form, Input, message, Modal, Select, Tag, theme, Typography} from 'antd'
+import {DatePicker, Form, Input, Modal, Select, Tag, theme, Typography} from 'antd'
+import {message} from '../utils/appMessage'
import {BookOutlined} from '@ant-design/icons'
import type {Dayjs} from 'dayjs'
import client from '../api/client'
diff --git a/frontend/src/components/MarkdownEditor.tsx b/frontend/src/components/MarkdownEditor.tsx
index 2bf4f76..16623c1 100644
--- a/frontend/src/components/MarkdownEditor.tsx
+++ b/frontend/src/components/MarkdownEditor.tsx
@@ -1,6 +1,6 @@
import {type ClipboardEvent, useState} from 'react'
import axios from 'axios'
-import {message} from 'antd'
+import {message} from '../utils/appMessage'
import type {PreviewType} from '@uiw/react-md-editor'
import MDEditor from '@uiw/react-md-editor'
import client from '../api/client'
diff --git a/frontend/src/components/MessageComposer.tsx b/frontend/src/components/MessageComposer.tsx
index 2d63fe2..110dd66 100644
--- a/frontend/src/components/MessageComposer.tsx
+++ b/frontend/src/components/MessageComposer.tsx
@@ -1,6 +1,7 @@
import {useMemo, useState} from 'react'
import type {UploadProps} from 'antd'
-import {Alert, Button, Mentions, message, Tooltip, Upload} from 'antd'
+import {Alert, Button, Mentions, Tooltip, Upload} from 'antd'
+import {message} from '../utils/appMessage'
import {PaperClipOutlined, SendOutlined} from '@ant-design/icons'
import {type Attachment, uploadAttachment} from '../api/attachments'
import {fetchMentionUsers, type MentionUser} from '../api/comments'
diff --git a/frontend/src/components/PersonalCenterModal.tsx b/frontend/src/components/PersonalCenterModal.tsx
index 91c099a..87f33dd 100644
--- a/frontend/src/components/PersonalCenterModal.tsx
+++ b/frontend/src/components/PersonalCenterModal.tsx
@@ -1,5 +1,6 @@
import {useEffect, useState} from 'react'
-import {Button, Col, DatePicker, Form, Input, message, Modal, Popconfirm, Row, Space, Switch, Table, Tabs, Tag, Typography} from 'antd'
+import {Button, Col, DatePicker, Form, Input, Modal, Popconfirm, Row, Space, Switch, Table, Tabs, Tag, Typography} from 'antd'
+import {message} from '../utils/appMessage'
import {ApiOutlined, CopyOutlined, DeleteOutlined, KeyOutlined, LockOutlined, ReloadOutlined, SettingOutlined, UserOutlined} from '@ant-design/icons'
import type {ColumnsType} from 'antd/es/table'
import type {Dayjs} from 'dayjs'
diff --git a/frontend/src/components/RecordDetailModal.tsx b/frontend/src/components/RecordDetailModal.tsx
index 4f890e8..cc58408 100644
--- a/frontend/src/components/RecordDetailModal.tsx
+++ b/frontend/src/components/RecordDetailModal.tsx
@@ -1,5 +1,6 @@
import {useCallback, useEffect, useMemo, useRef, useState} from 'react'
-import {Button, Divider, Empty, message, Modal, Spin, theme, Tooltip} from 'antd'
+import {Button, Divider, Empty, Modal, Spin, theme, Tooltip} from 'antd'
+import {message} from '../utils/appMessage'
import {CloseOutlined, FileTextOutlined, HistoryOutlined, MenuFoldOutlined, MenuUnfoldOutlined, MessageOutlined, ReloadOutlined, ShareAltOutlined} from '@ant-design/icons'
import client from '../api/client'
import type {FieldEditingController, OpenResourceOptions, ResourceConfig} from '../types/records'
diff --git a/frontend/src/components/RelatedRecordsTable.tsx b/frontend/src/components/RelatedRecordsTable.tsx
index 1e4cab2..21d1647 100644
--- a/frontend/src/components/RelatedRecordsTable.tsx
+++ b/frontend/src/components/RelatedRecordsTable.tsx
@@ -1,5 +1,5 @@
import {type ReactNode, useCallback, useEffect, useMemo, useState} from 'react'
-import {message} from 'antd'
+import {message} from '../utils/appMessage'
import DataTable from './DataTable'
import {fetchResourceMetadata} from '../api/metadata'
import type {AdvancedFilterFieldConfig, MetadataResponse, OpenResourceOptions, ResourceColumn, ResourceFilterConfig} from '../types/records'
diff --git a/frontend/src/components/TagList.tsx b/frontend/src/components/TagList.tsx
index f4a9ea0..b81d0c7 100644
--- a/frontend/src/components/TagList.tsx
+++ b/frontend/src/components/TagList.tsx
@@ -1,3 +1,4 @@
+import {Fragment} from 'react'
import {choiceTag} from '../utils/recordDisplay'
interface TagListProps {
@@ -10,7 +11,11 @@ export default function TagList({ items, color = 'blue' }: TagListProps) {
return (
- {items.map((item) => choiceTag(String(item), color))}
+ {items.map((item, index) => (
+
+ {choiceTag(String(item), color)}
+
+ ))}
)
}
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
index 29d2f03..ceacea5 100644
--- a/frontend/src/main.tsx
+++ b/frontend/src/main.tsx
@@ -3,6 +3,7 @@ import ReactDOM from 'react-dom/client'
import {BrowserRouter} from 'react-router-dom'
import {App as AntApp, ConfigProvider} from 'antd'
import App from './App'
+import AppMessageProvider from './components/AppMessageProvider'
import themeConfig from './theme'
import './index.css'
@@ -11,6 +12,7 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
+
diff --git a/frontend/src/pages/CustomDefinitions.tsx b/frontend/src/pages/CustomDefinitions.tsx
index 9482608..3954107 100644
--- a/frontend/src/pages/CustomDefinitions.tsx
+++ b/frontend/src/pages/CustomDefinitions.tsx
@@ -1,5 +1,6 @@
import {useCallback, useEffect, useMemo, useState} from 'react'
-import {Alert, Button, Descriptions, Drawer, Empty, Flex, Input, InputNumber, List, message, Select, Space, Table, Tabs, Tag, Typography} from 'antd'
+import {Alert, Button, Descriptions, Drawer, Empty, Flex, Input, InputNumber, List, Select, Space, Table, Tabs, Tag, Typography} from 'antd'
+import {message} from '../utils/appMessage'
import {ReloadOutlined} from '@ant-design/icons'
import type {ColumnsType} from 'antd/es/table'
import {Boxes, BrainCircuit, DatabaseZap} from 'lucide-react'
diff --git a/frontend/src/pages/LDAPSettings.tsx b/frontend/src/pages/LDAPSettings.tsx
index 79d6b72..bfa5c42 100644
--- a/frontend/src/pages/LDAPSettings.tsx
+++ b/frontend/src/pages/LDAPSettings.tsx
@@ -1,5 +1,6 @@
import {useCallback, useEffect, useState} from 'react'
-import {Button, Card, Col, Form, Input, message, Row, Space, Switch} from 'antd'
+import {Button, Card, Col, Form, Input, Row, Space, Switch} from 'antd'
+import {message} from '../utils/appMessage'
import client from '../api/client'
interface LDAPConfig {
diff --git a/frontend/src/pages/LLMProviderSettings.tsx b/frontend/src/pages/LLMProviderSettings.tsx
index adfcaa3..4f5d56a 100644
--- a/frontend/src/pages/LLMProviderSettings.tsx
+++ b/frontend/src/pages/LLMProviderSettings.tsx
@@ -1,5 +1,6 @@
import {useMemo, useState} from 'react'
-import {Button, Form, Input, InputNumber, message, Modal, Popconfirm, Select, Space, Switch} from 'antd'
+import {Button, Form, Input, InputNumber, Modal, Popconfirm, Select, Space, Switch} from 'antd'
+import {message} from '../utils/appMessage'
import {CheckCircleOutlined, EditOutlined, PlusOutlined, StopOutlined, ThunderboltOutlined} from '@ant-design/icons'
import client from '../api/client'
import DataTable from '../components/DataTable'
diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx
index f1677ff..3dade37 100644
--- a/frontend/src/pages/Login.tsx
+++ b/frontend/src/pages/Login.tsx
@@ -1,6 +1,7 @@
import {useState} from 'react'
import {useNavigate, useSearchParams} from 'react-router-dom'
-import {BorderBeam, Button, Card, Form, Input, message, Segmented} from 'antd'
+import {BorderBeam, Button, Card, Form, Input, Segmented} from 'antd'
+import {message} from '../utils/appMessage'
import {LockOutlined, UserOutlined} from '@ant-design/icons'
import type {AuthType} from '../api/auth'
import {login} from '../api/auth'
diff --git a/frontend/src/pages/RuntimeSettings.tsx b/frontend/src/pages/RuntimeSettings.tsx
index 05b7d9b..6ae77ac 100644
--- a/frontend/src/pages/RuntimeSettings.tsx
+++ b/frontend/src/pages/RuntimeSettings.tsx
@@ -1,5 +1,6 @@
import {useCallback, useEffect, useState} from 'react'
-import {Button, Card, Col, Divider, Form, InputNumber, message, Row, Select, Space, Tooltip, Typography} from 'antd'
+import {Button, Card, Col, Divider, Form, InputNumber, Row, Select, Space, Tooltip, Typography} from 'antd'
+import {message} from '../utils/appMessage'
import {QuestionCircleOutlined} from '@ant-design/icons'
import client from '../api/client'
diff --git a/frontend/src/pages/SIEMSettings.tsx b/frontend/src/pages/SIEMSettings.tsx
index 2bbe9f8..d7264e7 100644
--- a/frontend/src/pages/SIEMSettings.tsx
+++ b/frontend/src/pages/SIEMSettings.tsx
@@ -1,5 +1,6 @@
import {useCallback, useEffect, useState} from 'react'
-import {Button, Card, Col, Form, Input, InputNumber, message, Row, Select, Space, Switch, Tabs} from 'antd'
+import {Button, Card, Col, Form, Input, InputNumber, Row, Select, Space, Switch, Tabs} from 'antd'
+import {message} from '../utils/appMessage'
import {Layers, Search} from 'lucide-react'
import client from '../api/client'
import IconTabLabel from '../components/IconTabLabel'
diff --git a/frontend/src/pages/ThreatIntelligenceSettings.tsx b/frontend/src/pages/ThreatIntelligenceSettings.tsx
index 54ce977..523ef15 100644
--- a/frontend/src/pages/ThreatIntelligenceSettings.tsx
+++ b/frontend/src/pages/ThreatIntelligenceSettings.tsx
@@ -1,5 +1,6 @@
import {useCallback, useEffect, useState} from 'react'
-import {Button, Card, Form, Input, InputNumber, message, Space, Switch, Tabs} from 'antd'
+import {Button, Card, Form, Input, InputNumber, Space, Switch, Tabs} from 'antd'
+import {message} from '../utils/appMessage'
import {ChartNetwork, SatelliteDish} from 'lucide-react'
import client from '../api/client'
diff --git a/frontend/src/pages/UserCreateModal.tsx b/frontend/src/pages/UserCreateModal.tsx
index 12f1585..c1d691d 100644
--- a/frontend/src/pages/UserCreateModal.tsx
+++ b/frontend/src/pages/UserCreateModal.tsx
@@ -1,4 +1,5 @@
-import {Col, Divider, Form, Input, message, Modal, Row, Select, Typography} from 'antd'
+import {Col, Divider, Form, Input, Modal, Row, Select, Typography} from 'antd'
+import {message} from '../utils/appMessage'
import client from '../api/client'
import type {AuthType, UserMutationResponse} from '../api/auth'
diff --git a/frontend/src/pages/UserDetailModal.tsx b/frontend/src/pages/UserDetailModal.tsx
index 920c18d..d2ef178 100644
--- a/frontend/src/pages/UserDetailModal.tsx
+++ b/frontend/src/pages/UserDetailModal.tsx
@@ -1,5 +1,6 @@
import {useEffect, useState} from 'react'
-import {Button, Col, Divider, Form, Input, message, Modal, Row, Select, Space, theme, Typography} from 'antd'
+import {Button, Col, Divider, Form, Input, Modal, Row, Select, Space, theme, Typography} from 'antd'
+import {message} from '../utils/appMessage'
import client from '../api/client'
import type {AuthUser} from '../stores/auth'
import AvatarUpload from '../components/AvatarUpload'
@@ -27,13 +28,8 @@ export default function UserDetailModal({ userId, open, onClose, onSaved }: User
const [saving, setSaving] = useState(false)
useEffect(() => {
- if (!open || userId === null) {
- // eslint-disable-next-line react-hooks/set-state-in-effect
- setUser(null)
- form.resetFields()
- return
- }
- setLoading(true)
+ if (!open || userId === null) return
+
client.get(`/auth/users/${userId}/`)
.then(({ data }) => {
setUser(data)
@@ -89,6 +85,14 @@ export default function UserDetailModal({ userId, open, onClose, onSaved }: User
footer: { background: token.colorBgContainer },
}}
destroyOnHidden
+ afterOpenChange={(nextOpen) => {
+ if (nextOpen) {
+ if (userId !== null) setLoading(true)
+ return
+ }
+ setUser(null)
+ form.resetFields()
+ }}
>