GodSpeed / frontend /src /components /analytics /TopicsBarChart.tsx
Samyuktha24's picture
feat: add Zustand stores for filters and UI state management
9dfccd9
import { useQuery } from '@tanstack/react-query'
import {
BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer,
} from 'recharts'
import { apiFetch } from '@/lib/http'
import { LoadingSkeleton } from '@/components/common/LoadingSkeleton'
interface Topic { topic: string; count: number }
async function fetchTopics(): Promise<{ topics: Topic[] }> {
const res = await apiFetch('/api/analytics/topics?limit=10')
return res.json()
}
export function TopicsBarChart() {
const { data, isLoading } = useQuery({ queryKey: ['analytics-topics'], queryFn: fetchTopics, staleTime: 300_000 })
return (
<div className="rounded-xl border border-surface-subtle p-5">
<p className="mb-4 text-sm font-medium text-stone-500">Top Query Topics</p>
{isLoading ? (
<LoadingSkeleton rows={3} />
) : (
<ResponsiveContainer width="100%" height={200}>
<BarChart data={data?.topics ?? []} layout="vertical">
<CartesianGrid strokeDasharray="3 3" stroke="#e7e5e4" horizontal={false} />
<XAxis type="number" tick={{ fontSize: 10 }} />
<YAxis type="category" dataKey="topic" tick={{ fontSize: 11 }} width={140} />
<Tooltip />
<Bar dataKey="count" fill="#b45309" radius={[0, 4, 4, 0]} />
</BarChart>
</ResponsiveContainer>
)}
</div>
)
}