Skip to content

Commit c877d31

Browse files
committed
Add GitHub API rate limit handling UI
1 parent 6c6bc3e commit c877d31

2 files changed

Lines changed: 58 additions & 17 deletions

File tree

src/components/ActivityFeed.tsx

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ interface EventType {
1212
export default function ActivityFeed({ username }: { username: string }) {
1313
const [events, setEvents] = useState<EventType[]>([]);
1414
const [loading, setLoading] = useState(true);
15+
const [error, setError] = useState("");
1516

1617
// 🕒 time ago function
1718
const getTimeAgo = (dateString: string) => {
@@ -27,20 +28,53 @@ export default function ActivityFeed({ username }: { username: string }) {
2728

2829
useEffect(() => {
2930
const fetchEvents = async () => {
30-
try {
31-
setLoading(true);
32-
33-
const res = await fetch(
34-
`https://api.github.com/users/${username}/events`
35-
);
36-
const data = await res.json();
37-
38-
setEvents(data);
39-
setLoading(false);
40-
} catch (err) {
41-
console.error(err);
42-
setLoading(false);
43-
}
31+
try {
32+
setLoading(true);
33+
setError("");
34+
35+
const res = await fetch(
36+
`https://api.github.com/users/${username}/events`
37+
);
38+
39+
// Handle GitHub API rate limit
40+
if (res.status === 403) {
41+
const remaining =
42+
res.headers.get("X-RateLimit-Remaining") || "0";
43+
44+
const reset =
45+
res.headers.get("X-RateLimit-Reset");
46+
47+
const resetTime = reset
48+
? new Date(Number(reset) * 1000).toLocaleTimeString()
49+
: "Unknown";
50+
51+
setError(
52+
`GitHub API rate limit exceeded.
53+
Please try again after ${resetTime}.
54+
Remaining Requests: ${remaining}`
55+
);
56+
57+
setEvents([]);
58+
setLoading(false);
59+
return;
60+
}
61+
62+
if (!res.ok) {
63+
throw new Error("Failed to fetch activity");
64+
}
65+
66+
const data = await res.json();
67+
68+
setEvents(data);
69+
} catch (err) {
70+
console.error(err);
71+
72+
setError(
73+
"Something went wrong while fetching GitHub activity."
74+
);
75+
} finally {
76+
setLoading(false);
77+
}
4478
};
4579

4680
fetchEvents();
@@ -51,14 +85,21 @@ export default function ActivityFeed({ username }: { username: string }) {
5185

5286
return (
5387
<div className="p-4">
54-
<h2 className="text-xl font-bold mb-4 text-center">
88+
<h2 className="text-xl font-bold mb-4 text-center text-black dark:text-white">
5589
Activity Feed
5690
</h2>
91+
92+
{error && (
93+
<div className="bg-yellow-100 dark:bg-yellow-900 border border-yellow-400 text-yellow-800 dark:text-yellow-200 px-4 py-3 rounded mb-4">
94+
{error}
95+
</div>
96+
)}
97+
5798

5899
{loading ? (
59100
<p className="text-center">Loading...</p>
60101
) : events.length === 0 ? (
61-
<p className="text-center">No activity found</p>
102+
<p className="text-center text-black dark:text-white">No activity found</p>
62103
) : (
63104
events.slice(0, 10).map((event) => (
64105
<div

src/pages/Activity.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export default function Activity() {
33
return (
44
<div className="w-full h-full p-6 bg-gray-50 dark:bg-gray-800">
55
<div className="max-w-2xl mx-auto">
6-
<h1 className="text-2xl font-bold mb-4 text-center">
6+
<h1 className="text-2xl font-bold mb-4 text-center text-black dark:text-white">
77
Live GitHub Activity
88
</h1>
99

0 commit comments

Comments
 (0)