login.html 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Modern PictoChat</title>
  7. <link rel="stylesheet" href="styles.css">
  8. <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
  9. </head>
  10. <body>
  11. <div class="login container">
  12. <h1>join room</h1>
  13. <span id="join-info">other people can join</span>
  14. <form id="login-form">
  15. <input type="text" id="username" name="u" placeholder="your name" required autocomplete="off">
  16. <input type="password" id="password" name="p" placeholder="password" style="display: none;">
  17. <button type="submit">join</button>
  18. </form>
  19. <span id="login-error" style="color: #ff5555; margin-top: 10px; font-size: 14px; text-align: center;"></span>
  20. </div>
  21. <script>
  22. const form = document.getElementById("login-form");
  23. const userInp = document.getElementById("username");
  24. const passInp = document.getElementById("password");
  25. const errSpan = document.getElementById("login-error");
  26. let checkedUsername = "";
  27. let isAdmin = false;
  28. form.addEventListener("submit", async (e) => {
  29. e.preventDefault();
  30. errSpan.innerText = "";
  31. const u = userInp.value.trim();
  32. if (!u) return;
  33. if (u !== checkedUsername) {
  34. const res = await fetch("/api/check_username?u=" + encodeURIComponent(u));
  35. const data = await res.json();
  36. checkedUsername = u;
  37. isAdmin = data.status === "admin";
  38. }
  39. if (isAdmin && passInp.style.display === "none") {
  40. passInp.style.display = "block";
  41. passInp.required = true;
  42. passInp.focus();
  43. return;
  44. }
  45. const payload = { u: u };
  46. if (isAdmin) payload.password = passInp.value;
  47. const loginRes = await fetch("/api/login", {
  48. method: "POST",
  49. headers: { "Content-Type": "application/json" },
  50. body: JSON.stringify(payload)
  51. });
  52. const loginData = await loginRes.json();
  53. if (loginRes.ok) {
  54. window.location.href = "/?u=" + encodeURIComponent(u);
  55. } else {
  56. errSpan.innerText = loginData.error;
  57. }
  58. });
  59. userInp.addEventListener("input", () => {
  60. if (userInp.value.trim() !== checkedUsername) {
  61. passInp.style.display = "none";
  62. passInp.required = false;
  63. passInp.value = "";
  64. errSpan.innerText = "";
  65. }
  66. });
  67. </script>
  68. <script src="js/room_info.js"></script>
  69. </body>
  70. </html>