From 4fba31a3dfa1fe929287919779212ba9d0307e7f Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Mon, 15 Jun 2026 17:04:48 +0530 Subject: [PATCH 1/5] fix(settings): wire up API quota refresh button --- src/context/AppContext.jsx | 11 ++++++++--- src/pages/SettingsPage.jsx | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/context/AppContext.jsx b/src/context/AppContext.jsx index fce9b16..c4abf37 100644 --- a/src/context/AppContext.jsx +++ b/src/context/AppContext.jsx @@ -1,5 +1,5 @@ import { createContext, useContext, useState, useCallback, useEffect } from 'react' -import { fetchOrg, fetchRepos, fetchContributors, fetchIssues, } from '../services/github' +import { fetchOrg, fetchRepos, fetchContributors, fetchIssues, fetchRateLimit } from '../services/github' import { buildAnalyticalModel, getTopRepositories } from '../services/analytics' const Ctx = createContext(null) @@ -34,6 +34,7 @@ export function AppProvider({ children }) { const [loadMsg, setLoadMsg] = useState('') const [govLoading, setGovLoading] = useState(false) const [error, setError] = useState('') + const [totalRepo, setTotalRepo] = useState(0) useEffect(() => { const handler = e => { @@ -58,7 +59,11 @@ export function AppProvider({ children }) { return () => clearTimeout(timeout) }, [rateLimit]) - const [totalRepo, setTotalRepo] = useState(0); + + const refreshRateLimit = useCallback(async () => { + const rl = await fetchRateLimit(pat) + if (rl) setRateLimit(rl) + }, [pat]) const savePat = useCallback(token => { setPat(token) token ? localStorage.setItem('oe_pat', token) : localStorage.removeItem('oe_pat') @@ -140,7 +145,7 @@ export function AppProvider({ children }) { {children} diff --git a/src/pages/SettingsPage.jsx b/src/pages/SettingsPage.jsx index 7ab81c3..ae57c84 100644 --- a/src/pages/SettingsPage.jsx +++ b/src/pages/SettingsPage.jsx @@ -5,11 +5,12 @@ import { C } from '../components/UI' import { cacheClear } from '../services/github' import { AiOutlineInfoCircle } from "react-icons/ai"; export default function SettingsPage() { - const { pat, savePat, rateLimit } = useApp() + const { pat, savePat, rateLimit, refreshRateLimit } = useApp() const [draft, setDraft] = useState(pat) const [show, setShow] = useState(false) const [saved, setSaved] = useState(false) const [cleared, setCleared] = useState(false) + const [isRefreshing, setIsRefreshing] = useState(false) const handleSave = () => { savePat(draft.trim()) @@ -207,7 +208,17 @@ export default function SettingsPage() {
API Quota
- + { + if (isRefreshing) return; + setIsRefreshing(true); + await refreshRateLimit(); + setTimeout(() => setIsRefreshing(false), 500); // Minimum spin duration for visual feedback + }} + />
{rateLimit ? ( From bf901bd370287d2ee84c970d0866c4a832e79d9e Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Mon, 15 Jun 2026 19:47:01 +0530 Subject: [PATCH 2/5] fix(a11y): wrap refresh icon in a semantic button for accessibility --- src/pages/SettingsPage.jsx | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/pages/SettingsPage.jsx b/src/pages/SettingsPage.jsx index ae57c84..47c530c 100644 --- a/src/pages/SettingsPage.jsx +++ b/src/pages/SettingsPage.jsx @@ -208,17 +208,34 @@ export default function SettingsPage() {
API Quota
- { if (isRefreshing) return; setIsRefreshing(true); await refreshRateLimit(); setTimeout(() => setIsRefreshing(false), 500); // Minimum spin duration for visual feedback }} - /> + style={{ + background: 'none', + border: 'none', + padding: '4px', + cursor: 'pointer', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + borderRadius: '4px' + }} + aria-label="Refresh API Quota" + title="Refresh API Quota" + className="hover:bg-zinc-800 transition" + > + +
{rateLimit ? ( From 1e6a4ffdc8cc8b8a69bd4e32c9e5724d6acf035a Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Mon, 15 Jun 2026 19:52:02 +0530 Subject: [PATCH 3/5] fix(settings): ensure refresh state resets on error --- src/pages/SettingsPage.jsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/pages/SettingsPage.jsx b/src/pages/SettingsPage.jsx index 47c530c..98372c0 100644 --- a/src/pages/SettingsPage.jsx +++ b/src/pages/SettingsPage.jsx @@ -213,8 +213,11 @@ export default function SettingsPage() { onClick={async () => { if (isRefreshing) return; setIsRefreshing(true); - await refreshRateLimit(); - setTimeout(() => setIsRefreshing(false), 500); // Minimum spin duration for visual feedback + try { + await refreshRateLimit(); + } finally { + setTimeout(() => setIsRefreshing(false), 500); // Minimum spin duration for visual feedback + } }} style={{ background: 'none', From a686c8cba0f431be156e83e7c5afd185761c5639 Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Thu, 2 Jul 2026 20:12:00 +0530 Subject: [PATCH 4/5] fix(settings): ensure refresh state resets on error --- src/context/AppContext.jsx | 6 +++++- src/pages/SettingsPage.jsx | 16 +++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/context/AppContext.jsx b/src/context/AppContext.jsx index c4abf37..943021c 100644 --- a/src/context/AppContext.jsx +++ b/src/context/AppContext.jsx @@ -62,7 +62,11 @@ export function AppProvider({ children }) { const refreshRateLimit = useCallback(async () => { const rl = await fetchRateLimit(pat) - if (rl) setRateLimit(rl) + if (rl) { + setRateLimit(rl) + return true + } + return false }, [pat]) const savePat = useCallback(token => { setPat(token) diff --git a/src/pages/SettingsPage.jsx b/src/pages/SettingsPage.jsx index 98372c0..3b95ce9 100644 --- a/src/pages/SettingsPage.jsx +++ b/src/pages/SettingsPage.jsx @@ -11,7 +11,7 @@ export default function SettingsPage() { const [saved, setSaved] = useState(false) const [cleared, setCleared] = useState(false) const [isRefreshing, setIsRefreshing] = useState(false) - + const [refreshError, setRefreshError] = useState(false) const handleSave = () => { savePat(draft.trim()) setSaved(true) @@ -210,11 +210,17 @@ export default function SettingsPage() {
API Quota
From 3b56f9638d65e96369e547f7eddd65ae42905801 Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Fri, 3 Jul 2026 22:12:20 +0530 Subject: [PATCH 5/5] fix: restore missing analytics import lost during merge --- src/context/AppContext.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/context/AppContext.jsx b/src/context/AppContext.jsx index 5215fb0..0d6279c 100644 --- a/src/context/AppContext.jsx +++ b/src/context/AppContext.jsx @@ -1,5 +1,6 @@ import { createContext, useContext, useState, useCallback, useEffect, useMemo } from 'react' import { fetchOrg, fetchRepos, fetchContributors, fetchIssues, fetchRateLimit } from '../services/github' +import { buildAnalyticalModel, getTopRepositories } from '../services/analytics' const Ctx = createContext(null)