earwigmoth's picture
login
fbcba92 verified
Raw
History Blame Contribute Delete
5.66 kB
/* ============================================================
SpeakFlow AI – login.js
============================================================ */
'use strict';
// Admin credentials
const ADMIN_EMAIL = 'admin@speakflow.ai';
const ADMIN_PASS = 'admin123';
// Redirect if already logged in
(function(){
const s = JSON.parse(localStorage.getItem('sf_session')||'null');
if(s && s.loggedIn){
if(s.isAdmin) window.location.href='admin.html';
else window.location.href='index.html';
}
})();
/* ── Particles ─────────────────────────────────────────────── */
(function(){
const c=document.getElementById('authParticles');
for(let i=0;i<20;i++){
const p=document.createElement('div');p.className='particle';
const sz=Math.random()*5+2;
Object.assign(p.style,{width:sz+'px',height:sz+'px',left:Math.random()*100+'%',bottom:'-10px',animationDuration:(Math.random()*20+15)+'s',animationDelay:(Math.random()*10)+'s',opacity:Math.random()*.4+.1});
c.appendChild(p);
}
})();
/* ── Remember Me pre-fill ──────────────────────────────────── */
const remembered = localStorage.getItem('sf_remember');
if(remembered){
document.getElementById('loginEmail').value = remembered;
document.getElementById('rememberMe').checked = true;
}
document.addEventListener('DOMContentLoaded', () => {
const togglePass = document.getElementById('togglePass');
const loginForm = document.getElementById('loginForm');
const forgotBtn = document.getElementById('forgotBtn');
const forgotClose = document.getElementById('forgotClose');
const forgotModal = document.getElementById('forgotModal');
const forgotSubmit = document.getElementById('forgotSubmit');
// Show/Hide Password
if (togglePass) {
togglePass.addEventListener('click', () => {
const inp = document.getElementById('loginPass');
const icon = document.querySelector('#togglePass i');
const show = inp.type === 'password';
inp.type = show ? 'text' : 'password';
icon.className = show ? 'fas fa-eye-slash' : 'fas fa-eye';
});
}
// Login Form
if (loginForm) {
loginForm.addEventListener('submit', function (e) {
e.preventDefault();
const email = document.getElementById('loginEmail').value.trim().toLowerCase();
const pass = document.getElementById('loginPass').value;
const remember = document.getElementById('rememberMe').checked;
const globalErr = document.getElementById('globalErr');
const btnText = document.getElementById('loginBtnText');
const btnLoader = document.getElementById('loginBtnLoader');
if (globalErr) globalErr.textContent = '';
let valid = true;
if (!email) {
document.getElementById('emailErr').textContent = 'Email is required.';
valid = false;
} else {
document.getElementById('emailErr').textContent = '';
}
if (!pass) {
document.getElementById('passErr').textContent = 'Password is required.';
valid = false;
} else {
document.getElementById('passErr').textContent = '';
}
if (!valid) return;
if (btnText) btnText.style.display = 'none';
if (btnLoader) btnLoader.style.display = 'flex';
setTimeout(() => {
// Admin check
if (email === ADMIN_EMAIL && pass === ADMIN_PASS) {
if (remember) localStorage.setItem('sf_remember', email);
else localStorage.removeItem('sf_remember');
localStorage.setItem('sf_session', JSON.stringify({
loggedIn: true,
name: 'Admin',
email,
isAdmin: true
}));
window.location.href = 'admin.html';
return;
}
// User check
const users = JSON.parse(localStorage.getItem('sf_users') || '[]');
const user = users.find(u => u.email === email && u.password === pass);
if (btnText) btnText.style.display = 'flex';
if (btnLoader) btnLoader.style.display = 'none';
if (!user) {
if (globalErr) globalErr.textContent = '❌ Incorrect email or password.';
return;
}
if (remember) localStorage.setItem('sf_remember', email);
else localStorage.removeItem('sf_remember');
localStorage.setItem('sf_session', JSON.stringify({
loggedIn: true,
name: user.name,
email: user.email,
id: user.id,
isAdmin: false
}));
window.location.href = 'index.html';
}, 800);
});
}
// Forgot modal
if (forgotBtn && forgotModal) {
forgotBtn.addEventListener('click', () => {
forgotModal.style.display = 'flex';
});
forgotClose?.addEventListener('click', () => {
forgotModal.style.display = 'none';
});
forgotModal.addEventListener('click', function (e) {
if (e.target === this) this.style.display = 'none';
});
forgotSubmit?.addEventListener('click', () => {
const email = document.getElementById('forgotEmail').value.trim().toLowerCase();
const msg = document.getElementById('forgotMsg');
if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
msg.textContent = '❌ Enter a valid email.';
msg.style.color = 'var(--red)';
msg.style.display = 'block';
return;
}
msg.textContent = '✅ (Demo) Reset link sent to ' + email;
msg.style.color = 'var(--green)';
msg.style.display = 'block';
});
}
});