Skip to content

Commit 331ae96

Browse files
committed
Merge branch 'master' of github.com:mrepol742/devpulse
2 parents 40e699a + 41b5620 commit 331ae96

2 files changed

Lines changed: 50 additions & 18 deletions

File tree

.github/workflows/build.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@ name: Build Next.js App
33
on:
44
push:
55
branches: ["master"]
6-
pull_request:
6+
pull_request_target:
77
branches: ["master"]
88
workflow_dispatch:
99

10+
env:
11+
SUPABASE_PROJECT_ID: ${{ secrets.SUPABASE_PROJECT_ID }}
12+
SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}
13+
NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}
14+
NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}
15+
1016
jobs:
1117
build:
1218
runs-on: ubuntu-latest
@@ -26,6 +32,7 @@ jobs:
2632
run: npm run lint
2733

2834
- name: Generate types from remote
35+
if: ${{ env.SUPABASE_PROJECT_ID && env.SUPABASE_ACCESS_TOKEN }}
2936
env:
3037
SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}
3138
run: |
@@ -41,11 +48,13 @@ jobs:
4148
# npx supabase db push --project-id ${{ secrets.SUPABASE_PROJECT_ID }}
4249

4350
- name: Create .env file
51+
if: ${{ env.NEXT_PUBLIC_SUPABASE_URL && env.NEXT_PUBLIC_SUPABASE_ANON_KEY }}
4452
run: |
4553
echo "NEXT_PUBLIC_SUPABASE_URL=${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}" >> .env
4654
echo "NEXT_PUBLIC_SUPABASE_ANON_KEY=${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}" >> .env
4755
echo "NEXT_PUBLIC_HCAPTCHA_SITE_KEY=${{ secrets.NEXT_PUBLIC_HCAPTCHA_SITE_KEY }}" >> .env
4856
echo "NEXT_PUBLIC_NORTON_SAFEWEB_SITE_VERIFICATION=${{ secrets.NEXT_PUBLIC_NORTON_SAFEWEB_SITE_VERIFICATION }}" >> .env
4957
5058
- name: Build project
59+
if: ${{ env.NEXT_PUBLIC_SUPABASE_URL && env.NEXT_PUBLIC_SUPABASE_ANON_KEY }}
5160
run: npm run build

app/components/dashboard/Stats.tsx

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client";
22

3-
import { useEffect, useState } from "react";
3+
import { useCallback, useEffect, useState } from "react";
44
import AOS from "aos";
55
import "devicon/devicon.min.css";
66
import { toast } from "react-toastify";
@@ -59,25 +59,48 @@ export default function Stats({
5959
best_day: { date: "", total_seconds: 0 },
6060
});
6161

62-
const fetchStats = () => {
63-
fetch("/api/wakatime/sync")
64-
.then((res) => res.json())
65-
.then((data) => {
66-
if (data.success) {
67-
setStats(data.data);
68-
} else {
69-
toast.error(
70-
data.error || "Failed to fetch stats. Please try syncing again.",
71-
);
72-
}
73-
setSyncing(false);
74-
});
75-
};
62+
const fetchStats = useCallback(async () => {
63+
setSyncing(true);
7664

77-
useEffect(() => {
78-
fetchStats();
65+
const cached = sessionStorage.getItem("wakatimeStats");
66+
const cacheTime = Number(sessionStorage.getItem("wakatimeStatsTime"));
67+
const now = Date.now();
68+
69+
if (cached && cacheTime && now - cacheTime < 1000 * 60 * 5) {
70+
setStats(JSON.parse(cached));
71+
setSyncing(false);
72+
return;
73+
}
74+
75+
try {
76+
const res = await fetch("/api/wakatime/sync");
77+
const data = await res.json();
78+
79+
if (data.success) {
80+
setStats(data.data);
81+
82+
sessionStorage.setItem("wakatimeStats", JSON.stringify(data.data));
83+
sessionStorage.setItem("wakatimeStatsTime", now.toString());
84+
} else {
85+
toast.error(
86+
data.error || "Failed to fetch stats. Please try syncing again.",
87+
);
88+
}
89+
} catch (err) {
90+
toast.error("Network error. Please try again.");
91+
}
92+
93+
setSyncing(false);
7994
}, []);
8095

96+
useEffect(() => {
97+
const run = async () => {
98+
await fetchStats();
99+
};
100+
101+
run();
102+
}, [fetchStats]);
103+
81104
useEffect(() => {
82105
if (!syncing) {
83106
setTimeout(() => {

0 commit comments

Comments
 (0)