From 69161612f67396255b2d73a5ceb2e148ee62f381 Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Fri, 6 Mar 2026 00:38:40 +0100 Subject: [PATCH] Get firebase User even if user/privateUser not set --- web/components/auth-context.tsx | 16 +++++++++------- web/components/email-verification-button.tsx | 14 +++++++------- web/hooks/use-firebase-user.ts | 5 ++--- web/pages/settings.tsx | 14 +++++++------- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/web/components/auth-context.tsx b/web/components/auth-context.tsx index 8d2253b8..73397147 100644 --- a/web/components/auth-context.tsx +++ b/web/components/auth-context.tsx @@ -20,10 +20,7 @@ import {isOnboardingFlag} from 'web/lib/util/signup' // Either we haven't looked up the logged-in user yet (undefined), or we know // the user is not logged in (null), or we know the user is logged in. -export type AuthUser = - | undefined - | null - | (UserAndPrivateUser & {authLoaded: boolean; firebaseUser: FirebaseUser}) +export type AuthUser = undefined | null | (UserAndPrivateUser & {authLoaded: boolean}) const CACHED_USER_KEY = 'CACHED_USER_KEY_V2' export const ensureDeviceToken = () => { @@ -85,7 +82,7 @@ export const clearUserCookie = () => { * - ID token changes (after `getIdToken(true)` or `user.reload()`), * which is important for reflecting `emailVerified` changes without a hard refresh. */ -export function useAndSetupFirebaseUser() { +function useAndSetupFirebaseUser() { const [, forceRender] = useState(0) const [firebaseUser, setFirebaseUser] = useState(auth.currentUser) @@ -107,6 +104,7 @@ export function useAndSetupFirebaseUser() { return firebaseUser } +export const FirebaseUserContext = createContext(undefined) export const AuthContext = createContext(undefined) // function getSupabaseAuthCall() { @@ -133,7 +131,7 @@ export function AuthProvider(props: {children: ReactNode; serverUser?: AuthUser} : !privateUser ? privateUser : firebaseUser - ? {user, privateUser, authLoaded, firebaseUser} + ? {user, privateUser, authLoaded} : undefined useEffect(() => { @@ -246,5 +244,9 @@ export function AuthProvider(props: {children: ReactNode; serverUser?: AuthUser} if (authLoaded && listenPrivateUser) setPrivateUser(listenPrivateUser) }, [authLoaded, listenPrivateUser]) - return {children} + return ( + + {children} + + ) } diff --git a/web/components/email-verification-button.tsx b/web/components/email-verification-button.tsx index 443e53cc..a4e9941c 100644 --- a/web/components/email-verification-button.tsx +++ b/web/components/email-verification-button.tsx @@ -6,20 +6,20 @@ import {sendVerificationEmail} from 'web/lib/firebase/email-verification' import {useT} from 'web/lib/locale' export function EmailVerificationButton() { - const user = useFirebaseUser() + const firebaseUser = useFirebaseUser() const t = useT() - const isEmailVerified = user?.emailVerified + const isEmailVerified = firebaseUser?.emailVerified async function reload() { - if (!user) return false + if (!firebaseUser) return false // Refresh user record from Firebase - await user.reload() + await firebaseUser.reload() - if (user.emailVerified) { + if (firebaseUser.emailVerified) { // IMPORTANT: force a new ID token with updated claims - await user.getIdToken(true) + await firebaseUser.getIdToken(true) console.log('User email verified') return true } else { @@ -31,7 +31,7 @@ export function EmailVerificationButton() {