Untitled

 avatar
unknown
plain_text
a month ago
3.6 kB
4
Indexable
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { DateRangeSelect } from "@/components/DateRangeSelect";
import { useState } from "react";
import { formatDate, type DateRange, isWithinRange } from "@/lib/utils/date";
import type { Metrics } from "@/types/metrics";
import {
  AreaChart,
  Area,
  XAxis,
  YAxis,
  CartesianGrid,
  Tooltip,
  ResponsiveContainer,
  BarChart,
  Bar,
} from "recharts";

interface UsageAnalyticsProps {
  metrics: Metrics;
}

export function UsageAnalytics({ metrics }: UsageAnalyticsProps) {
  const [dateRange, setDateRange] = useState<DateRange>('7d');

  const dailyUsageData = Object.entries(metrics.time_metrics.daily_usage_counts)
    .map(([date, count]) => ({
      date: formatDate(date),
      count,
    }))
    .filter(item => isWithinRange(item.date, dateRange))
    .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime());

  const hourlyPatternData = metrics.time_metrics.time_of_day_patterns.map(
    (count, hour) => ({
      hour: `${hour}:00`,
      count,
    })
  );

  return (
    <div className="space-y-8">
      <div className="flex justify-between items-center">
        <h1 className="text-3xl font-bold">Usage Analytics</h1>
        <DateRangeSelect value={dateRange} onChange={setDateRange} />
      </div>

      <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
        <Card>
          <CardHeader>
            <CardTitle>Daily Streak</CardTitle>
          </CardHeader>
          <CardContent>
            <p className="text-3xl font-bold">
              {metrics.time_metrics.daily_weekly_monthly_streaks.daily} days
            </p>
          </CardContent>
        </Card>

        <Card>
          <CardHeader>
            <CardTitle>Weekly Streak</CardTitle>
          </CardHeader>
          <CardContent>
            <p className="text-3xl font-bold">
              {metrics.time_metrics.daily_weekly_monthly_streaks.weekly} weeks
            </p>
          </CardContent>
        </Card>

        <Card>
          <CardHeader>
            <CardTitle>Monthly Streak</CardTitle>
          </CardHeader>
          <CardContent>
            <p className="text-3xl font-bold">
              {metrics.time_metrics.daily_weekly_monthly_streaks.monthly} months
            </p>
          </CardContent>
        </Card>
      </div>

      <Card>
        <CardHeader>
          <CardTitle>Daily Usage Trend</CardTitle>
        </CardHeader>
        <CardContent className="h-[400px]">
          <ResponsiveContainer width="100%" height="100%">
            <AreaChart data={dailyUsageData}>
              <CartesianGrid strokeDasharray="3 3" />
              <XAxis dataKey="date" />
              <YAxis />
              <Tooltip />
              <Area
                type="monotone"
                dataKey="count"
                stroke="#8884d8"
                fill="#8884d8"
                fillOpacity={0.3}
              />
            </AreaChart>
          </ResponsiveContainer>
        </CardContent>
      </Card>

      <Card>
        <CardHeader>
          <CardTitle>Hourly Usage Pattern</CardTitle>
        </CardHeader>
        <CardContent className="h-[400px]">
          <ResponsiveContainer width="100%" height="100%">
            <BarChart data={hourlyPatternData}>
              <CartesianGrid strokeDasharray="3 3" />
              <XAxis dataKey="hour" />
              <YAxis />
              <Tooltip />
              <Bar dataKey="count" fill="#82ca9d" />
            </BarChart>
          </ResponsiveContainer>
        </CardContent>
      </Card>
    </div>
  );
}
Leave a Comment