import { useState, forwardRef, useImperativeHandle, useMemo, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { useSearchParams, useNavigate } from 'react-router-dom' import { Row, Col, Flex, Space, Skeleton, Button } from 'antd' import { getRelationshipEvolution, getTimelineMemories } from '@/api/memory' import type { Node, GraphDetailRef } from '../types' import RbCard from '@/components/RbCard/Card' import EmotionLine from '../components/EmotionLine' import { formatDateTime } from '@/utils/format' import Tag from '@/components/Tag' import InteractionBar from '../components/InteractionBar' import Empty from '@/components/Empty' import PageHeader from '@/components/Layout/PageHeader' import BtnTabs from '@/components/BtnTabs' export interface Emotion { emotion_intensity: number; emotion_type: string; created_at: string | number; } export interface Interaction { created_at: string | number; count: number; } interface TimelineMemory { text: string; type: string; created_at: number | string; } interface Timeline { MemorySummary: TimelineMemory[]; Statement: TimelineMemory[]; ExtractedEntity: TimelineMemory[]; timelines_memory: TimelineMemory[]; } const GraphDetail = forwardRef((_props, ref) => { const { t } = useTranslation() const navigate = useNavigate() const [searchParams] = useSearchParams() const [vo, setVo] = useState(null) const [loading, setLoading] = useState(false) const [emotionData, setEmotionData] = useState([]) const [interactionData, setInteractionData] = useState([]) const [activeTab, setActiveTab] = useState('timelines_memory') const [timelineLoading, setTimelineLoading] = useState(false) const [timelineMemories, setTimelineMemories] = useState({ timelines_memory: [], MemorySummary: [], Statement: [], ExtractedEntity: []}) useEffect(() => { const nodeId = searchParams.get('nodeId') const nodeLabel = searchParams.get('nodeLabel') const nodeName = searchParams.get('nodeName') if (nodeId && nodeLabel) { const nodeFromUrl = { id: nodeId, label: nodeLabel, name: nodeName || nodeLabel } handleOpen(nodeFromUrl as Node) } }, [searchParams]) const handleOpen = (vo: Node) => { setActiveTab('timelines_memory') setVo(vo) getRelationshipEvolutionData(vo) getTimelineMemoriesData(vo) } const getRelationshipEvolutionData = (vo: Node) => { if (!vo.id || !vo.label) return setLoading(true) getRelationshipEvolution({ id: vo.id as string, label: vo.label }) .then(res => { const { emotion, interaction } = res as { emotion: Emotion[]; interaction: Interaction[] } || {} setEmotionData(emotion) setInteractionData(interaction) }) .finally(() => setLoading(false)) } const getTimelineMemoriesData = (vo: Node) => { if (!vo.id || !vo.label) return setTimelineLoading(true) getTimelineMemories({ id: vo.id as string, label: vo.label }) .then(res => { setTimelineMemories(res as Timeline) }) .finally(() => setTimelineLoading(false)) } useImperativeHandle(ref, () => ({ handleOpen, })); const activeContent = useMemo(() => { return timelineMemories[activeTab as keyof Timeline] || [] }, [activeTab, timelineMemories]) return ( <> } /> ({ label: t(`userMemory.${key}`), key }))} onChange={(key: string) => setActiveTab(key)} />
{timelineLoading ? : !activeContent || activeContent.length === 0 ? : {activeContent.map((vo, index) => (
{formatDateTime(vo.created_at)}
{vo.type}
{vo.text}
))}
}
) }) export default GraphDetail