diff --git a/src/App.tsx b/src/App.tsx index 9d6422a1..7b08b20a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,7 +10,6 @@ import { Link, Route, Routes, useParams } from "react-router-dom"; import { AskAI } from "@/components/ask-ai"; import { ProjectListItem } from "@/components/ProjectListItem"; import { TimeSince } from "@/components/time-since"; -import { WakaTimeStats } from "@/components/wakatime-stats"; import { type ProjectEntry, projectList, projects } from "@/projects"; import { ThemeToggle } from "./components/theme-toggle"; @@ -103,7 +102,7 @@ function Home() { Age: -
+
{sortedProjects.map((project) => ( ))}
-
diff --git a/src/components/wakatime-stats.tsx b/src/components/wakatime-stats.tsx deleted file mode 100644 index 301bf783..00000000 --- a/src/components/wakatime-stats.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { useEffect, useMemo, useState } from "react"; - -type WakaTimeLanguage = { - name: string; - percent: number; - seconds: number; - text: string; -}; - -type WakaTimeStatsPayload = { - isCoding: boolean; - last7Text: string; - last7Seconds: number; - languages: WakaTimeLanguage[]; - updatedAt: string; -}; - -const defaultRefreshMs = 60_000; - -export function WakaTimeStats() { - const [stats, setStats] = useState(null); - const [error, setError] = useState(null); - const [isLoading, setIsLoading] = useState(true); - - const refreshMs = useMemo(() => { - const raw = import.meta.env.VITE_WAKATIME_REFRESH_MS; - if (!raw) return defaultRefreshMs; - const parsed = Number.parseInt(raw, 10); - if (Number.isNaN(parsed) || parsed < 10_000) return defaultRefreshMs; - return parsed; - }, []); - - useEffect(() => { - let isActive = true; - - const load = async () => { - try { - const response = await fetch("/api/wakatime/stats", { - headers: { - Accept: "application/json", - }, - }); - - if (!response.ok) { - throw new Error(`request failed (${response.status})`); - } - - const data = (await response.json()) as WakaTimeStatsPayload; - if (!isActive) return; - - setStats(data); - setError(null); - } catch (fetchError) { - if (!isActive) return; - setError( - fetchError instanceof Error - ? fetchError.message - : "Unable to fetch WakaTime stats", - ); - } finally { - if (isActive) setIsLoading(false); - } - }; - - void load(); - const timer = window.setInterval(() => { - void load(); - }, refreshMs); - - return () => { - isActive = false; - window.clearInterval(timer); - }; - }, [refreshMs]); - - return ( -
-
-

WakaTime

-

- {stats?.updatedAt - ? `Updated ${new Date(stats.updatedAt).toLocaleTimeString()}` - : "Waiting for update"} -

-
- - {isLoading ? ( -

Loading coding stats...

- ) : null} - - {error ? ( -

- WakaTime unavailable: {error} -

- ) : null} - - {stats ? ( -
-
-

Currently coding

-

- {stats.isCoding ? "Yes" : "No"} -

-
- -
-

Last 7 days

-

{stats.last7Text}

-
- -
-

Tracked languages

-

- {stats.languages.length} -

-
-
- ) : null} - - {stats?.languages.length ? ( -
    - {stats.languages.slice(0, 7).map((language) => ( -
  • -
    -
    - {language.name} - - {language.percent.toFixed(1)}% - -
    -
    -
    -
    -
    - - {language.text} - -
  • - ))} -
- ) : null} -
- ); -}