Skip to content

Commit 1421d34

Browse files
authored
Merge pull request #83 from codegasms/feat/dynamic-sidebar-by-role
Make sidebar dynamic based on current user role
2 parents faeb566 + 58e2837 commit 1421d34

File tree

3 files changed

+303
-158
lines changed

3 files changed

+303
-158
lines changed

app/[orgId]/page.tsx

+61-70
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,72 @@
11
"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";
310

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+
);
3124
}
3225

3326
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);
6033

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+
);
7543

7644
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>
7970
</div>
8071
);
8172
}

0 commit comments

Comments
 (0)