Skip to content

Commit bea8acf

Browse files
committed
Refactor code structure for improved readability and maintainability
1 parent a7e2ed7 commit bea8acf

6 files changed

Lines changed: 4072 additions & 26 deletions

File tree

app/(auth)/login/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default async function Login(props: {
2121
return (
2222
<div className="min-h-screen flex bg-[#0a0a1a] text-white">
2323
{/* Left Side - Visual / Branding */}
24-
<div className="hidden lg:flex lg:w-1/2 relative flex-col justify-between p-12 md:p-16 xl:p-24 border-r border-white/5 bg-gradient-to-br from-[#0a0a1a] to-[#0a0a1a] overflow-hidden">
24+
<div className="hidden lg:flex lg:w-1/2 relative flex-col justify-between p-12 md:p-16 xl:p-24 border-r border-white/5 bg-linear-to-br from-[#0a0a1a] to-[#0a0a1a] overflow-hidden">
2525
{/* Background elements */}
2626
<div className="absolute inset-0 grid-bg opacity-30" />
2727

@@ -33,7 +33,7 @@ export default async function Login(props: {
3333
</div>
3434

3535
<div className="relative z-10 max-w-md">
36-
<h1 className="text-4xl font-extrabold mb-5 leading-tight text-transparent bg-clip-text bg-gradient-to-r from-white to-gray-400">
36+
<h1 className="text-4xl font-extrabold mb-5 leading-tight text-transparent bg-clip-text bg-linear-to-r from-white to-gray-400">
3737
Welcome back to your dashboard.
3838
</h1>
3939
<p className="text-gray-400 text-lg leading-relaxed mb-8">

app/(public)/leaderboard/[slug]/page.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import LeaderboardHeader from "@/app/components/leaderboard/Header";
44
import BackButton from "@/app/components/leaderboard/BackButton";
55
import Footer from "@/app/components/layout/Footer";
66
import CTA from "@/app/components/layout/CTA";
7+
import { Member } from "@/app/types/LeaderboardMember";
78

89
export default async function LeaderboardPage(props: {
910
params: Promise<{ slug: string }>;
@@ -28,7 +29,7 @@ export default async function LeaderboardPage(props: {
2829
);
2930
}
3031

31-
const { data: members, error } = await supabase
32+
const { data: members, error }: { data: Member[] | null; error: any } = await supabase
3233
.from("leaderboard_members_view")
3334
.select("*")
3435
.eq("leaderboard_id", leaderboard.id);

app/components/LeaderboardTable.tsx

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
11
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
22
import { faClock, faCode, faTerminal, faServer, faBolt, faFire, faStar, faRocket } from "@fortawesome/free-solid-svg-icons";
3+
import { Member } from "@/app/types/LeaderboardMember";
34

4-
type Member = {
5-
user_id: string;
6-
role: string;
7-
email: string;
8-
total_seconds: number;
9-
languages: { name: string }[] | null;
10-
operating_systems: { name: string }[] | null;
11-
editors: { name: string }[] | null;
12-
};
135

146
function LeaderboardStats({ members }: { members: Member[] }) {
157
const totalHours = Math.round(
@@ -114,6 +106,7 @@ export default function LeaderboardTable({
114106
.map((member, index) => ({
115107
user_id: member.user_id,
116108
rank: index + 1,
109+
name: member.name,
117110
email: member.email,
118111
hours: Math.round((member.total_seconds || 0) / 3600),
119112
role: member.role,
@@ -200,7 +193,7 @@ export default function LeaderboardTable({
200193
) : (
201194
<div className="glass-card overflow-hidden">
202195
{/* Header Row (Desktop) */}
203-
<div className="hidden md:flex items-center px-4 sm:px-6 py-4 border-b border-white/5 bg-white/[0.01] text-[10px] font-bold text-gray-500 uppercase tracking-widest">
196+
<div className="hidden md:flex items-center px-4 sm:px-6 py-4 border-b border-white/5 bg-white/1 text-[10px] font-bold text-gray-500 uppercase tracking-widest">
204197
<div className="w-12 shrink-0 text-center">Rank</div>
205198
<div className="flex-1 ml-4">Developer</div>
206199
<div className="w-48 lg:w-72 xl:w-80">Tech Stack</div>
@@ -219,16 +212,16 @@ export default function LeaderboardTable({
219212
<div
220213
key={user.user_id}
221214
className={`group relative flex flex-col md:flex-row items-start md:items-center px-4 sm:px-6 py-4 md:py-4 transition-colors hover:bg-white/[0.02] ${
222-
isCurrentUser ? "bg-indigo-500/[0.02]" : "bg-transparent"
215+
isCurrentUser ? "bg-indigo-500/2" : "bg-transparent"
223216
}`}
224217
>
225218
{/* Background Progress Bar */}
226219
<div
227-
className="absolute left-0 bottom-0 h-[1px] bg-gradient-to-r from-indigo-500/50 to-transparent"
220+
className="absolute left-0 bottom-0 h-px bg-linear-to-r from-indigo-500/50 to-transparent"
228221
style={{ width: `${pct}%` }}
229222
/>
230223
{isCurrentUser && (
231-
<div className="absolute left-0 top-0 bottom-0 w-[2px] bg-indigo-500" />
224+
<div className="absolute left-0 top-0 bottom-0 w-0.5 bg-indigo-500" />
232225
)}
233226

234227
{/* MOBILE TOP ROW / DESKTOP LEFT FLEX */}
@@ -242,13 +235,13 @@ export default function LeaderboardTable({
242235

243236
{/* Profile + Badges */}
244237
<div className="flex-1 ml-3 sm:ml-4 min-w-0 flex items-center gap-3">
245-
<div className="w-8 h-8 sm:w-10 sm:h-10 shrink-0 rounded-lg bg-gradient-to-br from-white/5 to-white/10 border border-white/10 flex items-center justify-center text-[10px] sm:text-sm font-semibold text-gray-300 shadow-sm uppercase">
246-
{user.email.charAt(0)}
238+
<div className="w-8 h-8 sm:w-10 sm:h-10 shrink-0 rounded-lg bg-linear-to-br from-white/5 to-white/10 border border-white/10 flex items-center justify-center text-[10px] sm:text-sm font-semibold text-gray-300 shadow-sm uppercase">
239+
{user.name ? user.name.charAt(0) : user.email.charAt(0)}
247240
</div>
248241
<div className="flex flex-col min-w-0 gap-1 sm:gap-1.5">
249242
<div className="flex items-center gap-2">
250-
<p className="font-semibold text-gray-200 tracking-tight text-sm sm:text-[15px] truncate max-w-[120px] xs:max-w-[160px] sm:max-w-[180px] lg:max-w-[200px] leading-none">
251-
{user.email.split("@")[0]}
243+
<p className="font-semibold text-gray-200 tracking-tight text-sm sm:text-[15px] truncate max-w-30 xs:max-w-[160px] sm:max-w-45 lg:max-w-50 leading-none">
244+
{user.name ?? user.email.split("@")[0]}
252245
</p>
253246
{isCurrentUser && (
254247
<span className="px-1.5 py-0.5 rounded border border-indigo-500/30 bg-indigo-500/10 text-indigo-400 text-[8px] sm:text-[9px] uppercase font-bold tracking-widest leading-none">
@@ -275,12 +268,12 @@ export default function LeaderboardTable({
275268
</div>
276269

277270
{/* MOBILE BOTTOM STACK / DESKTOP RIGHT ROW */}
278-
<div className="flex flex-col md:flex-row items-start md:items-center w-full md:w-auto mt-4 md:mt-0 pl-[2.75rem] sm:pl-[4.25rem] md:pl-0 gap-2.5 md:gap-0">
271+
<div className="flex flex-col md:flex-row items-start md:items-center w-full md:w-auto mt-4 md:mt-0 pl-11 sm:pl-17 md:pl-0 gap-2.5 md:gap-0">
279272
{/* Tech Stack */}
280273
<div className="flex flex-wrap items-center gap-1.5 w-full md:w-48 lg:w-72 xl:w-80 md:shrink-0 md:pr-4">
281274
{user.languages.length > 0 ? (
282275
user.languages.map((lang, i) => (
283-
<span key={i} className="px-1.5 sm:px-2 py-0.5 sm:py-1 rounded bg-white/[0.03] border border-white/5 text-[9px] sm:text-[10px] text-gray-300 font-medium tracking-wide truncate max-w-[70px] sm:max-w-[80px]">
276+
<span key={i} className="px-1.5 sm:px-2 py-0.5 sm:py-1 rounded bg-white/3 border border-white/5 text-[9px] sm:text-[10px] text-gray-300 font-medium tracking-wide truncate max-w-[70px] sm:max-w-[80px]">
284277
{lang}
285278
</span>
286279
))
@@ -292,15 +285,15 @@ export default function LeaderboardTable({
292285
{/* Environment */}
293286
<div className="flex items-center gap-1.5 sm:gap-2 w-full md:w-32 lg:w-48 md:shrink-0">
294287
{user.editor !== "N/A" && (
295-
<span className="text-[10px] sm:text-[11px] text-gray-400 font-medium truncate max-w-[70px] lg:max-w-[90px]">
288+
<span className="text-[10px] sm:text-[11px] text-gray-400 font-medium truncate max-w-17.5 lg:max-w-22.5">
296289
{user.editor}
297290
</span>
298291
)}
299292
{user.editor !== "N/A" && user.os !== "N/A" && (
300-
<span className="w-[3px] h-[3px] rounded-full bg-gray-600 shrink-0"></span>
293+
<span className="w-0.75 h-0.75 rounded-full bg-gray-600 shrink-0"></span>
301294
)}
302295
{user.os !== "N/A" && (
303-
<span className="text-[10px] sm:text-[11px] text-gray-400 font-medium truncate max-w-[70px] lg:max-w-[90px]">
296+
<span className="text-[10px] sm:text-[11px] text-gray-400 font-medium truncate max-w-17.5 lg:max-w-22.5">
304297
{user.os}
305298
</span>
306299
)}

app/components/leaderboard/Header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export default function LeaderboardHeader({
110110
/>
111111

112112
<textarea
113-
className="input-field mb-4 min-h-[80px] resize-none"
113+
className="input-field mb-4 min-h-20 resize-none"
114114
value={description}
115115
onChange={(e) => setDescription(e.target.value)}
116116
placeholder="Description (optional)"

app/types/LeaderboardMember.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export interface Member {
2+
user_id: string;
3+
role: string;
4+
name: string | null;
5+
email: string;
6+
total_seconds: number;
7+
languages: { name: string }[] | null;
8+
operating_systems: { name: string }[] | null;
9+
editors: { name: string }[] | null;
10+
};

0 commit comments

Comments
 (0)