Skip to content

Commit 25b6381

Browse files
authored
Merge pull request #5 from CachyOS/next
feat: new build time and memory usage charts
2 parents 0c765dd + edcf101 commit 25b6381

File tree

10 files changed

+579
-289
lines changed

10 files changed

+579
-289
lines changed

bun.lock

Lines changed: 148 additions & 128 deletions
Large diffs are not rendered by default.

package.json

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,65 @@
11
{
22
"dependencies": {
3-
"@hookform/resolvers": "^5.2.0",
4-
"@marsidev/react-turnstile": "1.1.0",
3+
"@hookform/resolvers": "^5.2.2",
4+
"@marsidev/react-turnstile": "1.3.1",
55
"@radix-ui/react-avatar": "^1.1.10",
6-
"@radix-ui/react-checkbox": "^1.3.2",
7-
"@radix-ui/react-collapsible": "^1.1.11",
8-
"@radix-ui/react-dialog": "^1.1.14",
9-
"@radix-ui/react-dropdown-menu": "^2.1.15",
10-
"@radix-ui/react-hover-card": "^1.1.14",
6+
"@radix-ui/react-checkbox": "^1.3.3",
7+
"@radix-ui/react-collapsible": "^1.1.12",
8+
"@radix-ui/react-dialog": "^1.1.15",
9+
"@radix-ui/react-dropdown-menu": "^2.1.16",
10+
"@radix-ui/react-hover-card": "^1.1.15",
1111
"@radix-ui/react-label": "^2.1.7",
12-
"@radix-ui/react-popover": "^1.1.14",
13-
"@radix-ui/react-select": "^2.2.5",
12+
"@radix-ui/react-popover": "^1.1.15",
13+
"@radix-ui/react-select": "^2.2.6",
1414
"@radix-ui/react-separator": "^1.1.7",
1515
"@radix-ui/react-slot": "^1.2.3",
16-
"@radix-ui/react-switch": "^1.2.5",
17-
"@radix-ui/react-tooltip": "^1.2.7",
18-
"@tabler/icons-react": "3.34.1",
16+
"@radix-ui/react-switch": "^1.2.6",
17+
"@radix-ui/react-tooltip": "^1.2.8",
18+
"@tabler/icons-react": "3.35.0",
1919
"@tanstack/react-table": "^8.21.3",
2020
"@xterm/addon-fit": "0.10.0",
2121
"@xterm/addon-search": "0.15.0",
2222
"@xterm/addon-web-links": "0.11.0",
2323
"@xterm/addon-webgl": "0.18.0",
24-
"ansi-styles": "6.2.1",
24+
"ansi-styles": "6.2.3",
2525
"class-variance-authority": "^0.7.1",
2626
"clsx": "^2.1.1",
2727
"cmdk": "^1.1.1",
2828
"iron-session": "8.0.4",
29-
"lucide-react": "^0.526.0",
30-
"next": "15.4.4",
29+
"lucide-react": "^0.545.0",
30+
"next": "15.5.4",
3131
"next-themes": "^0.4.6",
32-
"react": "^19.1.0",
33-
"react-dom": "^19.1.0",
34-
"react-hook-form": "7.61.1",
35-
"recharts": "^3.1.0",
36-
"sonner": "^2.0.6",
37-
"strip-ansi": "7.1.0",
32+
"pretty-bytes": "7.1.0",
33+
"pretty-ms": "9.3.0",
34+
"react": "^19.2.0",
35+
"react-dom": "^19.2.0",
36+
"react-hook-form": "7.64.0",
37+
"recharts": "^3.2.1",
38+
"sonner": "^2.0.7",
39+
"strip-ansi": "7.1.2",
3840
"tailwind-merge": "^3.3.1",
39-
"tailwind-variants": "1.0.0",
40-
"use-debounce": "10.0.5",
41-
"zod": "^4.0.10"
41+
"tailwind-variants": "3.1.1",
42+
"use-debounce": "10.0.6",
43+
"zod": "^4.1.12"
4244
},
4345
"devDependencies": {
4446
"@eslint/eslintrc": "^3.3.1",
45-
"@tailwindcss/postcss": "^4.1.11",
46-
"@types/node": "^24.1.0",
47-
"@types/react": "^19.1.8",
48-
"@types/react-dom": "^19.1.6",
49-
"eslint": "^9.32.0",
50-
"eslint-config-next": "15.4.4",
47+
"@tailwindcss/postcss": "^4.1.14",
48+
"@types/node": "^24.7.1",
49+
"@types/react": "^19.2.2",
50+
"@types/react-dom": "^19.2.1",
51+
"eslint": "^9.37.0",
52+
"eslint-config-next": "15.5.4",
5153
"eslint-config-prettier": "^10.1.8",
52-
"eslint-plugin-perfectionist": "^4.15.0",
53-
"eslint-plugin-prettier": "^5.5.3",
54+
"eslint-plugin-perfectionist": "^4.15.1",
55+
"eslint-plugin-prettier": "^5.5.4",
5456
"prettier": "^3.6.2",
55-
"tailwindcss": "^4.1.11",
56-
"tw-animate-css": "^1.3.6",
57-
"typescript": "^5.8.3"
57+
"tailwindcss": "^4.1.14",
58+
"tw-animate-css": "^1.4.0",
59+
"typescript": "^5.9.3"
5860
},
5961
"name": "cachyos-builder-dashboard",
60-
"packageManager": "[email protected].19",
62+
"packageManager": "[email protected].23",
6163
"private": true,
6264
"scripts": {
6365
"build": "next build",

src/app/actions.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {defaultSession, SessionData, sessionOptions} from '@/lib/session';
99
import {
1010
BasePackageListSchema,
1111
BasePackageWithIDList,
12+
BuildTimeStatsDataList,
1213
ListPackagesQuery,
1314
ListRepoActionsQuery,
1415
LoginRequest,
@@ -200,18 +201,26 @@ export async function getPackageStats(
200201
export async function getPackageStats(
201202
type: PackageStatsType.MONTH
202203
): Promise<ProcessedPackageStatsByMonthList | {error: string}>;
204+
205+
export async function getPackageStats(
206+
type: PackageStatsType.BUILD_TIME
207+
): Promise<BuildTimeStatsDataList | {error: string}>;
208+
203209
export async function getPackageStats(
204210
type: PackageStatsType = PackageStatsType.CATEGORY
205211
): Promise<
206-
PackageStatsList | ProcessedPackageStatsByMonthList | {error: string}
212+
| BuildTimeStatsDataList
213+
| PackageStatsList
214+
| ProcessedPackageStatsByMonthList
215+
| {error: string}
207216
> {
208217
const {cachyBuilderClient, session} = await getSession();
209218
if (!session.isLoggedIn) {
210219
return redirect('/');
211220
}
212221
try {
213222
if (type === PackageStatsType.MONTH) {
214-
const stats = await cachyBuilderClient.listPackageStatsByMonth(
223+
const stats = await cachyBuilderClient.getPackageStatsByMonth(
215224
await headers()
216225
);
217226
return stats.map(stat => ({
@@ -220,8 +229,10 @@ export async function getPackageStats(
220229
.toISOString()
221230
.slice(0, 7),
222231
}));
232+
} else if (type === PackageStatsType.CATEGORY) {
233+
return cachyBuilderClient.getPackageStatsByCategory(await headers());
223234
} else {
224-
return cachyBuilderClient.listPackageStatsByCategory(await headers());
235+
return cachyBuilderClient.getBuildTimePackageStats(await headers());
225236
}
226237
} catch (error) {
227238
return {

src/app/dashboard/statistics/page.tsx

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {useEffect, useMemo, useState} from 'react';
44

55
import {getPackageStats} from '@/app/actions';
66
import {
7+
BuildStatsMemoryBarChart,
8+
BuildStatsTimeBarChart,
79
CategoryStatsDonutChart,
810
MonthlyStatsAreaChart,
911
} from '@/components/charts';
@@ -23,6 +25,7 @@ import {
2325
} from '@/components/ui/select';
2426
import {useSidebar} from '@/components/ui/sidebar';
2527
import {
28+
BuildTimeStatsDataList,
2629
MonthlyChartData,
2730
PackageStatsList,
2831
PackageStatsType,
@@ -34,10 +37,74 @@ export default function StatisticsPage() {
3437
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
3538
<CategoryChart />
3639
<MonthlyChart />
40+
<BuildTimeBarChart />
41+
<BuildMemoryBarChart />
3742
</div>
3843
);
3944
}
4045

46+
function BuildMemoryBarChart() {
47+
const {activeServer} = useSidebar();
48+
const [buildTimeChartData, setBuildTimeChartData] =
49+
useState<BuildTimeStatsDataList>([]);
50+
51+
useEffect(() => {
52+
setBuildTimeChartData([]);
53+
getPackageStats(PackageStatsType.BUILD_TIME).then(response => {
54+
if (Array.isArray(response)) {
55+
setBuildTimeChartData(response);
56+
}
57+
});
58+
}, [activeServer]);
59+
60+
return (
61+
<Card className="pt-0">
62+
<CardHeader className="flex items-center gap-2 space-y-0 border-b py-5 sm:flex-row">
63+
<div className="grid flex-1 gap-1">
64+
<CardTitle>Build Memory</CardTitle>
65+
<CardDescription>
66+
Showing build max rss statistics per repository and march
67+
</CardDescription>
68+
</div>
69+
</CardHeader>
70+
<CardContent>
71+
<BuildStatsMemoryBarChart chartData={buildTimeChartData} />
72+
</CardContent>
73+
</Card>
74+
);
75+
}
76+
77+
function BuildTimeBarChart() {
78+
const {activeServer} = useSidebar();
79+
const [buildTimeChartData, setBuildTimeChartData] =
80+
useState<BuildTimeStatsDataList>([]);
81+
82+
useEffect(() => {
83+
setBuildTimeChartData([]);
84+
getPackageStats(PackageStatsType.BUILD_TIME).then(response => {
85+
if (Array.isArray(response)) {
86+
setBuildTimeChartData(response);
87+
}
88+
});
89+
}, [activeServer]);
90+
91+
return (
92+
<Card className="pt-0">
93+
<CardHeader className="flex items-center gap-2 space-y-0 border-b py-5 sm:flex-row">
94+
<div className="grid flex-1 gap-1">
95+
<CardTitle>Build Time</CardTitle>
96+
<CardDescription>
97+
Showing build time statistics per repository and march
98+
</CardDescription>
99+
</div>
100+
</CardHeader>
101+
<CardContent>
102+
<BuildStatsTimeBarChart chartData={buildTimeChartData} />
103+
</CardContent>
104+
</Card>
105+
);
106+
}
107+
41108
function CategoryChart() {
42109
const {activeServer} = useSidebar();
43110
const [categoryChartData, setCategoryChartData] = useState<PackageStatsList>(

0 commit comments

Comments
 (0)