From 3f3e23420dccb41e7d51b23fefb6abb21a57da92 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Sun, 7 Apr 2024 23:08:19 +0300 Subject: [PATCH] Working login flow --- public/css/login.css | 35 +++ public/img/logo.png | Bin 0 -> 23237 bytes public/login.html | 71 ++++++ public/scripts/loader.js | 7 - public/scripts/login.js | 142 ++++++++++++ public/scripts/userManagement.js | 18 -- server.js | 131 +++++++---- src/users.js | 383 ++++++++++++++++--------------- 8 files changed, 531 insertions(+), 256 deletions(-) create mode 100644 public/css/login.css create mode 100644 public/img/logo.png create mode 100644 public/scripts/login.js diff --git a/public/css/login.css b/public/css/login.css new file mode 100644 index 000000000..d93ae1b85 --- /dev/null +++ b/public/css/login.css @@ -0,0 +1,35 @@ +body.login #shadow_popup { + opacity: 1; + display: flex; +} + +body.login .logo { + max-width: 30px; +} + +body.login #logoBlock { + align-items: center; + margin: 0 auto; + gap: 10px; +} + +body.login .userSelect { + display: flex; + flex-direction: column; + color: var(--SmartThemeBodyColor); + border: 1px solid var(--SmartThemeBorderColor); + border-radius: 5px; + padding: 3px 5px; + width: min-content; + cursor: pointer; + margin: 5px 0; + transition: background-color 0.15s ease-in-out; + display: flex; + align-items: center; + justify-content: center; + text-align: center; +} + +body.login .userSelect:hover { + background-color: var(--black30a); +} diff --git a/public/img/logo.png b/public/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..14768e82b32b78bd51e3233742667dc3b369a8b2 GIT binary patch literal 23237 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 QKGPVwl_Ra%;&9x50ir%7?*IS* literal 0 HcmV?d00001 diff --git a/public/login.html b/public/login.html index e69de29bb..eb05d012f 100644 --- a/public/login.html +++ b/public/login.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SillyTavern + + + +
+
+
+
+
+

+ + Welcome to SillyTavern +

+

Select a User

+
+
+ + +
+
+
+
+
+
+
+ + + diff --git a/public/scripts/loader.js b/public/scripts/loader.js index 179a0437b..91e7df196 100644 --- a/public/scripts/loader.js +++ b/public/scripts/loader.js @@ -1,7 +1,5 @@ const ELEMENT_ID = 'loader'; -import { populateUserList } from './userManagement.js' - export function showLoader() { const container = $('
').attr('id', ELEMENT_ID); const loader = $('
').attr('id', 'load-spinner').addClass('fa-solid fa-gear fa-spin fa-3x'); @@ -10,7 +8,6 @@ export function showLoader() { } export async function hideLoader() { - //Sets up a 2-step animation. Spinner blurs/fades out, and then the loader shadow does the same. $('#load-spinner').on('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function () { //uncomment this as part of user selection enabling @@ -35,8 +32,4 @@ export async function hideLoader() { //uncomment to make user selection live //await populateUserList() - - } - - diff --git a/public/scripts/login.js b/public/scripts/login.js new file mode 100644 index 000000000..ef34b6747 --- /dev/null +++ b/public/scripts/login.js @@ -0,0 +1,142 @@ +async function getUserList() { + const response = await fetch('/api/users/list'); + const userListObj = await response.json(); + console.log(userListObj); + return userListObj; +} + +async function sendRecoveryPart1(handle) { + const response = await fetch('/api/users/recover-step1', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ handle }), + }); + + if (!response.ok) { + const errorData = await response.json(); + return displayError(errorData.error || 'An error occurred'); + } + + showRecoveryBlock(); +} + +async function sendRecoveryPart2(handle, code, newPassword) { + const recoveryData = { + handle, + code, + newPassword, + }; + + const response = await fetch('/api/users/recover-step2', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(recoveryData), + }); + + if (!response.ok) { + const errorData = await response.json(); + return displayError(errorData.error || 'An error occurred'); + } + + console.log(`Successfully recovered password for ${handle}!`); + await performLogin(handle, newPassword); +} + +async function onUserSelected(user) { + // No password, just log in + if (!user.password) { + return await performLogin(user.handle, ''); + } + + $('#passwordRecoveryBlock').hide(); + $('#passwordEntryBlock').show(); + $('#loginButton').off('click').on('click', async () => { + const password = String($('#userPassword').val()); + await performLogin(user.handle, password); + }); + + $('#recoverPassword').off('click').on('click', async () => { + await sendRecoveryPart1(user.handle); + }); + + $('#sendRecovery').off('click').on('click', async () => { + const code = String($('#recoveryCode').val()); + const newPassword = String($('#newPassword').val()); + await sendRecoveryPart2(user.handle, code, newPassword); + }); + + displayError(''); +} + +function displayError(message) { + $('#errorMessage').text(message); +} + +async function performLogin(handle, password) { + const userInfo = { + handle: handle, + password: password, + }; + + try { + const response = await fetch('/api/users/login', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(userInfo), + }); + + if (!response.ok) { + const errorData = await response.json(); + return displayError(errorData.error || 'An error occurred'); + } + + const data = await response.json(); + + if (data.handle) { + console.log(`Successfully logged in as ${handle}!`); + redirectToHome(); + } + } catch (error) { + console.error('Error logging in:', error); + displayError(String(error)); + } +} + +function redirectToHome() { + window.location.href = '/'; +} + +function showRecoveryBlock() { + $('#passwordEntryBlock').hide(); + $('#passwordRecoveryBlock').show(); + displayError(''); +} + +function onCancelRecoveryClick() { + $('#passwordRecoveryBlock').hide(); + $('#passwordEntryBlock').show(); + displayError(''); +} + +(async function () { + const userList = await getUserList(); + console.log(userList); + for (const user of userList) { + const userBlock = $('
').addClass('userSelect'); + const avatarBlock = $('
').addClass('avatar'); + avatarBlock.append($('').attr('src', user.avatar)); + userBlock.append(avatarBlock); + userBlock.append($('').text(user.name)); + userBlock.append($('').text(user.handle)); + userBlock.on('click', () => onUserSelected(user)); + $('#userList').append(userBlock); + } + document.body.style.display = ''; + $('#cancelRecovery').on('click', onCancelRecoveryClick); +})(); diff --git a/public/scripts/userManagement.js b/public/scripts/userManagement.js index eff0b02b3..e3cd9d34f 100644 --- a/public/scripts/userManagement.js +++ b/public/scripts/userManagement.js @@ -1,10 +1,3 @@ -async function getUserList() { - const response = await fetch('/api/users/list'); - const userListObj = await response.json(); // Assuming the response is in JSON format - console.log(userListObj) - return userListObj; -} - async function registerNewUser() { let handle = String($("#newUserHandle").val()); let name = String($("#newUserName").val()); @@ -111,17 +104,6 @@ export async function populateUserList() { ` const userSelectHTML = ` -
-

Select User

- This is merely a test.
Click a user, and then click Login to proceed.
-
-
- -