import { render } from 'solid-js/web'; import { createSignal, onMount, Show } from 'solid-js'; function App() { const [loading, setLoading] = createSignal(false); const [status, setStatus] = createSignal(''); const [otp, setOtp] = createSignal(''); const [sendDisabled, setSendDisabled] = createSignal(false); const [countdown, setCountdown] = createSignal(30); const getToken = () => localStorage.getItem('exocore-token') || ''; const getCookies = () => localStorage.getItem('exocore-cookies') || ''; function AlreadyOtp() { const token = getToken(); const cookies = getCookies(); if (token && cookies) { fetch('/private/server/exocore/web/userinfo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token, cookies }), }) .then((res) => res.json()) .then((res) => { const user = res.data?.user; if (user && user.verified === 'success') { window.location.href = '/private/server/exocore/web/public/dashboard'; } }) .catch((err) => { console.warn('Auto-check failed:', err.message); }); } else { window.location.href = '/private/server/exocore/web/public/login'; } } onMount(() => { const otpCheckInterval = setInterval(AlreadyOtp, 3000); }); async function sendOTP() { setLoading(true); setStatus(''); setSendDisabled(true); setCountdown(30); const token = getToken(); const cookies = getCookies(); if (!token || !cookies) { setStatus('Authentication details not found. Please log in again.'); setLoading(false); setSendDisabled(false); return; } try { const res = await fetch('/private/server/exocore/web/otp', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token, cookies, action: 'sent' }), }); const data = await res.json(); if (data.status === 'success') { setStatus(data.data?.message || 'OTP sent successfully!'); startCountdown(); } else { setStatus(data.data?.message || data.message || 'Could not send OTP.'); setSendDisabled(false); } } catch (err) { setStatus(err.message); setSendDisabled(false); } setLoading(false); } async function submitOTP() { setLoading(true); setStatus(''); const token = getToken(); const cookies = getCookies(); if (!token || !cookies) { setStatus('Authentication details not found. Please log in again.'); setLoading(false); return; } if (!otp()) { setStatus('Please enter the OTP.'); setLoading(false); return; } try { const res = await fetch('/private/server/exocore/web/otp', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token, cookies, otp: otp(), action: 'submit' }), }); const data = await res.json(); if (data.status === 'success') { setStatus(data.data?.message || 'OTP verified successfully! Redirecting...'); setTimeout(AlreadyOtp, 1000); } else { setStatus(data.data?.message || data.message || 'Invalid OTP.'); } } catch (err) { setStatus(err.message); } setLoading(false); } function startCountdown() { let timeLeft = 30; setCountdown(timeLeft); const interval = setInterval(() => { timeLeft--; setCountdown(timeLeft); if (timeLeft <= 0) { clearInterval(interval); setSendDisabled(false); setCountdown(30); } }, 1000); } const handleKeyPress = (e) => { if (e.key === 'Enter') { submitOTP(); } }; return (

Account Verification

A verification code may be sent to your email. Please enter it below.

setOtp(e.currentTarget.value)} onKeyPress={handleKeyPress} placeholder="------" maxlength="6"/>
{status()}
); } render(() => , document.getElementById('app'));