Skip to content

Commit edb40ab

Browse files
committed
fix oauth
1 parent 816a011 commit edb40ab

File tree

5 files changed

+50
-53
lines changed

5 files changed

+50
-53
lines changed

TODO.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
- [ ] profile page
2-
- [ ] update metadata
32
- [ ] unified sonner styles (success - loading - error)
43
- [ ] Add resources page
54
- [ ] How to use LeetCode
65
- [ ] Advices for problem solving
76
- [ ] change checkbox color
87
- [ ] Nav bar in mobile screens, add text
98
- [ ] update problems scrollbar
9+
- [x] update metadata
1010
- [x] add banner & stars count & techs
1111
- [x] Add gh stars count
1212
- [x] use google analytics

src/app/(auth)/_components/user-menu.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22

3-
import { IoPersonOutline } from 'react-icons/io5'
3+
// import { IoPersonOutline } from 'react-icons/io5'
44
import type { User } from '@supabase/supabase-js'
55

66
import { Avatar, AvatarFallback, AvatarImage } from '@/ui/avatar'
@@ -9,7 +9,7 @@ import {
99
DropdownMenu,
1010
DropdownMenuContent,
1111
DropdownMenuGroup,
12-
DropdownMenuItem,
12+
// DropdownMenuItem,
1313
DropdownMenuLabel,
1414
DropdownMenuSeparator,
1515
DropdownMenuTrigger,
@@ -37,16 +37,16 @@ export const UserMenu = ({ user }: { user: User }) => {
3737
<DropdownMenuLabel className="flex min-w-0 flex-col">
3838
<span className="text-muted-foreground truncate text-xs font-normal">{user?.email}</span>
3939
</DropdownMenuLabel>
40-
<DropdownMenuSeparator />
40+
{/* <DropdownMenuSeparator /> */}
4141
<DropdownMenuGroup>
42-
<DropdownMenuItem>
42+
{/* <DropdownMenuItem>
4343
<IoPersonOutline
4444
size={16}
4545
className="opacity-60"
4646
aria-hidden="true"
4747
/>
4848
<span>Profile</span>
49-
</DropdownMenuItem>
49+
</DropdownMenuItem> */}
5050
</DropdownMenuGroup>
5151
<DropdownMenuSeparator />
5252
<LogoutBtn />
Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,44 @@
11
import { NextResponse } from 'next/server'
22

33
import { createClient } from '@/supabase/server'
4+
import { sendAdminNotification } from '@/utils/email/sendAdminNotification'
45

56
export async function GET(request: Request) {
67
const { searchParams, origin } = new URL(request.url)
78
const code = searchParams.get('code')
8-
const next = searchParams.get('next') ?? '/'
9-
10-
if (code) {
11-
const supabase = await createClient()
12-
const { error } = await supabase.auth.exchangeCodeForSession(code)
13-
if (!error) {
14-
const forwardedHost = request.headers.get('x-forwarded-host')
15-
const isLocalEnv = process.env.NODE_ENV === 'development'
16-
17-
if (isLocalEnv) return NextResponse.redirect(`${origin}${next}`)
18-
if (forwardedHost) return NextResponse.redirect(`https://${forwardedHost}${next}`)
19-
return NextResponse.redirect(`${origin}${next}`)
20-
}
9+
10+
if (!code) {
11+
console.error('No code provided')
12+
return NextResponse.redirect(`${origin}/auth/auth-code-error`)
13+
}
14+
15+
const supabase = await createClient()
16+
const { error } = await supabase.auth.exchangeCodeForSession(code)
17+
if (error) {
18+
console.error('Error exchanging code for session:', error)
19+
return NextResponse.redirect(`${origin}/auth/error`)
20+
}
21+
22+
// Check if this is a new user (first sign-in)
23+
const { data: userData } = await supabase.auth.getUser()
24+
const { data: sessionData } = await supabase.auth.getSession()
25+
const createdAt = new Date(userData?.user?.created_at || '')
26+
const currentTime = new Date()
27+
28+
// If user was created less than 5 minutes ago, consider them a new user
29+
const isNewUser = currentTime.getTime() - createdAt.getTime() < 5 * 60 * 1000
30+
31+
// Send notification to admin about new user registration
32+
if (isNewUser && userData?.user) {
33+
await sendAdminNotification({
34+
event: 'NEW_USER_REGISTRATION',
35+
userId: userData.user.id,
36+
email: userData.user.email || 'No email provided',
37+
provider: sessionData?.session?.provider_token ? 'OAuth' : 'Email',
38+
userMetadata: JSON.stringify(userData.user.user_metadata),
39+
timestamp: new Date().toISOString(),
40+
})
2141
}
2242

23-
return NextResponse.redirect(`${origin}/auth/auth-code-error`)
43+
return NextResponse.redirect(`${origin}/`)
2444
}

src/app/(public)/groups/group-card.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const GroupCard = ({ group, problemsCount }: GroupCardProps) => {
2828
const isFull = leetcodersCount >= maxLeetcoders
2929

3030
return (
31-
<Card className="relative z-50 overflow-hidden border border-zinc-700/10 bg-gradient-to-tr from-[#141416] to-[#1C1C1C] shadow-[0_8px_24px_rgba(0,0,0,0.3)] backdrop-blur-md before:absolute before:inset-0 before:-z-10 before:rounded-lg before:bg-gradient-to-tr before:from-zinc-900/20 before:to-zinc-800/5 before:opacity-20 after:absolute after:inset-0 after:-z-20 after:bg-[url('/noise.png')] after:[background-size:200px] after:opacity-[0.15] after:mix-blend-overlay">
31+
<Card className="relative z-50 overflow-hidden border border-zinc-700/10 bg-gradient-to-tr from-[#141416] to-[#1C1C1C] shadow-[0_8px_24px_rgba(0,0,0,0.3)] backdrop-blur-md before:absolute before:inset-0 before:-z-10 before:rounded-lg before:bg-gradient-to-tr before:from-zinc-900/20 before:to-zinc-800/5 before:opacity-20 after:absolute after:inset-0 after:-z-20 after:[background-size:200px] after:opacity-[0.15] after:mix-blend-overlay">
3232
<CardHeader>
3333
<div className="flex flex-wrap items-center justify-between gap-3">
3434
<div className="flex items-center gap-3">

src/supabase/middleware.ts

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import { env } from '@/config/env.mjs'
55
import { ADMINS_EMAILS, PROTECTED_ROUTES } from '@/data/constants'
66

77
export async function updateSession(request: NextRequest) {
8-
const { searchParams, pathname } = new URL(request.url)
9-
const code = searchParams.get('code')
8+
const { pathname } = new URL(request.url)
109

11-
let response = NextResponse.next({
10+
const response = NextResponse.next({
1211
request: {
1312
headers: request.headers,
1413
},
@@ -23,12 +22,6 @@ export async function updateSession(request: NextRequest) {
2322
return request.cookies.getAll()
2423
},
2524
setAll(cookiesToSet) {
26-
for (const { name, value } of cookiesToSet) {
27-
request.cookies.set(name, value)
28-
}
29-
response = NextResponse.next({
30-
request,
31-
})
3225
for (const { name, value, options } of cookiesToSet) {
3326
response.cookies.set(name, value, options)
3427
}
@@ -37,33 +30,13 @@ export async function updateSession(request: NextRequest) {
3730
}
3831
)
3932

40-
if (code) {
41-
try {
42-
const { error } = await supabase.auth.exchangeCodeForSession(code)
43-
if (error) {
44-
console.error('Error exchanging auth code:', error.message)
45-
} else {
46-
const redirectUrl = new URL(request.url)
47-
redirectUrl.searchParams.delete('code')
48-
49-
const redirectResponse = NextResponse.redirect(redirectUrl)
50-
for (const cookie of response.cookies.getAll()) {
51-
redirectResponse.cookies.set(cookie.name, cookie.value)
52-
}
53-
54-
return redirectResponse
55-
}
56-
} catch (err) {
57-
console.error('Exception during auth code exchange:', err)
58-
}
59-
}
60-
61-
// IMPORTANT: DO NOT REMOVE auth.getUser()
33+
// Get the current user session
6234
const {
6335
data: { user },
6436
} = await supabase.auth.getUser()
65-
console.log('middleware user', user?.email)
37+
console.log('Middleware user:', user?.email)
6638

39+
// Protect specific routes
6740
if (PROTECTED_ROUTES.some((route) => pathname.startsWith(route))) {
6841
if (!user || !user.email || !ADMINS_EMAILS.includes(user.email)) {
6942
return NextResponse.redirect(new URL('/not-found', request.url))
@@ -72,3 +45,7 @@ export async function updateSession(request: NextRequest) {
7245

7346
return response
7447
}
48+
49+
export const config = {
50+
matcher: ['/dashboard/:path*', '/profile/:path*'],
51+
}

0 commit comments

Comments
 (0)