From c877d3155c03e8aa56c612008b0da44f2bec9986 Mon Sep 17 00:00:00 2001 From: ananyadarna Date: Tue, 26 May 2026 10:58:36 +0530 Subject: [PATCH] Add GitHub API rate limit handling UI --- src/components/ActivityFeed.tsx | 73 +++++++++++++++++++++++++-------- src/pages/Activity.tsx | 2 +- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/components/ActivityFeed.tsx b/src/components/ActivityFeed.tsx index d770dfee..5fbf983d 100644 --- a/src/components/ActivityFeed.tsx +++ b/src/components/ActivityFeed.tsx @@ -12,6 +12,7 @@ interface EventType { export default function ActivityFeed({ username }: { username: string }) { const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); + const [error, setError] = useState(""); // 🕒 time ago function const getTimeAgo = (dateString: string) => { @@ -27,20 +28,53 @@ export default function ActivityFeed({ username }: { username: string }) { useEffect(() => { const fetchEvents = async () => { - try { - setLoading(true); - - const res = await fetch( - `https://api.github.com/users/${username}/events` - ); - const data = await res.json(); - - setEvents(data); - setLoading(false); - } catch (err) { - console.error(err); - setLoading(false); - } + try { + setLoading(true); + setError(""); + + const res = await fetch( + `https://api.github.com/users/${username}/events` + ); + + // Handle GitHub API rate limit + if (res.status === 403) { + const remaining = + res.headers.get("X-RateLimit-Remaining") || "0"; + + const reset = + res.headers.get("X-RateLimit-Reset"); + + const resetTime = reset + ? new Date(Number(reset) * 1000).toLocaleTimeString() + : "Unknown"; + + setError( + `GitHub API rate limit exceeded. + Please try again after ${resetTime}. + Remaining Requests: ${remaining}` + ); + + setEvents([]); + setLoading(false); + return; + } + + if (!res.ok) { + throw new Error("Failed to fetch activity"); + } + + const data = await res.json(); + + setEvents(data); + } catch (err) { + console.error(err); + + setError( + "Something went wrong while fetching GitHub activity." + ); + } finally { + setLoading(false); + } }; fetchEvents(); @@ -51,14 +85,21 @@ export default function ActivityFeed({ username }: { username: string }) { return (
-

+

Activity Feed

+ + {error && ( +
+ {error} +
+ )} + {loading ? (

Loading...

) : events.length === 0 ? ( -

No activity found

+

No activity found

) : ( events.slice(0, 10).map((event) => (
-

+

Live GitHub Activity