32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
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);
|