You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
// Login page handler
|
|
(function () {
|
|
const form = document.getElementById('login-form');
|
|
const passwordInput = document.getElementById('password');
|
|
const errorEl = document.getElementById('error');
|
|
|
|
// If already authenticated, redirect
|
|
const token = localStorage.getItem('cmux-remote-token');
|
|
if (token) {
|
|
fetch('/api/auth/verify', {
|
|
headers: { Authorization: `Bearer ${token}` },
|
|
})
|
|
.then((r) => r.json())
|
|
.then((data) => {
|
|
if (data.valid) window.location.href = '/';
|
|
})
|
|
.catch(() => {});
|
|
}
|
|
|
|
form.addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
errorEl.classList.remove('visible');
|
|
|
|
const password = passwordInput.value.trim();
|
|
if (!password) return;
|
|
|
|
const submitBtn = form.querySelector('button[type="submit"]');
|
|
submitBtn.disabled = true;
|
|
submitBtn.textContent = 'Connecting...';
|
|
|
|
try {
|
|
const res = await fetch('/api/auth/login', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ password }),
|
|
});
|
|
|
|
const data = await res.json();
|
|
|
|
if (res.ok && data.token) {
|
|
localStorage.setItem('cmux-remote-token', data.token);
|
|
window.location.href = '/';
|
|
} else {
|
|
errorEl.textContent = data.error || 'Login failed';
|
|
errorEl.classList.add('visible');
|
|
passwordInput.value = '';
|
|
passwordInput.focus();
|
|
submitBtn.disabled = false;
|
|
submitBtn.textContent = 'Connect';
|
|
}
|
|
} catch (err) {
|
|
errorEl.textContent = 'Connection failed';
|
|
errorEl.classList.add('visible');
|
|
submitBtn.disabled = false;
|
|
submitBtn.textContent = 'Connect';
|
|
}
|
|
});
|
|
})();
|