Stage 1+2 des post-signup Onboarding-Flows: - Welcome-Screen: dark-slate Full-Screen mit Pulse-Hero, 3 Mission-Bullets, DSGVO-Box, CTA "Los geht's" - Nickname-Spotlight via react-native-copilot ums TextInput in /profile/edit, auto-start wenn step='nickname', nach Save → step='block' + back to /(app) - Backend: Profile.onboardingStep enum (welcome/nickname/block/done), Migration mit Backfill (existing → done), PATCH /api/profile/me/onboarding-step, /api/auth/me erweitert - Frontend: CopilotProvider in root, Routing-Gate in (app)/_layout, useMe um onboardingStep ergänzt - i18n (de/en/fr) für onboarding.welcome.* + onboarding.nickname_spotlight.* Stage 3 (Block-Aktivierung-Spotlight) folgt in nächster Session — der bestehende ProtectionOnboardingSheet auf Android wird daran angebunden. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
28 lines
942 B
TypeScript
28 lines
942 B
TypeScript
import { setOnboardingStep, isOnboardingStep } from "../../../db/profile";
|
|
|
|
/**
|
|
* PATCH /api/profile/me/onboarding-step
|
|
*
|
|
* Setzt den Onboarding-Stand des eingeloggten Users.
|
|
* Werte: "welcome" | "nickname" | "block" | "done"
|
|
*
|
|
* Body: { step: "nickname" | "block" | "done" }
|
|
*
|
|
* Das Frontend ruft das nach jedem abgeschlossenen Schritt auf:
|
|
* Welcome-Screen "Los geht's" → step="nickname"
|
|
* Nickname-Save → step="block"
|
|
* Block-Aktivierung done → step="done"
|
|
*/
|
|
export default defineEventHandler(async (event) => {
|
|
const user = await requireUser(event);
|
|
const body = await readBody(event);
|
|
const { step } = body as { step?: unknown };
|
|
|
|
if (!isOnboardingStep(step)) {
|
|
throw createError({ statusCode: 400, statusMessage: "invalid_step" });
|
|
}
|
|
|
|
const updated = await setOnboardingStep(user.id, step);
|
|
return { success: true, data: { onboardingStep: updated.onboardingStep } };
|
|
});
|