Auth.svelte 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <script lang="ts">
  2. import { goto } from "$app/navigation";
  3. import { api_host, authToken } from "$lib";
  4. import type { AuthTokenResponse } from "$lib/dbdata";
  5. let email: string = "";
  6. let password: string = "";
  7. let errorMessage: string = "";
  8. async function authHandler(endpoint: string) {
  9. errorMessage = "";
  10. if (!email || !password) {
  11. errorMessage = "not all parameters provided"
  12. return;
  13. }
  14. try {
  15. const response = await fetch(`${api_host}/api/auth/${endpoint}`, {
  16. method: "POST",
  17. headers: {
  18. "Content-Type": "application/json"
  19. },
  20. body: JSON.stringify({
  21. email: email,
  22. password: password
  23. })
  24. })
  25. if (response.status === 200) {
  26. const data: AuthTokenResponse = await response.json();
  27. localStorage.setItem('token', data.token);
  28. $authToken = data.token;
  29. goto("/user/events");
  30. } else {
  31. errorMessage = "invalid credentials";
  32. }
  33. } catch (error) {
  34. console.log(error);
  35. }
  36. }
  37. async function register() {
  38. await authHandler('register');
  39. }
  40. async function login() {
  41. await authHandler('login');
  42. }
  43. </script>
  44. <article class="large no-padding center center-align middle-align auto-margin">
  45. <fieldset>
  46. <div class="padding top-margin">
  47. <h5>Anmeldung</h5>
  48. <div class="field border">
  49. <h4 class="large-text left-align">Email</h4>
  50. <input id="email" placeholder="Email" bind:value={email} type="email" />
  51. </div>
  52. <div class="field suffix border">
  53. <h4 class="large-text left-align">Password</h4>
  54. <input id="password" placeholder="Password" bind:value={password} type="password" />
  55. </div>
  56. <div class="grid">
  57. <button on:click={login} class="s6">Anmelden</button>
  58. <button on:click={register} class="s6 yellow">Registrierung</button>
  59. </div>
  60. {#if errorMessage}
  61. <h5 class="large-text error-text">{errorMessage}</h5>
  62. {/if}
  63. </div>
  64. </fieldset>
  65. </article>