|
1 | 1 | "use client";
|
2 |
| -import Charts from "@/components/statstable"; |
| 2 | +import { useContext } from "react"; |
| 3 | +import { AuthContext } from "@/contexts/auth-context"; |
| 4 | +import { useOrgStats } from "@/hooks/use-org-stats"; |
| 5 | +import { useParams } from "next/navigation"; |
| 6 | +import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert"; |
| 7 | +import { AlertCircle } from "lucide-react"; |
| 8 | +import { Skeleton } from "@/components/ui/skeleton"; |
| 9 | +import StatCard from "@/components/stat-card"; |
3 | 10 |
|
4 |
| -interface ChartData { |
5 |
| - submissions: { |
6 |
| - total: number; |
7 |
| - weeklyData: Array<{ |
8 |
| - date: string; |
9 |
| - steps: number; |
10 |
| - }>; |
11 |
| - weeklyTotal: number; |
12 |
| - }; |
13 |
| - upcomingContest: { |
14 |
| - count: number; |
15 |
| - variability: number; |
16 |
| - weeklyData: Array<{ |
17 |
| - date: string; |
18 |
| - resting: number; |
19 |
| - }>; |
20 |
| - }; |
21 |
| - contestDetails: { |
22 |
| - currentYear: { |
23 |
| - year: string; |
24 |
| - contestsPerDay: number; |
25 |
| - }; |
26 |
| - previousYear: { |
27 |
| - year: string; |
28 |
| - contestsPerDay: number; |
29 |
| - }; |
30 |
| - }; |
| 11 | +function StatsLoadingSkeleton() { |
| 12 | + return ( |
| 13 | + <div className="container mx-auto max-w-5xl py-6"> |
| 14 | + <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3"> |
| 15 | + {[1, 2, 3, 4].map((i) => ( |
| 16 | + <div key={i} className="p-4 border rounded-lg"> |
| 17 | + <Skeleton className="h-4 w-24 mb-2" /> |
| 18 | + <Skeleton className="h-8 w-16" /> |
| 19 | + </div> |
| 20 | + ))} |
| 21 | + </div> |
| 22 | + </div> |
| 23 | + ); |
31 | 24 | }
|
32 | 25 |
|
33 | 26 | export default function GraphicsPage() {
|
34 |
| - const chartData: ChartData = { |
35 |
| - submissions: { |
36 |
| - total: 12584, |
37 |
| - weeklyData: [ |
38 |
| - { date: "2024-01-01", steps: 2000 }, |
39 |
| - { date: "2024-01-02", steps: 2100 }, |
40 |
| - { date: "2024-01-03", steps: 2200 }, |
41 |
| - { date: "2024-01-04", steps: 2300 }, |
42 |
| - { date: "2024-01-05", steps: 2400 }, |
43 |
| - { date: "2024-01-06", steps: 2500 }, |
44 |
| - { date: "2024-01-07", steps: 2600 }, |
45 |
| - // ... more data |
46 |
| - ], |
47 |
| - weeklyTotal: 5305, |
48 |
| - }, |
49 |
| - upcomingContest: { |
50 |
| - count: 62, |
51 |
| - variability: 35, |
52 |
| - weeklyData: [ |
53 |
| - { date: "2024-01-01", resting: 62 }, |
54 |
| - { date: "2024-01-02", resting: 63 }, |
55 |
| - { date: "2024-01-03", resting: 64 }, |
56 |
| - { date: "2024-01-04", resting: 65 }, |
57 |
| - { date: "2024-01-05", resting: 66 }, |
58 |
| - { date: "2024-01-06", resting: 67 }, |
59 |
| - { date: "2024-01-07", resting: 68 }, |
| 27 | + const { user } = useContext(AuthContext); |
| 28 | + const params = useParams(); |
| 29 | + const orgId = params.orgId as string; |
| 30 | + |
| 31 | + const currentOrg = user?.orgs.find((org) => org.nameId === orgId); |
| 32 | + const { stats, loading, error } = useOrgStats(orgId, currentOrg?.role); |
60 | 33 |
|
61 |
| - // ... more data |
62 |
| - ], |
63 |
| - }, |
64 |
| - contestDetails: { |
65 |
| - currentYear: { |
66 |
| - year: "2024", |
67 |
| - contestsPerDay: 12453, |
68 |
| - }, |
69 |
| - previousYear: { |
70 |
| - year: "2023", |
71 |
| - contestsPerDay: 10103, |
72 |
| - }, |
73 |
| - }, |
74 |
| - }; |
| 34 | + if (loading) return <StatsLoadingSkeleton />; |
| 35 | + if (error) |
| 36 | + return ( |
| 37 | + <Alert variant="destructive" className="max-w-lg mx-auto my-4"> |
| 38 | + <AlertCircle className="h-4 w-4" /> |
| 39 | + <AlertTitle>Error</AlertTitle> |
| 40 | + <AlertDescription>{error}</AlertDescription> |
| 41 | + </Alert> |
| 42 | + ); |
75 | 43 |
|
76 | 44 | return (
|
77 |
| - <div> |
78 |
| - <Charts data={chartData} /> |
| 45 | + <div className="container mx-auto max-w-5xl py-6"> |
| 46 | + <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3"> |
| 47 | + <StatCard |
| 48 | + heading="Total Contests" |
| 49 | + value={stats.totalContests} |
| 50 | + unit="contests" |
| 51 | + /> |
| 52 | + <StatCard |
| 53 | + heading="Upcoming Contests" |
| 54 | + value={stats.upcomingContests} |
| 55 | + unit="contests" |
| 56 | + /> |
| 57 | + <StatCard |
| 58 | + heading="Ended Contests" |
| 59 | + value={stats.endedContests} |
| 60 | + unit="contests" |
| 61 | + /> |
| 62 | + {currentOrg?.role === "owner" && ( |
| 63 | + <StatCard |
| 64 | + heading="Total Members" |
| 65 | + value={stats.totalMembers} |
| 66 | + unit="members" |
| 67 | + /> |
| 68 | + )} |
| 69 | + </div> |
79 | 70 | </div>
|
80 | 71 | );
|
81 | 72 | }
|
0 commit comments