import { TABLE_NAMES, chQuery } from '@openpanel/db'; import { cacheable } from '@openpanel/redis'; import Link from 'next/link'; import { Suspense } from 'react'; import { VerticalLine } from '../line'; import { PlusLine } from '../line'; import { HorizontalLine } from '../line'; import { Section } from '../section'; import { Button } from '../ui/button'; import { WorldMap } from '../world-map'; function shortNumber(num: number) { if (num < 1e3) return num; if (num >= 1e3 && num < 1e6) return `${+(num / 1e3).toFixed(1)}K`; if (num >= 1e6 && num < 1e9) return `${+(num / 1e6).toFixed(1)}M`; if (num >= 1e9 && num < 1e12) return `${+(num / 1e9).toFixed(1)}B`; if (num >= 1e12) return `${+(num / 1e12).toFixed(1)}T`; } const getProjectsWithCount = cacheable(async function getProjectsWithCount() { const projects = await chQuery<{ project_id: string; count: number }>( `SELECT project_id, count(*) as count from ${TABLE_NAMES.events} GROUP by project_id order by count()`, ); const last24h = await chQuery<{ count: number }>( `SELECT count(*) as count from ${TABLE_NAMES.events} WHERE created_at > now() - interval '24 hours'`, ); return { projects, last24hCount: last24h[0]?.count || 0 }; }, 60 * 60); export async function Stats() { const { projects, last24hCount } = await getProjectsWithCount(); const projectCount = projects.length; const eventCount = projects.reduce((acc, { count }) => acc + count, 0); return ( ); } export function StatsPure({ projectCount, eventCount, last24hCount, }: { projectCount: number; eventCount: number; last24hCount: number }) { return (
{/* Map */}
{/* Gradient over Map */}
Active projects
{projectCount}
Total events
{shortNumber(eventCount)}
Events last 24 h
{shortNumber(last24hCount)}

Get the analytics you deserve

); }