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>
43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import { getProfile } from "../../db/profile";
|
|
import { getPlanLimits } from "../../utils/plan-features";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = await requireUser(event);
|
|
const dbProfile = await getProfile(user.id);
|
|
|
|
const plan = (dbProfile?.plan === "premium"
|
|
? "legend"
|
|
: dbProfile?.plan === "standard"
|
|
? "pro"
|
|
: dbProfile?.plan ?? "free") as "free" | "pro" | "legend";
|
|
|
|
const limits = getPlanLimits(plan);
|
|
|
|
return {
|
|
id: user.id,
|
|
email: user.email,
|
|
username: dbProfile?.username ?? "",
|
|
nickname: dbProfile?.nickname ?? null,
|
|
avatar: dbProfile?.avatar ?? null,
|
|
plan,
|
|
foundingMember: dbProfile?.foundingMember ?? false,
|
|
streak: dbProfile?.streak ?? 0,
|
|
lyraVoiceId: dbProfile?.lyraVoiceId ?? null,
|
|
onboardingStep: dbProfile?.onboardingStep ?? "welcome",
|
|
created_at: dbProfile?.createdAt?.toISOString() ?? user.created_at,
|
|
// Für useUserPlan im Frontend — Key-Subset der PlanLimits
|
|
planLimits: {
|
|
customDomains: limits.customDomains, // { web: number, mail: number }
|
|
domainRefill: limits.domainRefill,
|
|
mailAgents: limits.mailAgents === Infinity ? null : limits.mailAgents,
|
|
globalBlocklist: limits.globalBlocklist,
|
|
maxAppDevices: limits.maxAppDevices,
|
|
maxProtectedDevices: limits.maxProtectedDevices,
|
|
canCreateGroup: limits.canCreateGroup,
|
|
canAddToBlocklist: limits.canAddToBlocklist,
|
|
},
|
|
globalBlocklistGraceUntil:
|
|
dbProfile?.globalBlocklistGraceUntil?.toISOString() ?? null,
|
|
};
|
|
});
|