import { type FC, useEffect, useState, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useParams } from 'react-router-dom' import ReactEcharts from 'echarts-for-react' import { Progress } from 'antd' import Empty from '@/components/Empty' import RbCard from '@/components/RbCard/Card' import { getEmotionTags } from '@/api/memory' interface WordCloud { tags: Array<{ emotion_type: string; count: number; percentage: number; avg_intensity: number; }>; total_count: number; } const WordCloud: FC = () => { const { t } = useTranslation() const { id } = useParams() const chartRef = useRef(null); const resizeScheduledRef = useRef(false) const [wordCloud, setWordCloud] = useState(null) useEffect(() => { getWordCloudData() }, [id]) useEffect(() => { const handleResize = () => { if (chartRef.current && !resizeScheduledRef.current) { resizeScheduledRef.current = true requestAnimationFrame(() => { chartRef.current?.getEchartsInstance().resize(); resizeScheduledRef.current = false }); } } const resizeObserver = new ResizeObserver(handleResize) const chartElement = chartRef.current?.getEchartsInstance().getDom().parentElement if (chartElement) { resizeObserver.observe(chartElement) } return () => { resizeObserver.disconnect() } }, [wordCloud]) const getWordCloudData = () => { if (!id) { return } getEmotionTags(id) .then((res) => { setWordCloud(res as WordCloud) }) } const radarOption = useMemo(() => { if (!wordCloud?.tags.length) return {} // 将avg_intensity转换为1-100范围 const radarData = wordCloud.tags.map(item => ({ name: item.emotion_type, value: Math.round(item.avg_intensity * 100), count: item.count, percentage: item.percentage })) return { tooltip: { trigger: 'item', formatter: (params: any) => { const dataIndex = params.dataIndex const item = radarData[dataIndex] return `${item.name}
${item.percentage.toFixed(1)}%` } }, radar: { indicator: radarData.map(item => ({ name: t(`emotionDetail.${item.name}`), max: 100, min: 1 })) }, series: [{ type: 'radar', name: 'Emotion Intensity', data: [{ value: radarData.map(item => item.value), name: 'Emotion Intensity' }] }] } }, [wordCloud]) return ( {wordCloud ?
样本数:{wordCloud.total_count}
{wordCloud.tags.map(item => (
{t(`emotionDetail.${item.emotion_type}`)}
{item.count}{t('emotionDetail.pieces')}
))}
: }
) } export default WordCloud