mirror of
https://github.com/hicccc77/WeFlow.git
synced 2026-03-24 23:06:51 +00:00
群聊新增群聊分析按钮
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'
|
import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'
|
||||||
import { Search, MessageSquare, AlertCircle, Loader2, RefreshCw, X, ChevronDown, Info, Calendar, Database, Hash, Play, Pause, Image as ImageIcon, Link, Mic, CheckCircle, Copy, Check, Download } from 'lucide-react'
|
import { Search, MessageSquare, AlertCircle, Loader2, RefreshCw, X, ChevronDown, Info, Calendar, Database, Hash, Play, Pause, Image as ImageIcon, Link, Mic, CheckCircle, Copy, Check, Download, BarChart3 } from 'lucide-react'
|
||||||
import { useNavigate } from 'react-router-dom'
|
import { useNavigate } from 'react-router-dom'
|
||||||
import { createPortal } from 'react-dom'
|
import { createPortal } from 'react-dom'
|
||||||
import { useChatStore } from '../stores/chatStore'
|
import { useChatStore } from '../stores/chatStore'
|
||||||
@@ -1257,6 +1257,15 @@ function ChatPage(_props: ChatPageProps) {
|
|||||||
})
|
})
|
||||||
}, [currentSessionId, navigate])
|
}, [currentSessionId, navigate])
|
||||||
|
|
||||||
|
const handleGroupAnalytics = useCallback(() => {
|
||||||
|
if (!currentSessionId || !isGroupChat(currentSessionId)) return
|
||||||
|
navigate('/group-analytics', {
|
||||||
|
state: {
|
||||||
|
preselectGroupIds: [currentSessionId]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, [currentSessionId, navigate])
|
||||||
|
|
||||||
// 确认批量转写
|
// 确认批量转写
|
||||||
const confirmBatchTranscribe = useCallback(async () => {
|
const confirmBatchTranscribe = useCallback(async () => {
|
||||||
if (!currentSessionId) return
|
if (!currentSessionId) return
|
||||||
@@ -1477,6 +1486,15 @@ function ChatPage(_props: ChatPageProps) {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="header-actions">
|
<div className="header-actions">
|
||||||
|
{isGroupChat(currentSession.username) && (
|
||||||
|
<button
|
||||||
|
className="icon-btn group-analytics-btn"
|
||||||
|
onClick={handleGroupAnalytics}
|
||||||
|
title="群聊分析"
|
||||||
|
>
|
||||||
|
<BarChart3 size={18} />
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
<button
|
<button
|
||||||
className="icon-btn export-session-btn"
|
className="icon-btn export-session-btn"
|
||||||
onClick={handleExportCurrentSession}
|
onClick={handleExportCurrentSession}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useState, useEffect, useRef, useCallback } from 'react'
|
import { useState, useEffect, useRef, useCallback, useMemo } from 'react'
|
||||||
|
import { useLocation } from 'react-router-dom'
|
||||||
import { Users, BarChart3, Clock, Image, Loader2, RefreshCw, User, Medal, Search, X, ChevronLeft, Copy, Check, Download } from 'lucide-react'
|
import { Users, BarChart3, Clock, Image, Loader2, RefreshCw, User, Medal, Search, X, ChevronLeft, Copy, Check, Download } from 'lucide-react'
|
||||||
import { Avatar } from '../components/Avatar'
|
import { Avatar } from '../components/Avatar'
|
||||||
import ReactECharts from 'echarts-for-react'
|
import ReactECharts from 'echarts-for-react'
|
||||||
@@ -30,6 +31,7 @@ interface GroupMessageRank {
|
|||||||
type AnalysisFunction = 'members' | 'ranking' | 'activeHours' | 'mediaStats'
|
type AnalysisFunction = 'members' | 'ranking' | 'activeHours' | 'mediaStats'
|
||||||
|
|
||||||
function GroupAnalyticsPage() {
|
function GroupAnalyticsPage() {
|
||||||
|
const location = useLocation()
|
||||||
const [groups, setGroups] = useState<GroupChatInfo[]>([])
|
const [groups, setGroups] = useState<GroupChatInfo[]>([])
|
||||||
const [filteredGroups, setFilteredGroups] = useState<GroupChatInfo[]>([])
|
const [filteredGroups, setFilteredGroups] = useState<GroupChatInfo[]>([])
|
||||||
const [isLoading, setIsLoading] = useState(true)
|
const [isLoading, setIsLoading] = useState(true)
|
||||||
@@ -58,11 +60,28 @@ function GroupAnalyticsPage() {
|
|||||||
const [sidebarWidth, setSidebarWidth] = useState(300)
|
const [sidebarWidth, setSidebarWidth] = useState(300)
|
||||||
const [isResizing, setIsResizing] = useState(false)
|
const [isResizing, setIsResizing] = useState(false)
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
const containerRef = useRef<HTMLDivElement>(null)
|
||||||
|
const preselectAppliedRef = useRef(false)
|
||||||
|
|
||||||
|
const preselectGroupIds = useMemo(() => {
|
||||||
|
const state = location.state as { preselectGroupIds?: unknown; preselectGroupId?: unknown } | null
|
||||||
|
const rawList = Array.isArray(state?.preselectGroupIds)
|
||||||
|
? state.preselectGroupIds
|
||||||
|
: (typeof state?.preselectGroupId === 'string' ? [state.preselectGroupId] : [])
|
||||||
|
|
||||||
|
return rawList
|
||||||
|
.filter((item): item is string => typeof item === 'string')
|
||||||
|
.map(item => item.trim())
|
||||||
|
.filter(Boolean)
|
||||||
|
}, [location.state])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
loadGroups()
|
loadGroups()
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
preselectAppliedRef.current = false
|
||||||
|
}, [location.key, preselectGroupIds])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (searchQuery) {
|
if (searchQuery) {
|
||||||
setFilteredGroups(groups.filter(g => g.displayName.toLowerCase().includes(searchQuery.toLowerCase())))
|
setFilteredGroups(groups.filter(g => g.displayName.toLowerCase().includes(searchQuery.toLowerCase())))
|
||||||
@@ -71,6 +90,20 @@ function GroupAnalyticsPage() {
|
|||||||
}
|
}
|
||||||
}, [searchQuery, groups])
|
}, [searchQuery, groups])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (preselectAppliedRef.current) return
|
||||||
|
if (groups.length === 0 || preselectGroupIds.length === 0) return
|
||||||
|
|
||||||
|
const matchedGroup = groups.find(group => preselectGroupIds.includes(group.username))
|
||||||
|
preselectAppliedRef.current = true
|
||||||
|
|
||||||
|
if (matchedGroup) {
|
||||||
|
setSelectedGroup(matchedGroup)
|
||||||
|
setSelectedFunction(null)
|
||||||
|
setSearchQuery('')
|
||||||
|
}
|
||||||
|
}, [groups, preselectGroupIds])
|
||||||
|
|
||||||
// 拖动调整宽度
|
// 拖动调整宽度
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const handleMouseMove = (e: MouseEvent) => {
|
const handleMouseMove = (e: MouseEvent) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user