From 6f813434e2e0c0b7160d05d6f943b57c69662d36 Mon Sep 17 00:00:00 2001 From: Jage9 Date: Sat, 28 Feb 2026 04:34:17 -0500 Subject: [PATCH] Restore saved-session preconnect UI with HttpOnly auth flow --- client/public/version.js | 2 +- client/src/main.ts | 33 ++++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/client/public/version.js b/client/public/version.js index 48b68c3..0371b2e 100644 --- a/client/public/version.js +++ b/client/public/version.js @@ -1,5 +1,5 @@ // Maintainer-controlled web client version. // Format: YYYY.MM.DD Rn (example: 2026.02.20 R2) -window.CHGRID_WEB_VERSION = "2026.02.28 R316"; +window.CHGRID_WEB_VERSION = "2026.02.28 R317"; // Optional display timezone for timestamps. Falls back to America/Detroit if unset/invalid. window.CHGRID_TIME_ZONE = "America/Detroit"; diff --git a/client/src/main.ts b/client/src/main.ts index dbcdb21..8a9dfcf 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -625,7 +625,8 @@ function applyVoiceSendPermission(): void { /** Enables/disables the connect button based on state and nickname validity. */ function updateConnectAvailability(): void { - const showLogout = state.running; + const hasSavedSessionHint = sanitizeAuthUsername(authUsername).length > 0; + const showLogout = state.running || hasSavedSessionHint; dom.logoutButton.classList.toggle('hidden', !showLogout); dom.logoutButton.disabled = !showLogout; if (state.running) { @@ -636,12 +637,21 @@ function updateConnectAvailability(): void { dom.authSessionView.classList.add('hidden'); return; } - dom.showRegisterButton.classList.remove('hidden'); - dom.authModeSeparator.classList.remove('hidden'); - dom.showRegisterButton.textContent = authMode === 'login' ? 'Register' : 'Login'; - dom.loginView.classList.toggle('hidden', authMode !== 'login'); - dom.registerView.classList.toggle('hidden', authMode !== 'register'); - dom.authSessionView.classList.add('hidden'); + if (hasSavedSessionHint) { + dom.authSessionText.textContent = `Logged in as ${sanitizeAuthUsername(authUsername)}.`; + dom.showRegisterButton.classList.add('hidden'); + dom.authModeSeparator.classList.add('hidden'); + dom.loginView.classList.add('hidden'); + dom.registerView.classList.add('hidden'); + dom.authSessionView.classList.remove('hidden'); + } else { + dom.showRegisterButton.classList.remove('hidden'); + dom.authModeSeparator.classList.remove('hidden'); + dom.showRegisterButton.textContent = authMode === 'login' ? 'Register' : 'Login'; + dom.loginView.classList.toggle('hidden', authMode !== 'login'); + dom.registerView.classList.toggle('hidden', authMode !== 'register'); + dom.authSessionView.classList.add('hidden'); + } const usernameMin = authPolicy?.usernameMinLength ?? 1; const passwordMin = authPolicy?.passwordMinLength ?? 1; const hasLoginCredentials = @@ -651,8 +661,13 @@ function updateConnectAvailability(): void { dom.registerPassword.value.trim().length >= passwordMin && dom.registerPassword.value === dom.registerPasswordConfirm.value; const authReady = authMode === 'login' ? true : hasRegisterCredentials; - dom.connectButton.textContent = - authMode === 'register' ? 'Register & Connect' : hasLoginCredentials ? 'Log In & Connect' : 'Connect'; + dom.connectButton.textContent = hasSavedSessionHint + ? 'Connect' + : authMode === 'register' + ? 'Register & Connect' + : hasLoginCredentials + ? 'Log In & Connect' + : 'Connect'; dom.connectButton.disabled = mediaSession.isConnecting() || !authReady; }