Skip to content

Commit 3a6c8cf

Browse files
authored
Merge pull request #20 from Mra1k3r0/master
feat: improve social invites, leaderboard sharing, and dashboard stats UX
2 parents 8cc9db9 + f3ec185 commit 3a6c8cf

6 files changed

Lines changed: 223 additions & 101 deletions

File tree

app/(public)/join/[code]/JoinButton.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ export default function JoinButton({
2929
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
3030
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
3131
</svg>
32-
Already a Member &mdash; View Leaderboard
32+
<span className="sm:hidden">View</span>
33+
<span className="hidden sm:inline">View Leaderboard</span>
3334
</Link>
3435
);
3536
}

app/(public)/join/page.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ async function getLeaderboard(code: string) {
2222
async function getMemberCount(leaderboardId: string) {
2323
const supabase = await createClient();
2424
const { count } = await supabase
25-
.from("leaderboard_members")
25+
.from("leaderboard_members_view")
2626
.select("*", { count: "exact", head: true })
2727
.eq("leaderboard_id", leaderboardId);
2828
return count ?? 0;
@@ -163,7 +163,7 @@ export default async function JoinPage({ searchParams }: Props) {
163163
</div>
164164

165165
<p className="text-xs uppercase tracking-[0.2em] text-indigo-400 font-semibold mb-3">
166-
You&apos;ve been invited
166+
{alreadyMember ? "You\u2019re already a member of" : "You\u2019ve been invited to"}
167167
</p>
168168

169169
<h1 className="text-2xl md:text-3xl font-bold gradient-text mb-2">
@@ -198,17 +198,19 @@ export default async function JoinPage({ searchParams }: Props) {
198198
alreadyMember={alreadyMember}
199199
/>
200200

201-
<p className="text-[11px] text-gray-600 mt-6">
202-
Powered by{" "}
203-
<Link href="/" className="text-indigo-400/70 hover:text-indigo-400 transition-colors">
204-
DevPulse
205-
</Link>{" "}
206-
&mdash; Track your coding activity &amp; compete
207-
</p>
201+
{!user && (
202+
<p className="text-[11px] text-gray-600 mt-6">
203+
Powered by{" "}
204+
<Link href="/" className="text-indigo-400/70 hover:text-indigo-400 transition-colors">
205+
DevPulse
206+
</Link>{" "}
207+
&mdash; Track your coding activity &amp; compete
208+
</p>
209+
)}
208210
</div>
209211
</div>
210212

211-
<Footer />
213+
{!user && <Footer />}
212214
</div>
213215
);
214216
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export default async function LeaderboardPage(props: {
6161
/>
6262
</div>
6363

64-
<CTA />
64+
{!user && <CTA />}
6565
<Footer />
6666
</div>
6767
);

app/components/BoardList.tsx

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"use client";
1+
"use client";
22

33
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
44
import { createClient } from "../lib/supabase/client";
@@ -18,7 +18,11 @@ export default function BoardList({
1818
}) {
1919
const supabase = createClient();
2020
const [showCodeModal, setShowCodeModal] = useState(false);
21-
const [selectedCode, setSelectedCode] = useState<string | null>(null);
21+
const [selectedCode, setSelectedCode] = useState<string | null>(null);
22+
const inviteUrl =
23+
typeof window !== "undefined" && selectedCode
24+
? `${window.location.origin}/join?id=${selectedCode}`
25+
: "";
2226
const [showDeleteModal, setShowDeleteModal] = useState(false);
2327

2428
const handleDelete = async () => {
@@ -155,22 +159,47 @@ export default function BoardList({
155159
<div className="absolute -top-10 -right-10 w-32 h-32 bg-indigo-500/20 rounded-full blur-3xl" />
156160

157161
<h3 className="text-[11px] font-bold tracking-widest uppercase text-indigo-400 mb-6 text-center flex items-center justify-center gap-2">
158-
<FontAwesomeIcon icon={faKey} /> Server Join Code
162+
<FontAwesomeIcon icon={faKey} /> Share Server
159163
</h3>
160-
161-
<div className="bg-black/50 border border-white/10 rounded-xl p-6 text-center relative overflow-hidden group">
162-
<div className="absolute inset-0 bg-gradient-to-tr from-indigo-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity" />
163-
<p className="text-3xl font-mono text-white tracking-[0.2em] font-bold relative z-10">
164-
{selectedCode}
165-
</p>
166-
</div>
167-
168-
<div className="mt-8 flex justify-center">
164+
165+
<div className="space-y-5">
166+
<div>
167+
<p className="text-[11px] uppercase tracking-widest text-gray-400 font-bold mb-2">
168+
Join Code
169+
</p>
170+
<div className="bg-black/50 border border-white/10 rounded-xl p-4 text-center relative overflow-hidden group">
171+
<div className="absolute inset-0 bg-gradient-to-tr from-indigo-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity" />
172+
<p className="text-2xl font-mono text-white tracking-[0.2em] font-bold relative z-10">
173+
{selectedCode}
174+
</p>
175+
</div>
176+
</div>
177+
178+
<div>
179+
<p className="text-[11px] uppercase tracking-widest text-gray-400 font-bold mb-2">
180+
Invite URL
181+
</p>
182+
<div className="bg-black/50 border border-white/10 rounded-xl px-3 py-2 text-xs text-gray-300 flex items-center gap-2">
183+
<span className="flex-1 truncate">{inviteUrl}</span>
184+
<button
185+
type="button"
186+
onClick={() => {
187+
if (!inviteUrl) return;
188+
navigator.clipboard.writeText(inviteUrl);
189+
toast.success("Invite link copied");
190+
}}
191+
className="px-3 py-1 rounded-lg text-[11px] font-semibold bg-white/5 hover:bg-white/10 border border-white/10 text-gray-200 transition-colors"
192+
>
193+
Copy
194+
</button>
195+
</div>
196+
</div>
197+
169198
<button
170199
onClick={() => setShowCodeModal(false)}
171200
className="w-full py-2.5 px-4 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm font-medium text-gray-300 transition-colors"
172201
>
173-
Close Window
202+
Close
174203
</button>
175204
</div>
176205
</div>

app/components/LeaderboardTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
1+
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
22
import { faClock, faCode, faTerminal, faServer, faBolt, faFire, faStar, faRocket } from "@fortawesome/free-solid-svg-icons";
33

44
type Member = {

0 commit comments

Comments
 (0)