admin-overview.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use client'
  2. import Link from 'next/link'
  3. import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
  4. import { useTranslations } from 'next-intl'
  5. import { Building2, CreditCard, Users } from 'lucide-react'
  6. type AdminStats = {
  7. totalUsers: number
  8. totalOrganizations: number
  9. totalActiveSubscriptions: number
  10. }
  11. export function AdminOverview({ stats }: { stats: AdminStats }) {
  12. const t = useTranslations('admin')
  13. const cards = [
  14. {
  15. title: t('overview.totalUsers'),
  16. value: stats.totalUsers,
  17. icon: Users,
  18. href: '/admin/users',
  19. },
  20. {
  21. title: t('overview.organizations'),
  22. value: stats.totalOrganizations,
  23. icon: Building2,
  24. href: '/admin/organizations',
  25. },
  26. {
  27. title: t('overview.activeSubscriptions'),
  28. value: stats.totalActiveSubscriptions,
  29. icon: CreditCard,
  30. href: '/admin/organizations',
  31. },
  32. ]
  33. return (
  34. <div className="grid gap-4 sm:grid-cols-3">
  35. {cards.map((card) => (
  36. <Link key={card.title} href={card.href}>
  37. <Card className="transition-colors hover:bg-muted/50 cursor-pointer">
  38. <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
  39. <CardTitle className="text-sm font-medium">{card.title}</CardTitle>
  40. <card.icon className="h-4 w-4 text-muted-foreground" />
  41. </CardHeader>
  42. <CardContent>
  43. <div className="text-2xl font-bold">{card.value}</div>
  44. </CardContent>
  45. </Card>
  46. </Link>
  47. ))}
  48. </div>
  49. )
  50. }