+page.svelte 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <script>
  2. import { goto } from '$app/navigation';
  3. import { userSignIn, userSignUp } from '$lib/apis/auths';
  4. import { WEBUI_API_BASE_URL } from '$lib/constants';
  5. import { config, user } from '$lib/stores';
  6. import { onMount } from 'svelte';
  7. import toast from 'svelte-french-toast';
  8. let loaded = false;
  9. let mode = 'signin';
  10. let name = '';
  11. let email = '';
  12. let password = '';
  13. const setSessionUser = async (sessionUser) => {
  14. if (sessionUser) {
  15. console.log(sessionUser);
  16. toast.success(`You're now logged in.`);
  17. localStorage.token = sessionUser.token;
  18. await user.set(sessionUser);
  19. goto('/');
  20. }
  21. };
  22. const signInHandler = async () => {
  23. const sessionUser = await userSignIn(email, password).catch((error) => {
  24. toast.error(error);
  25. return null;
  26. });
  27. await setSessionUser(sessionUser);
  28. };
  29. const signUpHandler = async () => {
  30. const sessionUser = await userSignUp(name, email, password).catch((error) => {
  31. toast.error(error);
  32. return null;
  33. });
  34. await setSessionUser(sessionUser);
  35. };
  36. const submitHandler = async () => {
  37. if (mode === 'signin') {
  38. await signInHandler();
  39. } else {
  40. await signUpHandler();
  41. }
  42. };
  43. onMount(async () => {
  44. if ($user !== undefined) {
  45. await goto('/');
  46. }
  47. loaded = true;
  48. });
  49. </script>
  50. {#if loaded}
  51. <div class="fixed m-10 z-50">
  52. <div class="flex space-x-2">
  53. <div class=" self-center">
  54. <img src="/ollama.png" class=" w-8" />
  55. </div>
  56. </div>
  57. </div>
  58. <div class=" bg-white min-h-screen w-full flex justify-center font-mona">
  59. <!-- <div class="hidden lg:flex lg:flex-1 px-10 md:px-16 w-full bg-yellow-50 justify-center">
  60. <div class=" my-auto pb-16 text-left">
  61. <div>
  62. <div class=" font-bold text-yellow-600 text-4xl">
  63. Get up and running with <br />large language models, locally.
  64. </div>
  65. <div class="mt-2 text-yellow-600 text-xl">
  66. Run Llama 2, Code Llama, and other models. Customize and create your own.
  67. </div>
  68. </div>
  69. </div>
  70. </div> -->
  71. <div class="w-full max-w-lg px-10 md:px-16 bg-white min-h-screen flex flex-col">
  72. <div class=" my-auto pb-10 w-full">
  73. <form
  74. class=" flex flex-col justify-center"
  75. on:submit|preventDefault={() => {
  76. submitHandler();
  77. }}
  78. >
  79. <div class=" text-xl md:text-2xl font-bold">
  80. {mode === 'signin' ? 'Sign in' : 'Sign up'} to Ollama Web UI
  81. </div>
  82. <div class="flex flex-col mt-4">
  83. {#if mode === 'signup'}
  84. <div>
  85. <div class=" text-sm font-semibold text-left mb-1">Name</div>
  86. <input
  87. bind:value={name}
  88. type="text"
  89. class=" border px-4 py-2.5 rounded-2xl w-full text-sm"
  90. autocomplete="name"
  91. placeholder="Enter Your Full Name"
  92. required
  93. />
  94. </div>
  95. <hr class=" my-3" />
  96. {/if}
  97. <div class="mb-2">
  98. <div class=" text-sm font-semibold text-left mb-1">Email</div>
  99. <input
  100. bind:value={email}
  101. type="email"
  102. class=" border px-4 py-2.5 rounded-2xl w-full text-sm"
  103. autocomplete="email"
  104. placeholder="Enter Your Email"
  105. required
  106. />
  107. </div>
  108. <div>
  109. <div class=" text-sm font-semibold text-left mb-1">Password</div>
  110. <input
  111. bind:value={password}
  112. type="password"
  113. class=" border px-4 py-2.5 rounded-2xl w-full text-sm"
  114. placeholder="Enter Your Password"
  115. autocomplete="current-password"
  116. required
  117. />
  118. </div>
  119. </div>
  120. <div class="mt-5">
  121. <button
  122. class=" bg-gray-900 hover:bg-gray-800 w-full rounded-full text-white font-semibold text-sm py-3 transition"
  123. type="submit"
  124. >
  125. {mode === 'signin' ? 'Sign In' : 'Create Account'}
  126. </button>
  127. <div class=" mt-4 text-sm text-center">
  128. {mode === 'signin' ? `Don't have an account?` : `Already have an account?`}
  129. <button
  130. class=" font-medium underline"
  131. type="button"
  132. on:click={() => {
  133. if (mode === 'signin') {
  134. mode = 'signup';
  135. } else {
  136. mode = 'signin';
  137. }
  138. }}
  139. >
  140. {mode === 'signin' ? `Sign up` : `Sign In`}
  141. </button>
  142. </div>
  143. </div>
  144. </form>
  145. </div>
  146. </div>
  147. </div>
  148. {/if}
  149. <style>
  150. .font-mona {
  151. font-family: 'Mona Sans';
  152. }
  153. </style>