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

// 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';
}
});
})();