gaurv007 commited on
Commit
6614a2a
·
verified ·
1 Parent(s): 1cba5dc

fix(auth): web/components/nav.tsx

Browse files
Files changed (1) hide show
  1. web/components/nav.tsx +25 -73
web/components/nav.tsx CHANGED
@@ -32,91 +32,43 @@ export function Nav() {
32
  let cancelled = false;
33
  const supabase = createClient();
34
 
35
- async function checkAuth() {
36
- try {
37
- const { data: { session } } = await supabase.auth.getSession();
38
-
 
 
39
  if (cancelled) return;
40
 
41
  if (!session?.user) {
42
  setUserEmail(null);
43
  setUserRole(null);
44
  setUserTeam(null);
45
- if (!loaded) setLoaded(true);
46
  return;
47
  }
48
 
49
- const user = session.user;
50
- setUserEmail(user.email || null);
 
51
 
52
- // Fetch profile for role/team use getSession instead of getUser
53
- // to avoid extra network call
54
- const { data: profile, error: profileError } = await supabase
55
  .from("profiles")
56
  .select("role, team_id")
57
- .eq("id", user.id)
58
- .single();
59
-
60
- if (cancelled) return;
61
-
62
- if (profileError) {
63
- console.error("[ClauseGuard Nav] Profile error:", profileError.message);
64
- // Even if profile fails, still show the user as logged in
65
- setUserRole("user");
66
- setUserTeam(null);
67
- } else {
68
- setUserRole(profile?.role || "user");
69
- setUserTeam(profile?.team_id || null);
70
- }
71
- } catch (err) {
72
- console.error("[ClauseGuard Nav] Auth check error:", err);
73
- if (!cancelled) {
74
- setUserEmail(null);
75
- setUserRole(null);
76
- setUserTeam(null);
77
- }
78
- }
79
- if (!cancelled) setLoaded(true);
80
- }
81
-
82
- // Check auth immediately
83
- checkAuth();
84
-
85
- // Listen for auth changes (login, logout, token refresh)
86
- const { data: { subscription } } = supabase.auth.onAuthStateChange(
87
- (event, session) => {
88
- console.log("[ClauseGuard Nav] Auth event:", event);
89
-
90
- if (event === "SIGNED_OUT" || !session?.user) {
91
- setUserEmail(null);
92
- setUserRole(null);
93
- setUserTeam(null);
94
- setLoaded(true);
95
- return;
96
- }
97
-
98
- if (event === "SIGNED_IN" || event === "TOKEN_REFRESHED" || event === "INITIAL_SESSION") {
99
- // We have a session — update email immediately, then fetch profile
100
- setUserEmail(session.user.email || null);
101
- setLoaded(true); // Show logged-in state immediately (even before profile loads)
102
-
103
- // Fetch profile in background
104
- supabase
105
- .from("profiles")
106
- .select("role, team_id")
107
- .eq("id", session.user.id)
108
- .single()
109
- .then(({ data: profile, error }) => {
110
- if (cancelled) return;
111
- if (error) {
112
- console.error("[ClauseGuard Nav] Profile error:", error.message);
113
- setUserRole("user");
114
- } else {
115
- setUserRole(profile?.role || "user");
116
- setUserTeam(profile?.team_id || null);
117
- }
118
- });
119
- }
120
  }
121
  );
122
 
 
32
  let cancelled = false;
33
  const supabase = createClient();
34
 
35
+ // Single source of truth: onAuthStateChange.
36
+ // Fires INITIAL_SESSION immediately on setup (synchronous replay of stored session).
37
+ // Then fires SIGNED_IN, SIGNED_OUT, TOKEN_REFRESHED on auth changes.
38
+ // No separate getSession/getUser call — that was causing race conditions.
39
+ const { data: { subscription } } = supabase.auth.onAuthStateChange(
40
+ (event, session) => {
41
  if (cancelled) return;
42
 
43
  if (!session?.user) {
44
  setUserEmail(null);
45
  setUserRole(null);
46
  setUserTeam(null);
47
+ setLoaded(true);
48
  return;
49
  }
50
 
51
+ // User is authenticated — show logged-in nav immediately
52
+ setUserEmail(session.user.email || null);
53
+ setLoaded(true);
54
 
55
+ // Fetch profile (role, team) in background don't block the UI
56
+ supabase
 
57
  .from("profiles")
58
  .select("role, team_id")
59
+ .eq("id", session.user.id)
60
+ .single()
61
+ .then(({ data: profile, error }) => {
62
+ if (cancelled) return;
63
+ if (error) {
64
+ console.error("[ClauseGuard Nav] Profile error:", error.message);
65
+ setUserRole("user");
66
+ setUserTeam(null);
67
+ } else {
68
+ setUserRole(profile?.role || "user");
69
+ setUserTeam(profile?.team_id || null);
70
+ }
71
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  }
73
  );
74