import app from '../app.js';
const api = app.getAPI();
const logger = app.getLogger();
export class LoginView extends HTMLElement {
constructor() {
super();
this.render();
this.attachListeners();
}
render() {
this.innerHTML = `
RBox
Self-hosted cloud storage
`;
this.querySelector('#login-error').style.display = 'none';
this.querySelector('#register-error').style.display = 'none';
}
attachListeners() {
const tabs = this.querySelectorAll('.auth-tab');
tabs.forEach(tab => {
tab.addEventListener('click', () => this.switchTab(tab.dataset.tab));
});
this.querySelector('#login-form').addEventListener('submit', (e) => this.handleLogin(e));
this.querySelector('#register-form').addEventListener('submit', (e) => this.handleRegister(e));
}
switchTab(tab) {
const tabs = this.querySelectorAll('.auth-tab');
tabs.forEach(t => t.classList.remove('active'));
this.querySelector(`[data-tab="${tab}"]`).classList.add('active');
const loginForm = this.querySelector('#login-form');
const registerForm = this.querySelector('#register-form');
if (tab === 'login') {
loginForm.style.display = 'block';
registerForm.style.display = 'none';
} else {
loginForm.style.display = 'none';
registerForm.style.display = 'block';
}
}
async handleLogin(e) {
e.preventDefault();
const form = e.target;
const formData = new FormData(form);
const username = formData.get('username');
const password = formData.get('password');
const errorDiv = this.querySelector('#login-error');
errorDiv.style.display = 'none';
errorDiv.textContent = '';
try {
logger.info('Login attempt started', { username });
await api.login(username, password);
logger.info('Login successful, dispatching auth-success event');
this.dispatchEvent(new CustomEvent('auth-success'));
} catch (error) {
logger.error('Login failed', { username, error: error.message });
errorDiv.textContent = error.message;
errorDiv.style.display = 'block';
}
}
async handleRegister(e) {
e.preventDefault();
const form = e.target;
const formData = new FormData(form);
const username = formData.get('username');
const email = formData.get('email');
const password = formData.get('password');
const errorDiv = this.querySelector('#register-error');
errorDiv.style.display = 'none';
errorDiv.textContent = '';
try {
logger.info('Registration attempt started', { username, email });
await api.register(username, email, password);
logger.info('Registration successful, dispatching auth-success event');
this.dispatchEvent(new CustomEvent('auth-success'));
} catch (error) {
logger.error('Registration failed', { username, email, error: error.message });
errorDiv.textContent = error.message;
errorDiv.style.display = 'block';
}
}
}
customElements.define('login-view', LoginView);