|
1 | | -// ChartComponent.jsx |
2 | | -import { useEffect, useState } from "react"; |
3 | | -import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from "recharts"; |
| 1 | +import {useEffect, useState} from "react"; |
| 2 | +import {CartesianGrid, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis} from "recharts"; |
| 3 | +import {getUserCreations} from "web/lib/supabase/users"; |
4 | 4 |
|
5 | 5 | export default function ChartComponent() { |
6 | 6 | const [data, setData] = useState([]); |
7 | 7 |
|
8 | 8 | useEffect(() => { |
9 | 9 | async function loadData() { |
10 | 10 | // Load some data from the backend API or Supabase |
11 | | - // const res = await fetch("http://localhost:5000/api/data"); |
12 | | - // const json = await res.json(); |
13 | | - const json: any = [ |
14 | | - { date: '2023-01-01', value: 400 }, |
15 | | - { date: '2023-02-01', value: 300 }, |
16 | | - { date: '2023-03-01', value: 500 }, |
17 | | - { date: '2023-04-01', value: 200 }, |
18 | | - { date: '2023-05-01', value: 600 }, |
19 | | - ] |
| 11 | + const data = await getUserCreations() |
| 12 | + let counts: { [date: string]: number } = {} |
| 13 | + data.forEach((d) => { |
| 14 | + const date = new Date(d.created_time).toISOString().split('T')[0] |
| 15 | + counts[date] = (counts[date] || 0) + 1 |
| 16 | + }) |
| 17 | + const json: any = Object.entries(counts).map(([date, value]) => ({date, value})) |
| 18 | + let prev = 0 |
| 19 | + for (let i = 0; i < json.length; i++) { |
| 20 | + json[i].value += prev |
| 21 | + prev = json[i].value |
| 22 | + } |
| 23 | + json.sort((a: any, b: any) => a.date.localeCompare(b.date)) |
| 24 | + |
| 25 | + // Example static data |
| 26 | + // const json: any = [ |
| 27 | + // { date: '2023-01-01', value: 400 }, |
| 28 | + // { date: '2023-02-01', value: 300 }, |
| 29 | + // { date: '2023-03-01', value: 500 }, |
| 30 | + // { date: '2023-04-01', value: 200 }, |
| 31 | + // { date: '2023-05-01', value: 600 }, |
| 32 | + // ] |
20 | 33 | setData(json); |
21 | 34 | } |
| 35 | + |
22 | 36 | loadData(); |
23 | 37 | }, []); |
24 | 38 |
|
25 | 39 | return ( |
26 | 40 | <ResponsiveContainer width="100%" height={400}> |
27 | 41 | <LineChart data={data}> |
28 | | - <CartesianGrid strokeDasharray="3 3" /> |
29 | | - <XAxis dataKey="date" /> |
30 | | - <YAxis /> |
31 | | - <Tooltip /> |
32 | | - <Line type="monotone" dataKey="value" stroke="#2563eb" strokeWidth={2} /> |
| 42 | + <CartesianGrid strokeDasharray="3 3"/> |
| 43 | + <XAxis dataKey="date" label={{value: "Date", position: "insideBottomRight", offset: -5}}/> |
| 44 | + <YAxis label={{value: "Number of Members", angle: -90, position: "insideLeft"}}/> |
| 45 | + <Tooltip |
| 46 | + contentStyle={{ |
| 47 | + backgroundColor: "rgb(var(--color-canvas-100))", |
| 48 | + border: "none", |
| 49 | + borderRadius: "8px", |
| 50 | + color: "rgb(var(--color-primary-900))", |
| 51 | + }} |
| 52 | + labelStyle={{ |
| 53 | + color: "rgb(var(--color-primary-900))", |
| 54 | + }} |
| 55 | + /> |
| 56 | + <Line |
| 57 | + type="monotone" |
| 58 | + dataKey="value" |
| 59 | + stroke="rgb(var(--color-primary-900))" |
| 60 | + strokeWidth={2} |
| 61 | + /> |
33 | 62 | </LineChart> |
34 | 63 | </ResponsiveContainer> |
35 | 64 | ); |
|
0 commit comments