|
/**
|
|
* @fileoverview Login Form Component for Rantii
|
|
* @author retoor <retoor@molodetz.nl>
|
|
* @description User authentication form with validation
|
|
* @keywords login, form, authentication, credentials, signin
|
|
*/
|
|
|
|
import { BaseComponent } from './base-component.js';
|
|
|
|
class LoginForm extends BaseComponent {
|
|
init() {
|
|
this.isLoading = false;
|
|
this.render();
|
|
this.bindEvents();
|
|
}
|
|
|
|
render() {
|
|
this.setHtml(`
|
|
<form class="login-form">
|
|
<div class="form-header">
|
|
<h2 class="form-title">Sign In</h2>
|
|
<p class="form-subtitle">Enter your DevRant credentials</p>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="login-username" class="form-label">Username</label>
|
|
<input type="text"
|
|
id="login-username"
|
|
class="form-input"
|
|
name="username"
|
|
autocomplete="username"
|
|
required
|
|
${this.isLoading ? 'disabled' : ''}>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="login-password" class="form-label">Password</label>
|
|
<input type="password"
|
|
id="login-password"
|
|
class="form-input"
|
|
name="password"
|
|
autocomplete="current-password"
|
|
required
|
|
${this.isLoading ? 'disabled' : ''}>
|
|
</div>
|
|
<div class="form-group form-checkbox">
|
|
<input type="checkbox"
|
|
id="login-remember"
|
|
name="remember"
|
|
checked
|
|
${this.isLoading ? 'disabled' : ''}>
|
|
<label for="login-remember">Remember me</label>
|
|
</div>
|
|
<div class="form-error" hidden></div>
|
|
<button type="submit"
|
|
class="form-submit"
|
|
${this.isLoading ? 'disabled' : ''}>
|
|
${this.isLoading ? '<loading-spinner size="small"></loading-spinner>' : 'Sign In'}
|
|
</button>
|
|
</form>
|
|
`);
|
|
}
|
|
|
|
bindEvents() {
|
|
const form = this.$('form');
|
|
if (form) {
|
|
this.on(form, 'submit', this.handleSubmit);
|
|
}
|
|
}
|
|
|
|
async handleSubmit(e) {
|
|
e.preventDefault();
|
|
|
|
if (this.isLoading) return;
|
|
|
|
const username = this.$('#login-username').value.trim();
|
|
const password = this.$('#login-password').value;
|
|
const remember = this.$('#login-remember').checked;
|
|
|
|
if (!username || !password) {
|
|
this.showError('Please enter username and password');
|
|
return;
|
|
}
|
|
|
|
this.setLoading(true);
|
|
this.hideError();
|
|
|
|
try {
|
|
const result = await this.getAuth()?.login(username, password, remember);
|
|
if (result?.success) {
|
|
this.emit('login-success', { user: result.user });
|
|
this.getRouter()?.goHome();
|
|
} else {
|
|
this.showError(result?.error || 'Login failed');
|
|
}
|
|
} catch (error) {
|
|
this.showError('Connection error. Please try again.');
|
|
} finally {
|
|
this.setLoading(false);
|
|
}
|
|
}
|
|
|
|
setLoading(loading) {
|
|
this.isLoading = loading;
|
|
this.render();
|
|
this.bindEvents();
|
|
}
|
|
|
|
showError(message) {
|
|
const errorEl = this.$('.form-error');
|
|
if (errorEl) {
|
|
errorEl.textContent = message;
|
|
errorEl.hidden = false;
|
|
}
|
|
}
|
|
|
|
hideError() {
|
|
const errorEl = this.$('.form-error');
|
|
if (errorEl) {
|
|
errorEl.hidden = true;
|
|
}
|
|
}
|
|
|
|
reset() {
|
|
const form = this.$('form');
|
|
if (form) {
|
|
form.reset();
|
|
}
|
|
this.hideError();
|
|
}
|
|
}
|
|
|
|
customElements.define('login-form', LoginForm);
|
|
|
|
export { LoginForm };
|