confirm email
This commit is contained in:
@@ -107,6 +107,14 @@
|
||||
|
||||
<!-- Error Message -->
|
||||
<div id="errorMessage" class="hidden bg-error-container/20 text-error/80 border border-error/30 rounded-lg px-4 py-3 text-xs font-medium"></div>
|
||||
|
||||
<div id="verifyNotice" class="hidden bg-amber-50 text-amber-800 border border-amber-200 rounded-lg px-4 py-3 text-xs font-medium space-y-2">
|
||||
<p id="verifyNoticeText">Please confirm your email before signing in.</p>
|
||||
<button id="resendVerifyBtn" type="button" class="inline-flex items-center gap-1 px-3 py-1.5 rounded-md bg-amber-100 hover:bg-amber-200 text-amber-900 font-semibold transition-colors">
|
||||
<span class="material-symbols-outlined text-sm">forward_to_inbox</span>
|
||||
<span>Resend confirmation email</span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- Register Form -->
|
||||
@@ -186,6 +194,7 @@
|
||||
</button>
|
||||
|
||||
<div id="registerErrorMessage" class="hidden bg-error-container/20 text-error/80 border border-error/30 rounded-lg px-4 py-3 text-xs font-medium"></div>
|
||||
<div id="registerSuccessMessage" class="hidden bg-green-50 text-green-800 border border-green-200 rounded-lg px-4 py-3 text-xs font-medium"></div>
|
||||
</form>
|
||||
|
||||
<!-- Footer -->
|
||||
@@ -210,12 +219,17 @@
|
||||
const rememberCheckbox = document.getElementById('remember');
|
||||
const registerForm = document.getElementById('registerForm');
|
||||
const registerErrorMessage = document.getElementById('registerErrorMessage');
|
||||
const registerSuccessMessage = document.getElementById('registerSuccessMessage');
|
||||
const verifyNotice = document.getElementById('verifyNotice');
|
||||
const verifyNoticeText = document.getElementById('verifyNoticeText');
|
||||
const resendVerifyBtn = document.getElementById('resendVerifyBtn');
|
||||
const regFullnameInput = document.getElementById('regFullname');
|
||||
const regEmailInput = document.getElementById('regEmail');
|
||||
const regUsernameInput = document.getElementById('regUsername');
|
||||
const regPasswordInput = document.getElementById('regPassword');
|
||||
const loginTab = document.getElementById('loginTab');
|
||||
const registerTab = document.getElementById('registerTab');
|
||||
let pendingVerificationIdentifier = '';
|
||||
let currentMode = 'login';
|
||||
|
||||
const setMode = (mode) => {
|
||||
@@ -226,6 +240,8 @@
|
||||
registerForm.classList.toggle('hidden', isLogin);
|
||||
errorMessage.classList.add('hidden');
|
||||
registerErrorMessage.classList.add('hidden');
|
||||
registerSuccessMessage.classList.add('hidden');
|
||||
verifyNotice.classList.add('hidden');
|
||||
|
||||
const activate = (btn, active) => {
|
||||
btn.classList.toggle('bg-primary', active);
|
||||
@@ -262,6 +278,7 @@
|
||||
loginForm.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
errorMessage.classList.add('hidden');
|
||||
verifyNotice.classList.add('hidden');
|
||||
|
||||
const username = usernameInput.value.trim();
|
||||
const password = passwordInput.value;
|
||||
@@ -291,6 +308,10 @@
|
||||
|
||||
// Redirect to dashboard
|
||||
window.location.href = './index.html';
|
||||
} else if (data.requiresEmailVerification) {
|
||||
pendingVerificationIdentifier = data.username || data.email || username;
|
||||
verifyNoticeText.textContent = data.message || 'Please confirm your email before signing in';
|
||||
verifyNotice.classList.remove('hidden');
|
||||
} else {
|
||||
// Show error
|
||||
errorMessage.textContent = data.message || 'Invalid username or password';
|
||||
@@ -308,6 +329,7 @@
|
||||
registerForm.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
registerErrorMessage.classList.add('hidden');
|
||||
registerSuccessMessage.classList.add('hidden');
|
||||
|
||||
const payload = {
|
||||
fullname: regFullnameInput.value.trim(),
|
||||
@@ -316,8 +338,8 @@
|
||||
password: regPasswordInput.value
|
||||
};
|
||||
|
||||
if (!payload.username || !payload.password) {
|
||||
registerErrorMessage.textContent = 'Username and password are required';
|
||||
if (!payload.username || !payload.password || !payload.email) {
|
||||
registerErrorMessage.textContent = 'Username, password and email are required';
|
||||
registerErrorMessage.classList.remove('hidden');
|
||||
return;
|
||||
}
|
||||
@@ -333,10 +355,19 @@
|
||||
const isJson = response.headers.get('content-type')?.includes('application/json');
|
||||
const data = isJson ? await response.json() : null;
|
||||
|
||||
if (response.ok && data?.success && data.user) {
|
||||
localStorage.setItem('currentUser', JSON.stringify(data.user));
|
||||
localStorage.setItem('rememberedUsername', payload.username);
|
||||
window.location.href = './index.html';
|
||||
if (response.ok && data?.success) {
|
||||
const lines = [data.message || 'Registration successful. Please check your email to confirm account.'];
|
||||
if (data.verificationPreviewUrl) {
|
||||
lines.push(`Development verification link: ${data.verificationPreviewUrl}`);
|
||||
}
|
||||
|
||||
regPasswordInput.value = '';
|
||||
setMode('login');
|
||||
usernameInput.value = payload.username;
|
||||
passwordInput.value = '';
|
||||
pendingVerificationIdentifier = payload.email || payload.username;
|
||||
verifyNoticeText.textContent = lines.join(' ');
|
||||
verifyNotice.classList.remove('hidden');
|
||||
} else {
|
||||
const fallback = isJson ? (data?.message || 'Registration failed') : 'Server error (HTML response)';
|
||||
registerErrorMessage.textContent = fallback;
|
||||
@@ -348,6 +379,35 @@
|
||||
console.error('Register error:', error);
|
||||
}
|
||||
});
|
||||
|
||||
resendVerifyBtn.addEventListener('click', async () => {
|
||||
const identifier = pendingVerificationIdentifier || usernameInput.value.trim();
|
||||
if (!identifier) {
|
||||
verifyNoticeText.textContent = 'Enter username/email first, then try resending verification.';
|
||||
verifyNotice.classList.remove('hidden');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch('/api/auth/resend-verification', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ identifier })
|
||||
});
|
||||
const data = await response.json();
|
||||
verifyNoticeText.textContent = data.message || 'Verification email processed.';
|
||||
verifyNotice.classList.remove('hidden');
|
||||
if (data.verificationPreviewUrl) {
|
||||
verifyNoticeText.textContent += ` Development link: ${data.verificationPreviewUrl}`;
|
||||
}
|
||||
} catch (error) {
|
||||
verifyNoticeText.textContent = 'Cannot resend verification email right now.';
|
||||
verifyNotice.classList.remove('hidden');
|
||||
console.error('Resend verification error:', error);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user