@@ -12,6 +12,7 @@ interface EventType {
1212export 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
0 commit comments