feat(onboarding): replace CreateProfile/ConnectGarmin with a single deferred-commit wizard
This commit is contained in:
@@ -2,8 +2,7 @@ import { useEffect, useState } from "react";
|
||||
import { api, BASE_URL } from "./api/client";
|
||||
import "./LoginGate.css";
|
||||
import App from "./App";
|
||||
import { ConnectGarmin } from "./ConnectGarmin";
|
||||
import { CreateProfile } from "./CreateProfile";
|
||||
import { OnboardingWizard } from "./OnboardingWizard";
|
||||
import type { SessionInfo } from "./types/api";
|
||||
|
||||
type Status = "loading" | "authenticated" | "unauthenticated";
|
||||
@@ -18,10 +17,11 @@ const AUTH_ERROR_MESSAGES: Record<string, string> = {
|
||||
// this is the first fork -- "show the login screen" vs "show the app." A
|
||||
// second fork, once authenticated, is whether the session's account has a
|
||||
// provisioned profile yet (session.has_profile) -- a brand-new OIDC login
|
||||
// sees CreateProfile instead of App until it submits one. A third fork,
|
||||
// once provisioned, is whether Garmin has ever been successfully connected
|
||||
// (session.garmin_connected) -- mandatory, and re-checked on every login,
|
||||
// not just immediately after signup.
|
||||
// sees OnboardingWizard instead of App until it completes one. Nothing is
|
||||
// persisted until the wizard's Garmin-connect step actually succeeds (see
|
||||
// docs/superpowers/specs/2026-07-26-onboarding-wizard-deferred-commit-design.md),
|
||||
// so has_profile alone is always sufficient here -- there's no separate
|
||||
// "provisioned but not connected" state to gate on.
|
||||
export function LoginGate() {
|
||||
const [status, setStatus] = useState<Status>("loading");
|
||||
const [session, setSession] = useState<SessionInfo | null>(null);
|
||||
@@ -55,15 +55,11 @@ export function LoginGate() {
|
||||
|
||||
if (!session!.has_profile) {
|
||||
return (
|
||||
<CreateProfile
|
||||
<OnboardingWizard
|
||||
onCreated={(displayName) => setSession((s) => (s ? { ...s, has_profile: true, display_name: displayName } : s))}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
if (!session!.garmin_connected) {
|
||||
return <ConnectGarmin onConnected={() => setSession((s) => (s ? { ...s, garmin_connected: true } : s))} />;
|
||||
}
|
||||
|
||||
return <App session={session!} />;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user