Skip to content

Commit 7b0ce6f

Browse files
committed
refactor: Centralize Supabase client usage for auth callbacks and enhance session management in Header.
1 parent ce69bfc commit 7b0ce6f

2 files changed

Lines changed: 18 additions & 16 deletions

File tree

src/app/auth/callback/page.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,16 @@
22

33
import { Suspense, useEffect, useState } from "react";
44
import { useRouter, useSearchParams } from "next/navigation";
5-
import { createClient } from "@supabase/supabase-js";
5+
import { supabase } from "@/lib/supabase";
66
import { Loader2, CheckCircle2, AlertCircle } from "lucide-react";
77

88
/**
99
* Auth Callback Page
1010
*
11-
* Handles the redirect from Supabase magic link.
12-
* Supabase passes tokens in the URL hash, which must be handled client-side.
11+
* Handles the redirect from Supabase magic link or OAuth.
12+
* Uses the shared Supabase client to ensure PKCE code verifier is available.
1313
*/
1414

15-
const supabase = createClient(
16-
process.env.NEXT_PUBLIC_SUPABASE_URL!,
17-
process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY!
18-
);
19-
2015
function AuthCallbackContent() {
2116
const router = useRouter();
2217
const searchParams = useSearchParams();

src/app/components/Header.tsx

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,29 @@ export default function Header() {
1616

1717
useEffect(() => {
1818
const checkAuth = async () => {
19-
// Use getUser() as it provides a more definitive check than getSession()
20-
const { data: { user }, error } = await supabase.auth.getUser();
19+
// First check session (faster, from localStorage)
20+
const { data: { session } } = await supabase.auth.getSession();
2121

22-
if (error || !user) {
23-
setUser(null);
24-
} else {
25-
setUser(user);
22+
if (session?.user) {
23+
setUser(session.user);
24+
setIsLoading(false);
25+
return;
2626
}
27+
28+
// Fallback to getUser if no session (validates with server)
29+
const { data: { user: authUser } } = await supabase.auth.getUser();
30+
setUser(authUser || null);
2731
setIsLoading(false);
2832
};
2933

3034
checkAuth();
3135

32-
const { data: { subscription } } = supabase.auth.onAuthStateChange(async (event, session) => {
33-
if (event === "SIGNED_OUT" || event === "USER_UPDATED" && !session) {
36+
const { data: { subscription } } = supabase.auth.onAuthStateChange((event, session) => {
37+
// Handle all relevant auth events
38+
if (event === "SIGNED_OUT") {
3439
setUser(null);
40+
} else if (event === "SIGNED_IN" || event === "TOKEN_REFRESHED" || event === "INITIAL_SESSION") {
41+
setUser(session?.user || null);
3542
} else if (session?.user) {
3643
setUser(session.user);
3744
}

0 commit comments

Comments
 (0)