Skip to content

Commit d904719

Browse files
Merge pull request #79 from Dotify71/fix/api-quota-refresh
fix: wire up API quota refresh button
2 parents 0a407aa + 3b56f96 commit d904719

2 files changed

Lines changed: 52 additions & 6 deletions

File tree

src/context/AppContext.jsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createContext, useContext, useState, useCallback, useEffect, useMemo } from 'react'
2-
import { fetchOrg, fetchRepos, fetchContributors, fetchIssues, } from '../services/github'
2+
import { fetchOrg, fetchRepos, fetchContributors, fetchIssues, fetchRateLimit } from '../services/github'
33
import { buildAnalyticalModel, getTopRepositories } from '../services/analytics'
44

55
const Ctx = createContext(null)
@@ -34,6 +34,7 @@ export function AppProvider({ children }) {
3434
const [loadMsg, setLoadMsg] = useState('')
3535
const [govLoading, setGovLoading] = useState(false)
3636
const [error, setError] = useState('')
37+
const [totalRepo, setTotalRepo] = useState(0)
3738

3839
useEffect(() => {
3940
const handler = e => {
@@ -58,7 +59,15 @@ export function AppProvider({ children }) {
5859

5960
return () => clearTimeout(timeout)
6061
}, [rateLimit])
61-
const [totalRepo, setTotalRepo] = useState(0);
62+
63+
const refreshRateLimit = useCallback(async () => {
64+
const rl = await fetchRateLimit(pat)
65+
if (rl) {
66+
setRateLimit(rl)
67+
return true
68+
}
69+
return false
70+
}, [pat])
6271
const savePat = useCallback(token => {
6372
setPat(token)
6473
token ? localStorage.setItem('oe_pat', token) : localStorage.removeItem('oe_pat')
@@ -180,7 +189,7 @@ export function AppProvider({ children }) {
180189
<Ctx.Provider value={{
181190
pat, savePat, orgs, model, issuesData,
182191
rateLimit, loading, loadMsg, govLoading, error, totalRepo,
183-
explore, runAudit, setError, staleRepoStats,
192+
explore, runAudit, setError, refreshRateLimit, staleRepoStats,
184193
}}>
185194
{children}
186195
</Ctx.Provider>

src/pages/SettingsPage.jsx

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import { C } from '../components/UI'
55
import { cacheClear } from '../services/github'
66
import { AiOutlineInfoCircle } from "react-icons/ai";
77
export default function SettingsPage() {
8-
const { pat, savePat, rateLimit } = useApp()
8+
const { pat, savePat, rateLimit, refreshRateLimit } = useApp()
99
const [draft, setDraft] = useState(pat)
1010
const [show, setShow] = useState(false)
1111
const [saved, setSaved] = useState(false)
1212
const [cleared, setCleared] = useState(false)
13-
13+
const [isRefreshing, setIsRefreshing] = useState(false)
14+
const [refreshError, setRefreshError] = useState(false)
1415
const handleSave = () => {
1516
savePat(draft.trim())
1617
setSaved(true)
@@ -207,7 +208,43 @@ export default function SettingsPage() {
207208
<div style={C.card}>
208209
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 }}>
209210
<div style={{ fontWeight: 600, fontSize: 15, letterSpacing: '.03em' }}>API Quota</div>
210-
<FiRefreshCw size={14} color="var(--text2)" style={{ cursor: 'pointer' }} />
211+
<button
212+
type="button"
213+
disabled={isRefreshing}
214+
onClick={async () => {
215+
if (isRefreshing) return;
216+
setIsRefreshing(true);
217+
setRefreshError(false);
218+
try {
219+
const success = await refreshRateLimit();
220+
if (!success) {
221+
setRefreshError(true);
222+
setTimeout(() => setRefreshError(false), 2000);
223+
}
224+
} finally {
225+
setTimeout(() => setIsRefreshing(false), 500); // Minimum spin duration for visual feedback
226+
}
227+
}}
228+
style={{
229+
background: 'none',
230+
border: 'none',
231+
padding: '4px',
232+
cursor: 'pointer',
233+
display: 'flex',
234+
alignItems: 'center',
235+
justifyContent: 'center',
236+
borderRadius: '4px'
237+
}}
238+
aria-label="Refresh API Quota"
239+
title={refreshError ? "Failed to refresh" : "Refresh API Quota"}
240+
className="hover:bg-(--bg) transition"
241+
>
242+
<FiRefreshCw
243+
size={14}
244+
color={refreshError ? "var(--red)" : "var(--text2)"}
245+
style={{ transition: 'transform 0.3s ease', transform: isRefreshing ? 'rotate(180deg)' : 'none' }}
246+
/>
247+
</button>
211248
</div>
212249

213250
{rateLimit ? (

0 commit comments

Comments
 (0)