'use client'; import { useEffect, useState } from 'react'; import { Network, FileText, AlertCircle } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'; import { useGraphData } from '@/hooks/useGraphData'; import { GraphVisualization } from '@/components/graph/GraphVisualization'; import { useGraphStore } from '@/store/graph'; import api from '@/lib/axios'; interface Community { id: number; label: string; entityCount: number; relationshipCount: number; summary: string; keyEntities: string[]; } export function CommunityView() { const { error: graphError } = useGraphData(); const [communities, setCommunities] = useState([]); const [docSummary, setDocSummary] = useState(''); const [loading, setLoading] = useState(true); const [fetchError, setFetchError] = useState(null); const [tab, setTab] = useState('cards'); const selectEntity = useGraphStore((s) => s.selectEntity); const setHighlighted = useGraphStore((s) => s.setHighlighted); useEffect(() => { let pollTimer: ReturnType; function fetchCommunities() { setLoading(true); api .get('/graph/communities/') .then(({ data }) => { const isGenerating = data.loading === true; if (isGenerating) { // Backend is generating in background — poll again in 15s setLoading(true); pollTimer = setTimeout(fetchCommunities, 15000); return; } const c = data.communities || data.results || data; if (Array.isArray(c) && c.length) { setCommunities( c.map((x: any) => ({ id: x.id, label: x.label || `Community ${x.id}`, entityCount: x.member_count ?? x.entity_count ?? x.entityCount ?? 0, relationshipCount: x.relationship_count ?? x.relationshipCount ?? 0, summary: x.summary || '', keyEntities: x.members ?? x.key_entities ?? x.keyEntities ?? [], })) ); setDocSummary(data.document_summary || data.summary || ''); } setFetchError(null); setLoading(false); }) .catch(() => { setFetchError('Failed to load communities. Backend may be unavailable.'); setLoading(false); }); } fetchCommunities(); return () => { if (pollTimer) clearTimeout(pollTimer); }; }, []); function expand(id: number) { const c = communities.find((x) => x.id === id); if (c && c.keyEntities.length) { setHighlighted(c.keyEntities, []); setTab('graph'); } } return (
Cards Graph
{graphError && (
{graphError}
)} {fetchError && (
{fetchError}
)} {docSummary && ( {docSummary} )} {loading ? (

Generating communities from your knowledge graph…

This may take up to 30 seconds. Page will auto-refresh.

) : communities.length === 0 ? (
No communities found. Upload documents to generate communities.
) : (
{communities.map((c) => (

{c.label}

{c.entityCount} entities {c.relationshipCount} relationships

{c.summary}

{c.keyEntities.map((e) => ( {e} ))}
))}
)}
); }