"use client"; import * as React from "react"; import { useState } from "react"; import { useTranslations } from "next-intl"; import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from "recharts"; import useSWR from "swr"; import { DATE_DIMENSION_ENUMS } from "@/lib/enums"; import { cn, fetcher, nFormatter } from "@/lib/utils"; import { useElementSize } from "@/hooks/use-element-size"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart"; import { Select, SelectContent, SelectItem, SelectSeparator, SelectTrigger, SelectValue, } from "../ui/select"; import { Skeleton } from "../ui/skeleton"; const chartConfig = { views: { label: "Create", }, records: { label: "Records", color: "hsl(var(--chart-2))", }, urls: { label: "URLs", color: "hsl(var(--chart-1))", }, users: { label: "Users", color: "hsl(var(--chart-1))", }, emails: { label: "Emails", color: "hsl(var(--chart-2))", }, inbox: { label: "Inbox", color: "hsl(var(--chart-1))", }, sends: { label: "Sends", color: "hsl(var(--chart-2))", }, } satisfies ChartConfig; export function InteractiveBarChart() { const { ref: wrapperRef, width: wrapperWidth } = useElementSize(); const [timeRange, setTimeRange] = useState("7d"); const [activeChart, setActiveChart] = React.useState("users"); const t = useTranslations("Components"); const { data, isLoading } = useSWR<{ list: [ { records: number; urls: number; users: number; emails: number; inbox: number; sends: number; date: string; }, ]; total: { records: number; urls: number; users: number; emails: number; inbox: number; sends: number; }; growthRates: { records: number; urls: number; users: number; emails: number; inbox: number; sends: number; }; }>(`api/admin?range=${timeRange}`, fetcher, { revalidateOnFocus: false, dedupingInterval: 60000, }); if (isLoading) return ; if (!data) return null; return (
{t("Data Increase")} {t("Showing data increase in")}:
{["users", "records", "urls", "emails", "inbox", "sends"].map( (key) => { const chart = key as keyof typeof chartConfig; const growthRate = data.growthRates[key as keyof typeof data.growthRates]; return ( ); }, )}
{ const date = new Date(value); return date.toLocaleDateString("en-US", { month: "short", day: "numeric", }); }} /> { return new Date(value).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", }); }} /> } />
); }