/* * @Author: ZhaoYing * @Date: 2026-02-03 18:32:41 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-03-27 11:11:46 */ /** * Memory Insight Component * Displays memory insights including behavior patterns, key findings, and growth trajectory */ import { useEffect, useState, forwardRef, useImperativeHandle } from 'react' import { useTranslation } from 'react-i18next' import { useParams } from 'react-router-dom' import { Skeleton, Divider } from 'antd'; import clsx from 'clsx' import RbCard from '@/components/RbCard/Card' import Empty from '@/components/Empty'; import { getMemoryInsightReport, } from '@/api/memory' import type { MemoryInsightRef } from '../types' /** * Insight data structure */ interface Data { memory_insight?: string; behavior_pattern?: string; key_findings?: string[]; growth_trajectory?: string; updated_at?: number; is_cached: boolean; } const MemoryInsight = forwardRef(({ className }, ref) => { const { t } = useTranslation() const { id } = useParams() const [loading, setLoading] = useState(false) const [data, setData] = useState({} as Data) useEffect(() => { if (!id) return getData() }, [id]) /** Fetch memory insight data */ const getData = () => { if (!id) return setLoading(true) getMemoryInsightReport(id).then((res) => { setData((res as Data) || {}) setLoading(false) }) .finally(() => { setLoading(false) }) } /** Expose methods to parent component */ useImperativeHandle(ref, () => ({ getData, })); return ( {loading ? : Object.keys(data).length > 0 ?
{['memory_insight', 'key_findings', 'behavior_pattern', 'growth_trajectory'].map((key, index) => { const value = data[key as keyof Data]; if (Array.isArray(value) && value.length > 0 || (!Array.isArray(value) && value)) { return (
{index > 0 && }
{t(`userMemory.${key}`)}
{Array.isArray(data[key as keyof Data]) ? <> {(data[key as keyof Data] as string[])?.map((item: string, index: number) => (
- {item}
))} : data[key as keyof Data] as string }
) } return null })}
: }
) }) export default MemoryInsight