import { useState, forwardRef, useImperativeHandle, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { Row, Col, Tabs, Space, Skeleton } from 'antd' import { getRelationshipEvolution, getTimelineMemories } from '@/api/memory' import type { Node, GraphDetailRef } from '../types' import RbDrawer from '@/components/RbDrawer' import RbCard from '@/components/RbCard/Card' import EmotionLine from './EmotionLine' import { formatDateTime } from '@/utils/format' import Tag from '@/components/Tag' import InteractionBar from './InteractionBar' import Empty from '@/components/Empty' 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 [open, setOpen] = useState(false); 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: []}) const handleCancel = () => { setVo(null) setOpen(false) } const handleOpen = (vo: Node) => { setActiveTab('timelines_memory') setOpen(true) 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 (
{t('userMemory.relationshipEvolution')}
{t('userMemory.timelineMemories')}
({ 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}
))}
}
) }) export default GraphDetail