+page.svelte 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <script>
  2. import { onMount } from 'svelte';
  3. import { goto } from '$app/navigation';
  4. import { userFlag } from '$lib/utils/store';
  5. const beer_icon = '/assets/beer_icon.svg';
  6. import { browser } from '$app/environment';
  7. import { logo_id, companyName_id } from '$lib/utils/store';
  8. let username = '';
  9. let password = '';
  10. let loading = false;
  11. let error = '';
  12. let data;
  13. let currentUser = false;
  14. let company;
  15. const API = (import.meta.env.VITE_API_URL || '').replace(/\/+$/, '');
  16. if (browser) {
  17. company = localStorage.getItem('company');
  18. }
  19. onMount(() => {
  20. if (currentUser) {
  21. goto('/dashboard/tables');
  22. }
  23. switch (company) {
  24. case '1':
  25. logo_id.set(
  26. 'https://i.postimg.cc/bNNBcTZj/Whats-App-Image-2025-07-29-at-19-59-16-removebg-preview.png'
  27. );
  28. companyName_id.set('Bar do Ferlin');
  29. break;
  30. default:
  31. logo_id.set(
  32. 'https://i.postimg.cc/7LPJk38W/beer-meal-24dp-EAC452-FILL0-wght400-GRAD0-opsz24.png'
  33. );
  34. companyName_id.set('Bar Management');
  35. break;
  36. }
  37. });
  38. function passwordForgotten() {
  39. goto('/forgotten');
  40. }
  41. async function handleSubmit(event) {
  42. event.preventDefault();
  43. if (!username || !password) {
  44. error = 'Por favor, preencha todos os campos';
  45. return;
  46. }
  47. error = '';
  48. loading = true;
  49. try {
  50. const response = await fetch(`${API}/login`, {
  51. method: 'POST',
  52. headers: {
  53. 'Content-Type': 'application/json'
  54. },
  55. body: JSON.stringify({
  56. username,
  57. password
  58. })
  59. });
  60. const result = await response.json();
  61. data = result;
  62. const token = data.data.token;
  63. const company = data.data.company_id;
  64. localStorage.setItem('token', token);
  65. localStorage.setItem('company', company);
  66. localStorage.setItem('user', username);
  67. if (data.status === 'ok') {
  68. const id = data.data.role_id;
  69. switch (id) {
  70. case 1:
  71. localStorage.setItem('flag', 'admin');
  72. break;
  73. case 2:
  74. localStorage.setItem('flag', 'waiter');
  75. break;
  76. case 3:
  77. localStorage.setItem('flag', 'kitchen');
  78. break;
  79. case 4:
  80. localStorage.setItem('flag', 'cashier');
  81. break;
  82. default:
  83. localStorage.setItem('flag', '');
  84. }
  85. localStorage.setItem('tktime', 'false');
  86. goto('/dashboard/tables');
  87. } else {
  88. error = 'Usuário ou senha inválidos';
  89. }
  90. } catch (err) {
  91. console.error(err);
  92. error = 'Erro ao conectar com o servidor';
  93. } finally {
  94. loading = false;
  95. }
  96. }
  97. </script>
  98. <div class="flex min-h-screen items-center justify-center bg-[#1C1C1E] px-4">
  99. <div class="w-full max-w-md space-y-8 rounded-lg bg-[#2C2C2E] p-8 shadow-lg">
  100. <div class="flex flex-col items-center justify-center text-center">
  101. <img src={$logo_id} alt="" class="h-20 w-20" />
  102. <h1 class="mt-4 text-3xl font-extrabold text-white">{$companyName_id}</h1>
  103. <p class="mt-2 text-[#A0A0A0]">Login</p>
  104. </div>
  105. {#if error}
  106. <div class="rounded-md bg-[#FF3B30]/20 p-4 text-sm text-[#FF3B30]">
  107. {error}
  108. </div>
  109. {/if}
  110. <form class="mt-8 space-y-6" onsubmit={handleSubmit}>
  111. <div>
  112. <label for="username" class="block text-sm font-medium text-[#A0A0A0]"> Usuário </label>
  113. <div class="relative mt-1">
  114. <!-- <img src="/user-icon.svg" class="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-[#A0A0A0]" alt="" /> -->
  115. <input
  116. id="username"
  117. type="text"
  118. bind:value={username}
  119. placeholder="Digite seu usuário"
  120. class="block w-full rounded-md border border-[#A0A0A0]/20 bg-[#1C1C1E] py-3 pl-3 pr-3 text-white focus:border-[#D4AF37] focus:outline-none focus:ring-2 focus:ring-[#D4AF37]"
  121. />
  122. </div>
  123. </div>
  124. <div>
  125. <label for="password" class="block text-sm font-medium text-[#A0A0A0]"> Senha </label>
  126. <div class="relative mt-1">
  127. <!-- <img src="/lock-icon.svg" class="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-[#A0A0A0]" alt="" /> -->
  128. <input
  129. id="password"
  130. type="password"
  131. bind:value={password}
  132. placeholder="••••••••"
  133. class="block w-full rounded-md border border-[#A0A0A0]/20 bg-[#1C1C1E] py-3 pl-3 pr-3 text-white focus:border-[#D4AF37] focus:outline-none focus:ring-2 focus:ring-[#D4AF37]"
  134. />
  135. </div>
  136. </div>
  137. <div>
  138. <button
  139. type="submit"
  140. class="flex w-full cursor-pointer items-center justify-center rounded-md bg-[#D4AF37] px-4 py-3 text-[#1C1C1E] transition-colors hover:bg-[#D4AF37]/90 focus:outline-none focus:ring-2 focus:ring-[#D4AF37] focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
  141. disabled={loading}
  142. >
  143. {loading ? 'Entrando...' : 'Entrar'}
  144. </button>
  145. </div>
  146. </form>
  147. <div class="flex items-center justify-center">
  148. <button class="cursor-pointer text-[#D4AF37]" onclick={passwordForgotten}
  149. >Esqueci a senha</button
  150. >
  151. </div>
  152. </div>
  153. </div>