|
1 | 1 | "use client"; |
2 | 2 |
|
3 | | -import { useEffect, useState } from "react"; |
| 3 | +import { useCallback, useEffect, useState } from "react"; |
4 | 4 | import AOS from "aos"; |
5 | 5 | import "devicon/devicon.min.css"; |
6 | 6 | import { toast } from "react-toastify"; |
@@ -59,25 +59,48 @@ export default function Stats({ |
59 | 59 | best_day: { date: "", total_seconds: 0 }, |
60 | 60 | }); |
61 | 61 |
|
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); |
76 | 64 |
|
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); |
79 | 94 | }, []); |
80 | 95 |
|
| 96 | + useEffect(() => { |
| 97 | + const run = async () => { |
| 98 | + await fetchStats(); |
| 99 | + }; |
| 100 | + |
| 101 | + run(); |
| 102 | + }, [fetchStats]); |
| 103 | + |
81 | 104 | useEffect(() => { |
82 | 105 | if (!syncing) { |
83 | 106 | setTimeout(() => { |
|
0 commit comments