'use client'; import { useTranslations } from 'next-intl'; import { RankChart } from '@/components/data/rank-chart'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import type { DistributionItem, TrafficDistributions, } from '@/lib/services/openflare'; function toRankItems(items: DistributionItem[]) { return items.map((item) => ({ label: item.key, value: item.value, })); } export function SourceDistributionChart({ items, }: { items: TrafficDistributions['source_countries']; }) { const t = useTranslations('dashboard.distributions'); return ( {t('sourceTitle')} {t('sourceDesc')} ); } export function StatusCodeDistributionChart({ items, }: { items: TrafficDistributions['status_codes']; }) { const t = useTranslations('dashboard.distributions'); return ( {t('statusTitle')} {t('statusDesc')} ({ ...item, label: t('httpLabel', { code: item.label }), }))} color='#f59e0b' emptyMessage={t('statusEmpty')} /> ); } export function TopDomainChart({ items, }: { items: TrafficDistributions['top_domains']; }) { const t = useTranslations('dashboard.distributions'); return ( {t('domainTitle')} {t('domainDesc')} ); }