diff --git a/app/components/landing-page/Contributors.tsx b/app/components/landing-page/Contributors.tsx new file mode 100644 index 0000000..0f6f26e --- /dev/null +++ b/app/components/landing-page/Contributors.tsx @@ -0,0 +1,58 @@ +import Image from "next/image"; +import Link from "next/link"; + +export interface Contributor { + id: number; + login: string; + avatar_url: string; + html_url: string; +} + +export default async function Contributors() { + const devPulseContributors = await fetch( + "https://api.github.com/repos/hallofcodes/devpulse/contributors?per_page=100", + ); + + if (!devPulseContributors.ok) { + throw new Error("Failed to fetch contributors"); + } + + const contributors = await devPulseContributors.json(); + + return ( +
+
+

Contributors

+

+ A big thank you to all the amazing contributors who have helped make + DevPulse better! Your support and contributions are what drive this + project forward. +

+ +
+ {contributors.map((contributor: Contributor) => ( + + {contributor.login} + {contributor.login} + + ))} +
+
+
+ ); +} diff --git a/app/components/landing-page/LosserMembers.tsx b/app/components/landing-page/LosserMembers.tsx new file mode 100644 index 0000000..c77c89c --- /dev/null +++ b/app/components/landing-page/LosserMembers.tsx @@ -0,0 +1,65 @@ +export interface LosserMember { + email: string; + total_seconds: number; +} + +export default async function LosserMembers({ + losser_members, +}: { + losser_members: LosserMember[]; +}) { + return ( + <> + {losser_members && losser_members.length > 0 && ( +
+
+

+ Losser Leaderboard +

+

+ Top most "dedicated" developers who have spent the least + amount of time coding. Remember, its not about how much you code, + but how effective you are! 😉 +

+ + {(!losser_members || losser_members.length) === 0 && ( +
+ No idoits found... 😜 +
+ )} + +
+ {losser_members.map( + ( + member: { email: string; total_seconds: number }, + i: number, + ) => ( +
+
+
+ + {member.email.split("@")[0]} + +
+ + {Math.floor(member.total_seconds / 3600)}h{" "} + {Math.floor((member.total_seconds % 3600) / 60)}m + +
+ ), + )} +
+
+
+ )} + + ); +} diff --git a/app/components/landing-page/RecentLeaderboard.tsx b/app/components/landing-page/RecentLeaderboard.tsx new file mode 100644 index 0000000..10963ed --- /dev/null +++ b/app/components/landing-page/RecentLeaderboard.tsx @@ -0,0 +1,86 @@ +import Link from "next/link"; + +export interface RecentLeaderboardProps { + id: string; + name: string; + slug: string; +} + +export default function RecentLeaderboard({ + leaderboards, +}: { + leaderboards: RecentLeaderboardProps[]; +}) { + return ( + <> + {leaderboards && leaderboards.length > 0 && ( +
+
+
+
+

+ Active Leaderboards +

+

+ Join the top engineering communities today. +

+
+ + Create yours{" "} + + → + + +
+ +
+ {leaderboards.map( + ( + board: { id: string; name: string; slug: string }, + i: number, + ) => ( + +
+
+ + {board.name} + +
+ + View + + + + + + ), + )} +
+
+
+ )} + + ); +} diff --git a/app/components/landing-page/TopLeaderbord.tsx b/app/components/landing-page/TopLeaderbord.tsx new file mode 100644 index 0000000..9258182 --- /dev/null +++ b/app/components/landing-page/TopLeaderbord.tsx @@ -0,0 +1,57 @@ +export interface TopMember { + email: string; + total_seconds: number; +} + +export default function TopLeaderboard({ + top_members, +}: { + top_members: TopMember[]; +}) { + return ( + <> + {top_members && top_members.length > 0 && ( +
+
+

+ Top Developers of the Week +

+

+ Celebrating the most dedicated coders in our community. +

+ +
+ {top_members.map( + ( + member: { email: string; total_seconds: number }, + i: number, + ) => ( +
+
+
+ + {member.email.split("@")[0]} + +
+ + {Math.floor(member.total_seconds / 3600)}h{" "} + {Math.floor((member.total_seconds % 3600) / 60)}m + +
+ ), + )} +
+
+
+ )} + + ); +} diff --git a/app/page.tsx b/app/page.tsx index de04475..5e58204 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,6 +3,10 @@ import Image from "next/image"; import { createClient } from "./lib/supabase/server"; import Footer from "./components/layout/Footer"; import CTA from "./components/layout/CTA"; +import Contributors from "./components/landing-page/Contributors"; +import LosserMembers from "./components/landing-page/LosserMembers"; +import RecentLeaderboard from "./components/landing-page/RecentLeaderboard"; +import TopLeaderboard from "./components/landing-page/TopLeaderbord"; export default async function Home() { const supabase = await createClient(); @@ -319,172 +323,11 @@ export default async function Home() { - {top_members && top_members.length > 0 && ( -
-
-

- Top Developers of the Week -

-

- Celebrating the most dedicated coders in our community. -

- -
- {top_members.map( - ( - member: { email: string; total_seconds: number }, - i: number, - ) => ( -
-
-
- - {member.email.split("@")[0]} - -
- - {Math.floor(member.total_seconds / 3600)}h{" "} - {Math.floor((member.total_seconds % 3600) / 60)}m - -
- ), - )} -
-
-
- )} - - {/* Recent Leaderboards */} - {leaderboards && leaderboards.length > 0 && ( -
-
-
-
-

- Active Leaderboards -

-

- Join the top engineering communities today. -

-
- - Create yours{" "} - - → - - -
- -
- {leaderboards.map( - ( - board: { id: string; name: string; slug: string }, - i: number, - ) => ( - -
-
- - {board.name} - -
- - View - - - - - - ), - )} -
-
-
- )} - - {losser_members && losser_members.length > 0 && ( -
-
-

- Losser Leaderboard -

-

- Top most "dedicated" developers who have spent the least - amount of time coding. Remember, its not about how much you code, - but how effective you are! 😉 -

- - {(!losser_members || losser_members.length) === 0 && ( -
- No idoits found... 😜 -
- )} - -
- {losser_members.map( - ( - member: { email: string; total_seconds: number }, - i: number, - ) => ( -
-
-
- - {member.email.split("@")[0]} - -
- - {Math.floor(member.total_seconds / 3600)}h{" "} - {Math.floor((member.total_seconds % 3600) / 60)}m - -
- ), - )} -
-
-
- )} - + + + + -