From af95174929c529daad8186fb430825f5b1889a9e Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Fri, 13 Feb 2026 13:10:44 +0100 Subject: [PATCH] Refresh page after email verified --- web/components/email-verification-button.tsx | 28 +++++++++++++++++++ .../messaging/email-verification-prompt.tsx | 7 ++--- web/lib/firebase/email-verification.ts | 27 ++++++++++++++++++ web/pages/settings.tsx | 9 ++---- 4 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 web/components/email-verification-button.tsx diff --git a/web/components/email-verification-button.tsx b/web/components/email-verification-button.tsx new file mode 100644 index 00000000..d40b6772 --- /dev/null +++ b/web/components/email-verification-button.tsx @@ -0,0 +1,28 @@ +import {User} from 'firebase/auth' +import {Button} from 'web/components/buttons/button' +import {sendVerificationEmail} from 'web/lib/firebase/email-verification' +import {useT} from 'web/lib/locale' +import {Col} from "web/components/layout/col" + +export function EmailVerificationButton(props: { + user: User +}) { + const {user} = props + const t = useT() + + const isEmailVerified = user.emailVerified + + return ( + + + + ) +} diff --git a/web/components/messaging/email-verification-prompt.tsx b/web/components/messaging/email-verification-prompt.tsx index e28b7dfa..86756416 100644 --- a/web/components/messaging/email-verification-prompt.tsx +++ b/web/components/messaging/email-verification-prompt.tsx @@ -1,7 +1,6 @@ -import {Button} from 'web/components/buttons/button' import {Col} from 'web/components/layout/col' -import {sendVerificationEmail} from 'web/lib/firebase/email-verification' import clsx from 'clsx' +import {EmailVerificationButton} from "web/components/email-verification-button"; interface EmailVerificationPromptProps { firebaseUser: any @@ -18,9 +17,7 @@ export function EmailVerificationPrompt( return (

{t('messaging.email_verification_required', "You must verify your email to message people.")}

- + ) } diff --git a/web/lib/firebase/email-verification.ts b/web/lib/firebase/email-verification.ts index ffccd890..6df99249 100644 --- a/web/lib/firebase/email-verification.ts +++ b/web/lib/firebase/email-verification.ts @@ -1,5 +1,6 @@ import toast from "react-hot-toast"; import {sendEmailVerification, User} from "firebase/auth"; +import {auth} from "web/lib/firebase/users"; export const sendVerificationEmail = async ( @@ -26,4 +27,30 @@ export const sendVerificationEmail = async ( toast.error(t('settings.email.too_many_requests', "You can't request more than one email per minute. Please wait before sending another request.")) } }) + + async function waitForEmailVerification(intervalMs = 2000, timeoutMs = 5 * 60 * 1000) { + const start = Date.now(); + + while (Date.now() - start < timeoutMs) { + const user = auth.currentUser; + if (!user) return false; + + // Refresh user record from Firebase + await user.reload(); + + if (user.emailVerified) { + // IMPORTANT: force a new ID token with updated claims + await user.getIdToken(true); + toast.success(t('settings.email.verified', 'Email Verified ✔️')) + return true; + } + + await new Promise(r => setTimeout(r, intervalMs)); + } + + return false; + } + + waitForEmailVerification() + } \ No newline at end of file diff --git a/web/pages/settings.tsx b/web/pages/settings.tsx index f4b3d12c..2def5cf1 100644 --- a/web/pages/settings.tsx +++ b/web/pages/settings.tsx @@ -22,7 +22,7 @@ import {AboutSettings} from "web/components/about-settings"; import {LanguagePicker} from "web/components/language/language-picker"; import {useT} from "web/lib/locale"; import HiddenProfilesModal from 'web/components/settings/hidden-profiles-modal' -import {sendVerificationEmail} from "web/lib/firebase/email-verification"; +import {EmailVerificationButton} from "web/components/email-verification-button"; export default function NotificationsPage() { const t = useT() @@ -108,8 +108,6 @@ const LoadedGeneralSettings = (props: { changeUserEmail(data.newEmail) } - const isEmailVerified = user.emailVerified - return <>

{t('settings.general.theme', 'Theme')}

@@ -127,10 +125,7 @@ const LoadedGeneralSettings = (props: {

{t('settings.general.account', 'Account')}

{t('settings.general.email', 'Email')}
- + {!isChangingEmail ? (