@@ -68,11 +68,13 @@ interface MonitoringStatus {
6868
6969export function MonitoringPage ( ) {
7070 const [ messages , setMessages ] = useState < Message [ ] > ( [ ] ) ;
71+ const [ searchLoading , setSearchLoading ] = useState ( false ) ;
7172 const [ conversations , setConversations ] = useState < Conversation [ ] > ( [ ] ) ;
7273 const [ monitoringStatus , setMonitoringStatus ] = useState < MonitoringStatus [ ] > ( [ ] ) ;
7374 const [ selectedConversation , setSelectedConversation ] = useState < number | null > ( null ) ;
7475 const [ filter , setFilter ] = useState ( "" ) ;
7576 const [ phoneFilter , setPhoneFilter ] = useState ( false ) ;
77+ const [ globalSearch , setGlobalSearch ] = useState ( false ) ;
7678 const [ messageTypeFilter , setMessageTypeFilter ] = useState < string > ( "all" ) ;
7779 const [ alertFilter , setAlertFilter ] = useState < string > ( "all" ) ;
7880 const [ autoScroll , setAutoScroll ] = useState ( true ) ;
@@ -198,7 +200,7 @@ export function MonitoringPage() {
198200 const newMessage = wsMessage . data as Message ;
199201
200202 // 只有当新消息属于当前选中的会话时才添加到列表
201- if ( selectedConversation && newMessage . conversation_id === selectedConversation ) {
203+ if ( selectedConversation && ! globalSearch && newMessage . conversation_id === selectedConversation ) {
202204 setMessages ( ( prev ) => {
203205 // 检查消息是否已存在(防止重复)
204206 if ( prev . some ( ( m ) => m . id === newMessage . id ) ) {
@@ -272,10 +274,10 @@ export function MonitoringPage() {
272274
273275 const interval = setInterval ( async ( ) => {
274276 // 轮询当前选中的会话消息
275- if ( selectedConversation ) {
277+ if ( selectedConversation && ! globalSearch ) {
276278 try {
277279 const params : any = {
278- conversation_id : selectedConversation ,
280+ ... ( globalSearch ? { } : { conversation_id : selectedConversation } ) ,
279281 page : 1 ,
280282 page_size : 10 , // 只获取最新的10条消息
281283 } ;
@@ -319,7 +321,7 @@ export function MonitoringPage() {
319321 setIsPolling ( false ) ;
320322 }
321323 } ;
322- } , [ isConnected , selectedConversation , pollingInterval ] ) ;
324+ } , [ isConnected , selectedConversation , pollingInterval , globalSearch ] ) ;
323325
324326 const fetchGlobalStats = async ( ) => {
325327 try {
@@ -508,10 +510,12 @@ export function MonitoringPage() {
508510 } ;
509511
510512 const fetchMessages = async ( ) => {
511- if ( ! selectedConversation ) return ;
513+ if ( ! globalSearch && ! selectedConversation ) return ;
514+ if ( globalSearch && ! filter ) return ;
512515 try {
516+ if ( globalSearch ) setSearchLoading ( true ) ;
513517 const params : any = {
514- conversation_id : selectedConversation ,
518+ ... ( globalSearch ? { } : { conversation_id : selectedConversation } ) ,
515519 page : currentPage ,
516520 page_size : pageSize ,
517521 } ;
@@ -540,6 +544,8 @@ export function MonitoringPage() {
540544 } , 50 ) ;
541545 } catch ( error ) {
542546 console . error ( "Failed to fetch messages:" , error ) ;
547+ } finally {
548+ setSearchLoading ( false ) ;
543549 }
544550 } ;
545551
@@ -875,6 +881,20 @@ export function MonitoringPage() {
875881 />
876882 < span > 📱 有手机号</ span >
877883 </ label >
884+ < label className = "flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-cyber-blue/10 border border-cyber-blue/20 cursor-pointer min-h-[44px] text-xs sm:text-sm" >
885+ < input
886+ type = "checkbox"
887+ checked = { globalSearch }
888+ onChange = { ( e ) => {
889+ setGlobalSearch ( e . target . checked ) ;
890+ setMessages ( [ ] ) ;
891+ setTotalCount ( 0 ) ;
892+ setCurrentPage ( 1 ) ;
893+ } }
894+ className = "rounded w-4 h-4"
895+ />
896+ < span > 🌐 全局</ span >
897+ </ label >
878898 < select
879899 value = { pageSize }
880900 onChange = { ( e ) => {
@@ -897,6 +917,7 @@ export function MonitoringPage() {
897917 setAlertFilter ( "all" ) ;
898918 setPhoneFilter ( false ) ;
899919 setCurrentPage ( 1 ) ;
920+ setGlobalSearch ( false ) ;
900921 } }
901922 className = "min-h-[44px]"
902923 >
@@ -910,10 +931,19 @@ export function MonitoringPage() {
910931 < div className = "space-y-4" >
911932 { /* 消息列表 */ }
912933 < div ref = { messageListRef } className = "max-h-[400px] sm:max-h-[600px] overflow-y-auto tech-scrollbar pr-0 sm:pr-2" >
913- { ! selectedConversation ? (
934+ { ! selectedConversation && ! globalSearch ? (
914935 < div className = "flex items-center justify-center h-64 text-muted-foreground" >
915936 请选择一个会话开始监控
916937 </ div >
938+ ) : globalSearch && ! filter ? (
939+ < div className = "flex items-center justify-center h-64 text-muted-foreground" >
940+ 请输入关键词进行全局搜索
941+ </ div >
942+ ) : searchLoading ? (
943+ < div className = "flex items-center justify-center h-64 text-muted-foreground" >
944+ < div className = "animate-spin rounded-full h-8 w-8 border-b-2 border-cyber-blue mr-3" > </ div >
945+ 全局搜索中,请稍候...
946+ </ div >
917947 ) : filteredMessages . length === 0 ? (
918948 < div className = "flex items-center justify-center h-64 text-muted-foreground" >
919949 暂无消息
0 commit comments