/* * @Author: ZhaoYing * @Date: 2026-01-07 20:37:34 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-03-16 11:22:20 */ import { type FC, useState, useMemo, useRef } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { useTranslation } from 'react-i18next' import { Dropdown, Button, Flex, Space } from 'antd' import PageHeader from '@/components/Layout/PageHeader' import StatementDetail from './StatementDetail' import ForgetDetail from './ForgetDetail' import ImplicitDetail from './ImplicitDetail' import ShortTermDetail from './ShortTermDetail' import PerceptualDetail from './PerceptualDetail' import EpisodicDetail from './EpisodicDetail' import ExplicitDetail from './ExplicitDetail' import WorkingDetail from './WorkingDetail' import GraphDetail from './GraphDetail' /** * Detail page for user memory - renders different memory type views * based on the `type` route param */ const Detail: FC = () => { const { t } = useTranslation() const { id, type } = useParams() const navigate = useNavigate() // Refs for child components that support imperative refresh const forgetDetailRef = useRef<{ handleRefresh: () => void }>(null) const statementDetailRef = useRef<{ handleRefresh: () => void }>(null) const implicitDetailRef = useRef<{ handleRefresh: () => void }>(null) // Build dropdown menu items for switching between memory types const items = useMemo(() => { return ['PERCEPTUAL_MEMORY', 'WORKING_MEMORY', 'EMOTIONAL_MEMORY', 'SHORT_TERM_MEMORY', 'IMPLICIT_MEMORY', 'EPISODIC_MEMORY', 'EXPLICIT_MEMORY', 'FORGET_MEMORY'] .map(key => ({ key, label: t(`userMemory.${key}`) })) }, [t]) // Navigate to the selected memory type detail page const onClick = ({ key }: { key: string }) => { navigate(`/user-memory/detail/${id}/${key}`, { replace: true }) } const [loading, setLoading] = useState(false) // Trigger refresh on the active memory type's child component const handleRefresh = () => { setLoading(true) let response: any = null switch(type) { case 'FORGET_MEMORY': forgetDetailRef.current?.handleRefresh() break; case 'EMOTIONAL_MEMORY': response = statementDetailRef.current?.handleRefresh() break case 'IMPLICIT_MEMORY': response = implicitDetailRef.current?.handleRefresh() break } // If the child returns a Promise, wait for it before clearing loading state if (response instanceof Promise) { response.finally(() => { setLoading(false) }) } else { setLoading(false) } } if (type === 'GRAPH') { return } const handleGoBack = () => { navigate(`/user-memory/neo4j/${id}`, { replace: true }) } return (
{type ? t(`userMemory.${type}`) : ''}
} extra={ {['FORGET_MEMORY', 'EMOTIONAL_MEMORY', 'IMPLICIT_MEMORY'].includes(type as string) &&
} onClick={handleRefresh} > {t('common.refresh')} } } />
{type === 'EMOTIONAL_MEMORY' && } {type === 'FORGET_MEMORY' && } {type === 'IMPLICIT_MEMORY' && } {type === 'SHORT_TERM_MEMORY' && } {type === 'PERCEPTUAL_MEMORY' && } {type === 'EPISODIC_MEMORY' && } {type === 'WORKING_MEMORY' && } {type === 'EXPLICIT_MEMORY' && }
) } export default Detail