Skip to content

Commit 5288aa1

Browse files
authored
Merge pull request #54 from mrepol742/master
feat: added support for avatar from 0auth2 provider and disable sentry on non production env
2 parents 1da73d6 + 08f9e69 commit 5288aa1

10 files changed

Lines changed: 214 additions & 119 deletions

File tree

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
import { createClient } from "../../../lib/supabase/server";
2-
import LeaderboardTable, { NonNullableMember } from "../../../components/LeaderboardTable";
2+
import LeaderboardTable, {
3+
NonNullableMember,
4+
} from "../../../components/LeaderboardTable";
35
import LeaderboardHeader from "@/app/components/leaderboard/Header";
46
import Footer from "@/app/components/layout/Footer";
57
import CTA from "@/app/components/layout/CTA";
8+
import { getUserWithProfile } from "@/app/lib/supabase/help/user";
69

710
export default async function LeaderboardPage(props: {
811
params: Promise<{ slug: string }>;
912
}) {
10-
const { slug } = await props.params;
11-
const supabase = await createClient();
13+
const [{ user }, { slug }, supabase] = await Promise.all([
14+
getUserWithProfile(),
15+
props.params,
16+
createClient(),
17+
]);
1218

1319
const { data: leaderboard } = await supabase
1420
.from("leaderboards")
@@ -32,10 +38,6 @@ export default async function LeaderboardPage(props: {
3238
.select("*")
3339
.eq("leaderboard_id", leaderboard.id);
3440

35-
const {
36-
data: { user },
37-
} = await supabase.auth.getUser();
38-
3941
const isOwner = user?.id === leaderboard.owner_id;
4042

4143
if (error) {

app/(public)/leaderboard/page.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Footer from "@/app/components/layout/Footer";
44
import CTA from "@/app/components/layout/CTA";
55
import Image from "next/image";
66
import { Metadata } from "next";
7+
import { getUserWithProfile } from "@/app/lib/supabase/help/user";
78

89
export const metadata: Metadata = {
910
title: "Leaderboards - DevPulse",
@@ -54,17 +55,14 @@ export const metadata: Metadata = {
5455
export default async function Leaderboards() {
5556
const supabase = await createClient();
5657

57-
const [leaderboardsResult, userResult] = await Promise.all([
58+
const [{ data, error }, { user }] = await Promise.all([
5859
supabase
5960
.from("leaderboards")
6061
.select("id, name, slug")
6162
.order("created_at", { ascending: false }),
62-
supabase.auth.getUser(),
63+
getUserWithProfile(),
6364
]);
6465

65-
const { data, error } = leaderboardsResult;
66-
const { data: user } = userResult;
67-
6866
if (error) {
6967
return (
7068
<div className="glass-card h-full flex items-center justify-center">

app/(user)/dashboard/layout.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ export default async function Layout({
1414
const name = user?.user_metadata?.name || email.split("@")[0];
1515

1616
return (
17-
<DashboardLayout email={email} name={name} role={profile?.role || "user"}>
17+
<DashboardLayout
18+
email={email}
19+
name={name}
20+
role={profile?.role || "user"}
21+
>
1822
{children}
1923
</DashboardLayout>
2024
);

app/(user)/dashboard/page.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ export default async function Dashboard() {
1818

1919
const email = profile?.email || user.email!;
2020
const name = user?.user_metadata?.name || email.split("@")[0];
21+
const prefferedAvatar =
22+
user?.user_metadata?.avatar_url ||
23+
user?.user_metadata?.picture ||
24+
user?.user_metadata?.avatar ||
25+
null;
2126

22-
return <Stats name={name} email={email} />;
27+
return <Stats name={name} email={email} avatar={prefferedAvatar} />;
2328
}

app/components/dashboard/Settings/Profile.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useState } from "react";
44
import { createClient } from "../../../lib/supabase/client";
55
import { toast } from "react-toastify";
66
import type { User } from "@supabase/supabase-js";
7+
import Image from "next/image";
78

89
export default function UserProfile({ user }: { user: User }) {
910
const supabase = createClient();
@@ -12,6 +13,11 @@ export default function UserProfile({ user }: { user: User }) {
1213
);
1314
const [name, setName] = useState(originalName);
1415
const [loading, setLoading] = useState(false);
16+
const prefferedAvatar =
17+
user?.user_metadata?.avatar_url ||
18+
user?.user_metadata?.picture ||
19+
user?.user_metadata?.avatar ||
20+
null;
1521

1622
const isEdited = name !== originalName;
1723

@@ -56,6 +62,14 @@ export default function UserProfile({ user }: { user: User }) {
5662
Profile
5763
</h3>
5864

65+
<Image
66+
src={prefferedAvatar}
67+
alt="User Avatar"
68+
width={80}
69+
height={80}
70+
className="rounded-full mb-4"
71+
/>
72+
5973
<label className="text-sm text-gray-400 font-medium">Email</label>
6074
<input
6175
type="email"

app/components/dashboard/Settings/ResetPassword.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ export default function ResetPassword({ user }: { user: User }) {
6767
Reset Password
6868
</h3>
6969

70+
<p className="text-gray-400 mb-4 text-sm">
71+
You will receive an email with instructions to reset your password.
72+
</p>
73+
7074
<button type="submit" disabled={loading} className="btn-primary">
7175
Send Reset Email
7276
</button>

0 commit comments

Comments
 (0)