rojects/source/components/login-form/login-form.ts

32 lines
1.1 KiB
TypeScript
Raw Normal View History

class LoginForm extends HTMLElement {
connectedCallback(): void {
this.innerHTML = `
<form>
<h2>Login</h2>
<p class="error"></p>
<label>Username<input name="username" autocomplete="username" required></label>
<label>Password<input name="password" type="password" autocomplete="current-password" required></label>
<button type="submit">Login</button>
<a href="/register.html">Create account</a>
</form>
`;
this.querySelector('form')!.addEventListener('submit', async (e: Event) => {
e.preventDefault();
const form = e.target as HTMLFormElement;
const data = Object.fromEntries(new FormData(form));
const res = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok) {
location.href = '/dashboard.html';
} else {
const err = await res.json() as { error: string };
this.querySelector('.error')!.textContent = err.error;
}
});
}
}
customElements.define('login-form', LoginForm);