Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 43 additions & 20 deletions src/components/ContributionGraph.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// @ts-nocheck
"use client";

import React, { useEffect, useRef, useState } from "react";
import React, { useEffect, useRef, useState, useMemo } from "react";
import { useAccount } from "@/components/AccountContext";
import CommitSearchPanel from "@/components/CommitSearchPanel";
import type { CommitItem } from "@/lib/github";
Expand Down Expand Up @@ -151,9 +151,7 @@
const [error, setError] = useState<string | null>(null);
const [commits, setCommits] = useState<CommitItem[]>([]);
const [usesTouchTooltip, setUsesTouchTooltip] = useState(false);
const [repo, setRepo] = useState<string>("all");
const [repoOptions, setRepoOptions] = useState<string[]>([]);

const [selectedRepos, setSelectedRepos] = useState<string[]>([]);
// Compare mode state
const [compareMode, setCompareMode] = useState(false);
const [compareUser, setCompareUser] = useState<string | null>(null);
Expand Down Expand Up @@ -220,7 +218,7 @@
selectedAccount !== null
? `&accountId=${encodeURIComponent(selectedAccount)}`
: "";
const repoParam = repo !== "all" ? `&repo=${repo}` : "";

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Continuous Integration Security & Audit Suite

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > suppresses sync errors and retains cached data when background fetch fails

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Continuous Integration Security & Audit Suite

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > hydrates locally and runs background sync when cache is expired (> 1 hour)

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Continuous Integration Security & Audit Suite

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > hydrates locally and bypasses network fetch when cache is fresh (< 1 hour)

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Continuous Integration Security & Audit Suite

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > renders zero commits instead of NaN for empty contribution ranges

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Continuous Integration Security & Audit Suite

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > performs standard fetch and updates cache when no cache exists

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Test coverage

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > suppresses sync errors and retains cached data when background fetch fails

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Test coverage

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > hydrates locally and runs background sync when cache is expired (> 1 hour)

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Test coverage

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > hydrates locally and bypasses network fetch when cache is fresh (< 1 hour)

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Test coverage

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > renders zero commits instead of NaN for empty contribution ranges

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24

Check failure on line 221 in src/components/ContributionGraph.tsx

View workflow job for this annotation

GitHub Actions / Test coverage

test/ContributionGraph.test.ts > ContributionGraph - IndexedDB Caching and Background Sync > performs standard fetch and updates cache when no cache exists

ReferenceError: repo is not defined ❯ src/components/ContributionGraph.tsx:221:23 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:23189:26 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24970:11 ❯ commitPassiveMountEffects_complete node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24930:9 ❯ commitPassiveMountEffects_begin node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24917:7 ❯ commitPassiveMountEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:24905:3 ❯ flushPassiveEffectsImpl node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27078:3 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:27023:14 ❯ node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.development.js:26808:9 ❯ flushActQueue node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js:2667:24
const timezoneParam = `&timezone=${encodeURIComponent(timezone)}`;
const url =
customLabel && customFrom && customTo
Expand Down Expand Up @@ -309,7 +307,7 @@
return () => {
active = false;
};
}, [days, selectedAccount, customFrom, customTo, customLabel, repo]);
}, [days, selectedAccount, customFrom, customTo, customLabel]);

// Fetch friend data when compare mode is on and compareUser changes
useEffect(() => {
Expand Down Expand Up @@ -465,6 +463,10 @@
: [];

const displayData = compareMode ? mergedData : data;
const filteredData = useMemo(() => {
if (selectedRepos.length === 0) return displayData;
return displayData;
}, [displayData, selectedRepos]);
const hasFriendData = compareMode && friendData.length > 0 && !compareError;
const tooltipTrigger = usesTouchTooltip ? "click" : "hover";
const totalCommits = compareMode
Expand Down Expand Up @@ -508,18 +510,39 @@

<div className="flex flex-wrap items-center gap-2">
{/* Repo Filter */}
<select
value={repo}
onChange={(e) => setRepo(e.target.value)}
className="bg-slate-700 text-slate-300 text-sm rounded-lg px-2 py-1 border border-slate-600"
>
<option value="all">All repos</option>
{repoOptions.map((r) => (
<option key={r} value={r}>
{r.split("/")[1]}
</option>
))}
</select>
{/* Dynamic Repository Multi-Select Badges */}
<div className="flex flex-wrap gap-2 items-center">
<button
onClick={() => setSelectedRepos([])}
className={`px-3 py-1.5 text-xs font-semibold rounded-md transition-all border ${
selectedRepos.length === 0
? "bg-slate-200 text-slate-800 border-slate-300 dark:bg-slate-700 dark:text-slate-100"
: "bg-transparent text-slate-400 border-slate-600 hover:bg-slate-800"
}`}
>
All Repositories
</button>
{repoOptions.map((r) => {
const isSelected = selectedRepos.includes(r);
return (
<button
key={r}
onClick={() => {
setSelectedRepos((prev) =>
isSelected ? prev.filter((name) => name !== r) : [...prev, r]
);
}}
className={`px-3 py-1.5 text-xs font-semibold rounded-md transition-all border ${
isSelected
? "bg-slate-200 text-slate-800 border-slate-300 dark:bg-slate-700 dark:text-slate-100"
: "bg-transparent text-slate-400 border-slate-600 hover:bg-slate-800"
}`}
>
{r.split("/")[1] || r}
</button>
);
})}
</div>

{/* Range buttons */}
<div className="flex gap-1 rounded-lg border border-[var(--border)] bg-[var(--background)] p-1">
Expand Down Expand Up @@ -670,7 +693,7 @@
<div className="h-[220px] w-full overflow-hidden">
<ResponsiveContainer width="100%" height="100%">
{chartType === "bar" ? (
<BarChart data={displayData}>
<BarChart data={filteredData}>
<CartesianGrid strokeDasharray="3 3" stroke="var(--border)" />
<XAxis
dataKey={compareMode ? "date" : "day"}
Expand Down Expand Up @@ -722,7 +745,7 @@
)}
</BarChart>
) : chartType === "line" ? (
<LineChart data={displayData}>
<LineChart data={filteredData}>
<CartesianGrid strokeDasharray="3 3" stroke="var(--border)" />
<XAxis
dataKey={compareMode ? "date" : "day"}
Expand Down Expand Up @@ -781,7 +804,7 @@
)}
</LineChart>
) : (
<AreaChart data={displayData}>
<AreaChart data={filteredData}>
<CartesianGrid strokeDasharray="3 3" stroke="var(--border)" />
<XAxis
dataKey={compareMode ? "date" : "day"}
Expand Down
Loading