From 27f7116d921634648df93b42d5c1c6ad9e8d7f6c Mon Sep 17 00:00:00 2001 From: Acho Arnold Ewin Date: Mon, 29 Jun 2026 19:56:39 +0300 Subject: [PATCH 1/2] feat(web): add verify email button on settings page Show a small Vuetify button to trigger email verification when the user's email is not verified, replacing the verified badge. The button disables after sending to prevent duplicate requests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- web/app/pages/settings/index.vue | 42 ++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/web/app/pages/settings/index.vue b/web/app/pages/settings/index.vue index 8861ec12..eb5a1db0 100644 --- a/web/app/pages/settings/index.vue +++ b/web/app/pages/settings/index.vue @@ -15,7 +15,12 @@ import { mdiCalendarClock, mdiPlus, } from '@mdi/js' -import { getAuth, signOut, type User as FirebaseUser } from 'firebase/auth' +import { + getAuth, + sendEmailVerification, + signOut, + type User as FirebaseUser, +} from 'firebase/auth' import QRCode from 'qrcode' import { ErrorMessages } from '~/utils/errors' import { toApiError } from '~/utils/api-error' @@ -45,6 +50,28 @@ const notificationsStore = useNotificationsStore() const firebaseUser = ref(null) const gravatarUrl = ref(null) +const sendingVerificationEmail = ref(false) +const verificationEmailSent = ref(false) + +async function sendVerificationEmail() { + if (!firebaseUser.value) return + sendingVerificationEmail.value = true + try { + await sendEmailVerification(firebaseUser.value) + verificationEmailSent.value = true + notificationsStore.addNotification({ + message: 'Verification email sent. Please check your inbox.', + type: 'success', + }) + } catch { + notificationsStore.addNotification({ + message: 'Failed to send verification email. Please try again later.', + type: 'error', + }) + } finally { + sendingVerificationEmail.value = false + } +} const computeGravatarUrl = async (email: string): Promise => { const normalized = email.trim().toLowerCase() @@ -819,6 +846,17 @@ onMounted(async () => { color="primary" :icon="mdiShieldCheck" /> + + Verify Email + { -
API Key
+
API Key

Use your API Key in the x-api-key HTTP Header when sending requests to From 4d2a4bf95148dee802f95ea7b7b0a4e44d8237ba Mon Sep 17 00:00:00 2001 From: Acho Arnold Date: Mon, 29 Jun 2026 20:02:32 +0300 Subject: [PATCH 2/2] Update web/app/pages/settings/index.vue Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- web/app/pages/settings/index.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/app/pages/settings/index.vue b/web/app/pages/settings/index.vue index eb5a1db0..988f0497 100644 --- a/web/app/pages/settings/index.vue +++ b/web/app/pages/settings/index.vue @@ -63,7 +63,8 @@ async function sendVerificationEmail() { message: 'Verification email sent. Please check your inbox.', type: 'success', }) - } catch { + } catch (error) { + console.error('sendEmailVerification failed:', error) notificationsStore.addNotification({ message: 'Failed to send verification email. Please try again later.', type: 'error',