//? intent: Landing spot for the email-change confirmation link — proves the new address is reachable. import { useEffect, useState } from 'react'; import { Link, useSearchParams } from 'react-router-dom'; import { loginPageUrl } from 'config'; import { i18nNotify as notify, useTranslator } from '@luckystack/core/client'; import { apiRequest } from 'src/_sockets/apiRequest'; export const template = 'plain'; type Status = 'idle' | 'loading' | 'success' | 'error'; export default function ConfirmEmailPage() { const [params, setParams] = useSearchParams(); //? Read the token once, then drop it from the address bar so the live //? confirmation credential does not linger in browser history, the Referer //? header or error-tracker pageload/navigation/replay data. const [token] = useState(() => params.get('token') ?? ''); useEffect(() => { if (!params.has('token')) return; setParams((previous) => { const next = new URLSearchParams(previous); next.delete('token'); return next; }, { replace: true }); }, [params, setParams]); const translate = useTranslator(); //? Start idle so link-prefetchers and mail-client preview panes cannot //? consume the one-shot token before the human clicks confirm. const [status, setStatus] = useState(token ? 'idle' : 'error'); const [errorKey, setErrorKey] = useState('settings.emailChange.invalidToken'); const handleConfirm = async () => { if (status === 'loading') return; setStatus('loading'); const response = await apiRequest({ name: 'settings/confirmEmailChange', version: 'v1', data: { token }, }); if (response.status === 'success') { setStatus('success'); notify.success({ key: 'settings.emailChange.confirmedTitle' }); } else { setStatus('error'); setErrorKey(response.errorCode); notify.error({ key: response.errorCode }); } }; return (
{status === 'idle' && ( <>

{translate({ key: 'settings.emailChange.confirmPrompt' })}

)} {status === 'loading' && (

{translate({ key: 'settings.emailChange.confirming' })}

)} {status === 'success' && ( <>

{translate({ key: 'settings.emailChange.confirmedTitle' })}

{translate({ key: 'settings.emailChange.confirmedBody' })}

{translate({ key: 'login.resetGoLogin' })} )} {status === 'error' && ( <>

{translate({ key: 'settings.emailChange.failedTitle' })}

{translate({ key: errorKey })}

{translate({ key: 'login.resetBackToLogin' })} )}
); }