import React, { useState, type FC, useEffect } from 'react' import { useParams } from 'react-router-dom' import { useTranslation } from 'react-i18next' import { Spin, Flex } from 'antd'; import type { CommunityD3Node, CommunityGraphData, RawCommunityGraphData, RawCommunityNode } from '@/components/D3Graph/types' import { buildCommunityGraphData } from '@/components/D3Graph/utils' import CommunityGraph from '@/components/D3Graph/CommunityGraph' import { getMemoryCommunityGraph } from '@/api/memory' // ─── Tooltip ────────────────────────────────────────────────────────────────── const NodeTooltip: FC<{ node: CommunityD3Node }> = ({ node }) => { const { t } = useTranslation() return (
{node.properties?.name ?? node.name}
{node.properties?.description && (
{node.properties.description}
)}
{t('userMemory.type')}: {t(`userMemory.${node.properties?.entity_type}`)}
{t('userMemory.community')}: {node.properties?.community_name}
) } // ─── Component ──────────────────────────────────────────────────────────────── const CommunityNetwork: FC<{ onSelectCommunity?: (node: RawCommunityNode) => void }> = ({ onSelectCommunity }) => { const { id } = useParams() const { t } = useTranslation() const [graphData, setGraphData] = useState(null) const [empty, setEmpty] = useState(false) const [loading, setLoading] = useState(false) useEffect(() => { if (!id) return const controller = new AbortController() setEmpty(false) setGraphData(null) setLoading(true) getMemoryCommunityGraph(id, { signal: controller.signal }).then(res => { const raw = res as RawCommunityGraphData if (!raw.nodes?.length) { setEmpty(true); return } const built = buildCommunityGraphData(raw) if (!built) { setEmpty(true); return } setGraphData(built) }).catch((e) => { if (e?.code !== 'ERR_CANCELED') setEmpty(true) }) .finally(() => setLoading(false)) return () => controller.abort() }, [id]) if (loading) { return
} return ( } /> ) } export default React.memo(CommunityNetwork)