"use client"; import { useEffect, useState } from "react"; import { fetchKnowledgeStats } from "@/lib/api/knowledge"; import Link from "next/link"; interface KnowledgeStats { overview: { totalEntries: number; totalTags: number; totalLinks: number; publishedEntries: number; draftEntries: number; archivedEntries: number; }; mostConnected: { id: string; slug: string; title: string; incomingLinks: number; outgoingLinks: number; totalConnections: number; }[]; recentActivity: { id: string; slug: string; title: string; updatedAt: string; status: string; }[]; tagDistribution: { id: string; name: string; slug: string; color: string | null; entryCount: number; }[]; } export function StatsDashboard(): React.JSX.Element { const [stats, setStats] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { async function loadStats(): Promise { try { setIsLoading(true); const data = await fetchKnowledgeStats(); setStats(data as KnowledgeStats); } catch (err) { setError(err instanceof Error ? err.message : "Failed to load statistics"); } finally { setIsLoading(false); } } void loadStats(); }, []); if (isLoading) { return (
); } if (error || !stats) { return
Error loading statistics: {error}
; } const { overview, mostConnected, recentActivity, tagDistribution } = stats; return (

Knowledge Base Statistics

Back to Entries
{/* Overview Cards */}
{/* Two Column Layout */}
{/* Most Connected Entries */}

Most Connected Entries

{mostConnected.slice(0, 10).map((entry) => (
{entry.title}
{entry.incomingLinks} incoming • {entry.outgoingLinks} outgoing
{entry.totalConnections}
))} {mostConnected.length === 0 && (

No connections yet

)}
{/* Recent Activity */}

Recent Activity

{recentActivity.slice(0, 10).map((entry) => (
{entry.title}
{new Date(entry.updatedAt).toLocaleDateString()} •{" "} {entry.status.toLowerCase()}
))} {recentActivity.length === 0 && (

No recent activity

)}
{/* Tag Distribution */}

Tag Distribution

{tagDistribution.slice(0, 12).map((tag) => (
{tag.color && (
)} {tag.name}
{tag.entryCount}
))} {tagDistribution.length === 0 && (

No tags yet

)}
); } function StatsCard({ title, value, subtitle, icon, }: { title: string; value: number; subtitle: string; icon: string; }): React.JSX.Element { return (

{title}

{value}

{subtitle}

{icon}
); }