From 0cbd3b87304c0d11ca2febfb68c98bbb34ef53e6 Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Mon, 15 Jun 2026 17:04:48 +0530 Subject: [PATCH 1/3] fix(settings): wire up API quota refresh button --- src/context/AppContext.jsx | 7 ++++++- src/pages/SettingsPage.jsx | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/context/AppContext.jsx b/src/context/AppContext.jsx index ceab84d..52e3ffc 100644 --- a/src/context/AppContext.jsx +++ b/src/context/AppContext.jsx @@ -15,6 +15,11 @@ export function AppProvider({ children }) { const [govLoading, setGovLoading] = useState(false) const [error, setError] = useState('') + 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') @@ -90,7 +95,7 @@ export function AppProvider({ children }) { {children} diff --git a/src/pages/SettingsPage.jsx b/src/pages/SettingsPage.jsx index be74441..622335c 100644 --- a/src/pages/SettingsPage.jsx +++ b/src/pages/SettingsPage.jsx @@ -6,11 +6,12 @@ import { cacheClear } from '../services/github' import { BsFillInfoSquareFill } from "react-icons/bs"; 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()) @@ -204,7 +205,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 73c724394522441403280989852719fc27b1235a Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Mon, 15 Jun 2026 19:47:01 +0530 Subject: [PATCH 2/3] 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 622335c..61adef4 100644 --- a/src/pages/SettingsPage.jsx +++ b/src/pages/SettingsPage.jsx @@ -205,17 +205,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 b5b1daaccf9f5d0b6aa63016a64e11d615248386 Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Mon, 15 Jun 2026 19:52:02 +0530 Subject: [PATCH 3/3] 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 61adef4..bd49d04 100644 --- a/src/pages/SettingsPage.jsx +++ b/src/pages/SettingsPage.jsx @@ -210,8 +210,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',