From f7c551c8feba7f01a179885f93129abd45e49d89 Mon Sep 17 00:00:00 2001 From: Aparna Kumari Date: Sat, 16 May 2026 16:16:44 +0530 Subject: [PATCH 1/3] feat: added live GitHub activity feed with UI and time tracking --- src/components/ActivityFeed.tsx | 89 +++++++++++++++++++++++++++++++++ src/pages/ctivity.tsx | 14 ++++++ 2 files changed, 103 insertions(+) create mode 100644 src/components/ActivityFeed.tsx create mode 100644 src/pages/ctivity.tsx diff --git a/src/components/ActivityFeed.tsx b/src/components/ActivityFeed.tsx new file mode 100644 index 0000000..d770dfe --- /dev/null +++ b/src/components/ActivityFeed.tsx @@ -0,0 +1,89 @@ +import { useEffect, useState } from "react"; + +interface EventType { + id: string; + type: string; + created_at: string; + repo?: { + name: string; + }; +} + +export default function ActivityFeed({ username }: { username: string }) { + const [events, setEvents] = useState([]); + const [loading, setLoading] = useState(true); + + // 🕒 time ago function + const getTimeAgo = (dateString: string) => { + const diff = Math.floor( + (Date.now() - new Date(dateString).getTime()) / 1000 + ); + + if (diff < 60) return `${diff}s ago`; + if (diff < 3600) return `${Math.floor(diff / 60)}m ago`; + if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`; + return `${Math.floor(diff / 86400)}d ago`; + }; + + 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); + } + }; + + fetchEvents(); + + const interval = setInterval(fetchEvents, 30000); + return () => clearInterval(interval); + }, [username]); + + return ( +
+

+ Activity Feed +

+ + {loading ? ( +

Loading...

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

No activity found

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

+ {event.type === "PushEvent" && "🚀 Commit pushed"} + {event.type === "PullRequestEvent" && "🔀 Pull Request"} + {event.type === "IssuesEvent" && "🐛 Issue"} + {event.type === "WatchEvent" && "⭐ Starred repo"} + {![ + "PushEvent", + "PullRequestEvent", + "IssuesEvent", + "WatchEvent", + ].includes(event.type) && event.type} +

+ +

+ {event.repo?.name} • {getTimeAgo(event.created_at)} +

+
+ )) + )} +
+ ); +} \ No newline at end of file diff --git a/src/pages/ctivity.tsx b/src/pages/ctivity.tsx new file mode 100644 index 0000000..863d07a --- /dev/null +++ b/src/pages/ctivity.tsx @@ -0,0 +1,14 @@ +import ActivityFeed from "../components/ActivityFeed"; +export default function Activity() { + return ( +
+
+

+ Live GitHub Activity +

+ + +
+
+ ); +} \ No newline at end of file From e6ac2a6dbe981e8256799cc3c139e9a219799d56 Mon Sep 17 00:00:00 2001 From: Aparna Kumari Date: Mon, 18 May 2026 15:39:34 +0530 Subject: [PATCH 2/3] fix: remove hardcoded username --- src/Routes/Router.tsx | 6 +++++- src/pages/ctivity.tsx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Routes/Router.tsx b/src/Routes/Router.tsx index 40a7861..b8b6772 100644 --- a/src/Routes/Router.tsx +++ b/src/Routes/Router.tsx @@ -7,6 +7,7 @@ import Signup from "../pages/Signup/Signup.tsx"; import Login from "../pages/Login/Login.tsx"; import ContributorProfile from "../pages/ContributorProfile/ContributorProfile.tsx"; import Home from "../pages/Home/Home.tsx"; +import Activity from "../pages/ctivity.tsx"; // ✅ add const Router = () => { return ( @@ -19,8 +20,11 @@ const Router = () => { } /> } /> } /> + + {/* ✅ new route */} + } /> ); }; -export default Router; +export default Router; \ No newline at end of file diff --git a/src/pages/ctivity.tsx b/src/pages/ctivity.tsx index 863d07a..ccc3d20 100644 --- a/src/pages/ctivity.tsx +++ b/src/pages/ctivity.tsx @@ -7,7 +7,7 @@ export default function Activity() { Live GitHub Activity - + ); From acf541e3809d4705c05ea44463f975e081c45db7 Mon Sep 17 00:00:00 2001 From: Aparna Kumari Date: Mon, 18 May 2026 17:31:39 +0530 Subject: [PATCH 3/3] fix: correct Activity filename and import --- src/Routes/Router.tsx | 2 +- src/pages/{ctivity.tsx => Activity.tsx} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/pages/{ctivity.tsx => Activity.tsx} (100%) diff --git a/src/Routes/Router.tsx b/src/Routes/Router.tsx index b8b6772..51eebc3 100644 --- a/src/Routes/Router.tsx +++ b/src/Routes/Router.tsx @@ -7,7 +7,7 @@ import Signup from "../pages/Signup/Signup.tsx"; import Login from "../pages/Login/Login.tsx"; import ContributorProfile from "../pages/ContributorProfile/ContributorProfile.tsx"; import Home from "../pages/Home/Home.tsx"; -import Activity from "../pages/ctivity.tsx"; // ✅ add +import Activity from "../pages/Activity.tsx"; const Router = () => { return ( diff --git a/src/pages/ctivity.tsx b/src/pages/Activity.tsx similarity index 100% rename from src/pages/ctivity.tsx rename to src/pages/Activity.tsx