From 67ec4093838bd835ffefae4fdc422c549ce9f3e6 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Mon, 27 Apr 2026 18:53:13 +0200 Subject: [PATCH] fix: null display name, settings scrollbar, redundant passkey offer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Profile API returns empty string instead of "null" when Logto user has no display name set (String.valueOf(null) → "null" bug). - SettingsPage: add overflowY auto + flex 1 so content scrolls within the AppShell layout (which uses overflow: hidden). - Remove redundant passkey offer from onboarding page — passkey enrollment now happens during sign-in via the Experience API. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../cameleer/saas/account/AccountService.java | 6 ++- ui/src/pages/OnboardingPage.tsx | 40 ------------------- ui/src/pages/tenant/SettingsPage.tsx | 2 +- 3 files changed, 5 insertions(+), 43 deletions(-) diff --git a/src/main/java/net/siegeln/cameleer/saas/account/AccountService.java b/src/main/java/net/siegeln/cameleer/saas/account/AccountService.java index 62483a2..669c621 100644 --- a/src/main/java/net/siegeln/cameleer/saas/account/AccountService.java +++ b/src/main/java/net/siegeln/cameleer/saas/account/AccountService.java @@ -46,10 +46,12 @@ public class AccountService { if (user == null) { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found"); } + Object nameVal = user.get("name"); + Object emailVal = user.get("primaryEmail"); return new ProfileData( userId, - String.valueOf(user.getOrDefault("name", "")), - String.valueOf(user.getOrDefault("primaryEmail", "")) + nameVal != null ? String.valueOf(nameVal) : "", + emailVal != null ? String.valueOf(emailVal) : "" ); } diff --git a/ui/src/pages/OnboardingPage.tsx b/ui/src/pages/OnboardingPage.tsx index 5f2ecd7..f78b16d 100644 --- a/ui/src/pages/OnboardingPage.tsx +++ b/ui/src/pages/OnboardingPage.tsx @@ -20,7 +20,6 @@ export function OnboardingPage() { const [error, setError] = useState(null); const [slugAvailable, setSlugAvailable] = useState(null); const [checkingSlug, setCheckingSlug] = useState(false); - const [showPasskeyOffer, setShowPasskeyOffer] = useState(false); const debounceRef = useRef>(undefined); const slug = toSlug(name); @@ -51,17 +50,6 @@ export function OnboardingPage() { setLoading(true); try { await api.post('/onboarding/tenant', { name, slug }); - // Check if passkeys are enabled in vendor policy - try { - const config = await fetch('/platform/api/config').then(r => r.json()); - if (config.vendorAuthPolicy?.passkeyEnabled) { - setShowPasskeyOffer(true); - setLoading(false); - return; // Don't redirect yet - } - } catch { - // Ignore — proceed without passkey offer - } // Tenant created — force a fresh OIDC sign-in so the Logto SDK gets // new tokens that include the org membership just created. The existing // Logto session cookie means the user won't see a login form — Logto @@ -78,34 +66,6 @@ export function OnboardingPage() { } } - async function handleSkipPasskey() { - await signIn(`${window.location.origin}/platform/callback`); - } - - if (showPasskeyOffer) { - return ( -
-
- -
-
-

Secure your account

-

- Add a passkey to sign in faster with your fingerprint, face, or security key. -

-
-
- -
-
-
-
-
- ); - } - return (
diff --git a/ui/src/pages/tenant/SettingsPage.tsx b/ui/src/pages/tenant/SettingsPage.tsx index 3a22e7c..eecc411 100644 --- a/ui/src/pages/tenant/SettingsPage.tsx +++ b/ui/src/pages/tenant/SettingsPage.tsx @@ -212,7 +212,7 @@ export function SettingsPage() { } return ( -
+

Settings