fix: IDEAS.md quickfixes — idle-timeout app config, id_token out of Claims, FormEvent import

session.idle_timeout (minutes, default 15) joins the app-config registry
and drives the onboarding Garmin session eviction, distinct from
session.duration (the login cookie lifetime in hours). The raw Keycloak
ID token no longer rides in auth.Claims through every request context:
it's minted into the session cookie separately and read back only by the
logout handler via IDTokenFromSessionCookie. OnboardingWizard uses the
type-imported FormEvent<HTMLFormElement> instead of the React.FormEvent
namespace alias.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-04 17:44:37 +02:00
parent dcbb1d8bb0
commit 8c9285f33c
15 changed files with 160 additions and 61 deletions

View File

@@ -1,4 +1,5 @@
import { useEffect, useRef, useState } from "react";
import type { FormEvent } from "react";
import { api } from "./api/client";
import { showError } from "./banner";
import { BannerStack } from "./components/BannerStack";
@@ -38,7 +39,7 @@ export function OnboardingWizard({
const [completeFailed, setCompleteFailed] = useState(false);
const completeTriggered = useRef(false);
function submitName(e: React.FormEvent) {
function submitName(e: FormEvent<HTMLFormElement>) {
e.preventDefault();
if (!displayName.trim()) {
setValidationError("Please enter a display name.");
@@ -48,7 +49,7 @@ export function OnboardingWizard({
setStep("garmin");
}
async function submitGarmin(e: React.FormEvent) {
async function submitGarmin(e: FormEvent<HTMLFormElement>) {
e.preventDefault();
if (!email.trim() || !password) {
setValidationError("Please enter your Garmin email and password.");