@@ -18,11 +18,60 @@ export interface AuthState {
1818 isAuthenticated : boolean
1919}
2020
21- // Get current user from localStorage cache (for immediate UI rendering)
21+ type MinimalCachedUser = Pick < User , "id" | "email" | "name" | "language" | "avatar" >
22+
23+ let inMemoryUser : User | null = null
24+
25+ function readDashboardUserSnapshot ( ) : User | null {
26+ if ( typeof document === "undefined" ) return null
27+ const root = document . querySelector ( "[data-lab68-user]" )
28+ const encoded = root ?. getAttribute ( "data-lab68-user" )
29+ if ( ! encoded ) return null
30+
31+ try {
32+ const decoded = window . atob ( encoded )
33+ const parsed = JSON . parse ( decoded ) as Partial < User >
34+ if ( ! parsed ?. id ) return null
35+
36+ return {
37+ id : parsed . id ,
38+ email : parsed . email || "" ,
39+ name : parsed . name || "User" ,
40+ createdAt : parsed . createdAt || "" ,
41+ language : parsed . language ,
42+ avatar : parsed . avatar ,
43+ }
44+ } catch {
45+ return null
46+ }
47+ }
48+
49+ function toCachedUser ( user : User ) : MinimalCachedUser {
50+ return {
51+ id : user . id ,
52+ email : user . email ,
53+ name : user . name ,
54+ language : user . language ,
55+ avatar : user . avatar ,
56+ }
57+ }
58+
59+ export function setCachedUser ( user : User | null ) {
60+ inMemoryUser = user
61+ }
62+
63+ // Get current user from memory or dashboard server snapshot
2264export function getCurrentUser ( ) : User | null {
65+ if ( inMemoryUser ) return inMemoryUser
2366 if ( typeof window === "undefined" ) return null
24- const session = localStorage . getItem ( "lab68_session" )
25- return session ? JSON . parse ( session ) : null
67+
68+ const snapshot = readDashboardUserSnapshot ( )
69+ if ( snapshot ) {
70+ inMemoryUser = snapshot
71+ return snapshot
72+ }
73+
74+ return null
2675}
2776
2877// Get current user session from Supabase (authoritative source)
@@ -51,7 +100,7 @@ export async function getCurrentUserAsync(): Promise<User | null> {
51100 createdAt : authUser . created_at ,
52101 language : 'en'
53102 }
54- localStorage . setItem ( "lab68_session" , JSON . stringify ( user ) )
103+ setCachedUser ( user )
55104 return user
56105 }
57106
@@ -67,8 +116,7 @@ export async function getCurrentUserAsync(): Promise<User | null> {
67116 avatar : profile . avatar
68117 }
69118
70- // Cache user in localStorage for immediate UI rendering
71- localStorage . setItem ( "lab68_session" , JSON . stringify ( user ) )
119+ setCachedUser ( user )
72120 return user
73121 } catch ( error ) {
74122 console . error ( 'Error getting current user:' , error )
@@ -116,8 +164,7 @@ export async function signUp(
116164 language : language || 'en' ,
117165 }
118166
119- // Cache user in localStorage
120- localStorage . setItem ( "lab68_session" , JSON . stringify ( newUser ) )
167+ setCachedUser ( newUser )
121168
122169 return { success : true , user : newUser }
123170 } catch ( error : any ) {
@@ -172,8 +219,7 @@ export async function signIn(
172219 language : 'en'
173220 }
174221
175- // Cache user in localStorage
176- localStorage . setItem ( "lab68_session" , JSON . stringify ( user ) )
222+ setCachedUser ( user )
177223
178224 if ( rememberMe ) {
179225 localStorage . setItem ( "lab68_remember" , "true" )
@@ -266,8 +312,7 @@ export async function verifyOtp(
266312 language : 'en'
267313 }
268314
269- // Cache user in localStorage
270- localStorage . setItem ( "lab68_session" , JSON . stringify ( user ) )
315+ setCachedUser ( user )
271316
272317 if ( rememberMe ) {
273318 localStorage . setItem ( "lab68_remember" , "true" )
@@ -305,12 +350,11 @@ export async function signOut(): Promise<void> {
305350 try {
306351 const supabase = createClient ( )
307352 await supabase . auth . signOut ( )
308- localStorage . removeItem ( "lab68_session" )
353+ setCachedUser ( null )
309354 localStorage . removeItem ( "lab68_remember" )
310355 } catch ( error ) {
311356 console . error ( 'Error signing out:' , error )
312- // Still clear localStorage even if Supabase signout fails
313- localStorage . removeItem ( "lab68_session" )
357+ setCachedUser ( null )
314358 localStorage . removeItem ( "lab68_remember" )
315359 }
316360}
@@ -357,7 +401,7 @@ export async function updateUserProfile(
357401 const currentUser = await getCurrentUserAsync ( )
358402
359403 if ( currentUser && currentUser . id === userId ) {
360- localStorage . setItem ( "lab68_session" , JSON . stringify ( currentUser ) )
404+ setCachedUser ( currentUser )
361405 }
362406
363407 return { success : true , user : currentUser || undefined }
@@ -385,6 +429,6 @@ export async function checkRememberMe(): Promise<User | null> {
385429// Clear all auth data (useful for debugging)
386430export function clearAuthData ( ) : void {
387431 if ( typeof window === "undefined" ) return
388- localStorage . removeItem ( "lab68_session" )
432+ setCachedUser ( null )
389433 localStorage . removeItem ( "lab68_remember" )
390434}
0 commit comments