"use client"; import { useTranslations } from "next-intl"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; interface PeakHoursData { /** [dayOfWeek (0=Mon..6=Sun)][hour (0..23)] = count */ grid: number[][]; max: number; } const DAY_KEYS = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"] as const; const HOURS = Array.from({ length: 24 }, (_, i) => i); function getColor(value: number, max: number) { if (max === 0 || value === 0) return "bg-muted"; const ratio = value / max; if (ratio < 0.25) return "bg-[var(--admin-success)]/20"; if (ratio < 0.5) return "bg-[var(--admin-success)]/55"; if (ratio < 0.75) return "bg-[var(--admin-success)] dark:bg-[var(--admin-success)]"; return "bg-[var(--admin-success-strong,var(--admin-success))]"; } export function PeakHoursHeatmap({ data }: { data: PeakHoursData }) { const t = useTranslations("pages.admin.analytics.peakHours"); const days = DAY_KEYS.map((key) => t(`days.${key}`)); return ( {t("title")}

{t("description")}

{/* Hour labels */}
{HOURS.map((h) => (
{h % 3 === 0 ? `${h}` : ""}
))}
{/* Rows */} {days.map((day, dayIdx) => (
{day} {HOURS.map((hour) => { const count = data.grid[dayIdx]?.[hour] ?? 0; return (
{t("tooltip", { day, hour, count })} ); })}
))} {/* Legend */}
{t("less")}
{t("more")}
); }