From e2a0fbe8162f4cf223438e28b086389133f4d9e6 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 15 Oct 2025 22:38:50 +0000 Subject: [PATCH] Fix API token generation UX --- .../components/Settings/APITokenManager.tsx | 23 +++--- .../src/components/Settings/Settings.tsx | 81 +++++++++---------- 2 files changed, 53 insertions(+), 51 deletions(-) diff --git a/frontend-modern/src/components/Settings/APITokenManager.tsx b/frontend-modern/src/components/Settings/APITokenManager.tsx index 85d20b7..06186be 100644 --- a/frontend-modern/src/components/Settings/APITokenManager.tsx +++ b/frontend-modern/src/components/Settings/APITokenManager.tsx @@ -11,6 +11,7 @@ import type { DockerHost } from '@/types/api'; interface APITokenManagerProps { currentTokenHint?: string; onTokensChanged?: () => void; + refreshing?: boolean; } export const APITokenManager: Component = (props) => { @@ -67,16 +68,12 @@ export const APITokenManager: Component = (props) => { const trimmedName = nameInput().trim() || undefined; const { token, record } = await SecurityAPI.createToken(trimmedName); - console.log('✅ Token generated:', { token, record }); - setTokens((prev) => [record, ...prev]); setNewTokenValue(token); setNewTokenRecord(record); setNameInput(''); - console.log('✅ State updated, newTokenValue:', token); - - showSuccess('New API token generated! Scroll up to see it!'); + showSuccess('New API token generated. Copy it below while it is still visible.'); props.onTokensChanged?.(); try { @@ -88,10 +85,6 @@ export const APITokenManager: Component = (props) => { console.warn('Unable to persist API token in localStorage', storageErr); } - // Scroll to top to show the token - setTimeout(() => { - window.scrollTo({ top: 0, behavior: 'smooth' }); - }, 100); } catch (err) { console.error('Failed to generate API token', err); showError('Failed to generate API token'); @@ -190,6 +183,16 @@ export const APITokenManager: Component = (props) => {
+ +
+ + + + + Refreshing security status… +
+
+ {/* CRITICAL: Show generated token FIRST and PROMINENTLY */}
@@ -227,7 +230,7 @@ export const APITokenManager: Component = (props) => {

- 💡 Next: Use this token on the Docker Agents page to deploy monitoring. + 💡 Keep this token safe and use it anywhere Pulse requires API authentication—Docker agents, automations, or custom integrations.

diff --git a/frontend-modern/src/components/Settings/Settings.tsx b/frontend-modern/src/components/Settings/Settings.tsx index 154568d..d12d797 100644 --- a/frontend-modern/src/components/Settings/Settings.tsx +++ b/frontend-modern/src/components/Settings/Settings.tsx @@ -3574,50 +3574,49 @@ const Settings: Component = (props) => { {/* Security setup now handled by first-run wizard */} {/* API Token - Show always to allow API access even when auth is disabled */} - - - {/* Header */} -
-
-
- - - -
- + + {/* Header */} +
+
+
+ + +
-
- - {/* Content */} -
- { - void loadSecurityStatus(); - }} +
- - +
+ + {/* Content */} +
+ { + void loadSecurityStatus(); + }} + refreshing={securityStatusLoading()} + /> +
+
{/* Advanced - Only show if auth is enabled */} {/* Advanced Options section removed - was only used for Registration Tokens */}