From 35654feeddfb261584c9c5a426a87de30ed357bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20LAGACHE?= Date: Tue, 16 Jun 2026 16:33:48 +0200 Subject: [PATCH] feat(onboarding): add cookie helper, types and mock data --- src/features/onboarding/onboarding-cookie.ts | 17 +++++ src/features/onboarding/onboarding.mock.ts | 19 +++++ src/features/onboarding/onboarding.types.ts | 80 ++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 src/features/onboarding/onboarding-cookie.ts create mode 100644 src/features/onboarding/onboarding.mock.ts create mode 100644 src/features/onboarding/onboarding.types.ts diff --git a/src/features/onboarding/onboarding-cookie.ts b/src/features/onboarding/onboarding-cookie.ts new file mode 100644 index 00000000..64fd2c3b --- /dev/null +++ b/src/features/onboarding/onboarding-cookie.ts @@ -0,0 +1,17 @@ +'use server'; + +import { cookies } from 'next/headers'; + +const COOKIE_NAME = 'portabase_onboarding'; +const DONE_VALUE = 'done'; + +export async function isOnboardingDone() { + return (await cookies()).get(COOKIE_NAME)?.value === DONE_VALUE; +} + +export async function markOnboardingDone() { + (await cookies()).set(COOKIE_NAME, DONE_VALUE, { + path: '/', + maxAge: 60 * 60 * 24 * 365, + }); +} diff --git a/src/features/onboarding/onboarding.mock.ts b/src/features/onboarding/onboarding.mock.ts new file mode 100644 index 00000000..0b45a846 --- /dev/null +++ b/src/features/onboarding/onboarding.mock.ts @@ -0,0 +1,19 @@ +import { OnboardingMockDatabase, OnboardingSsoConfig } from '@/features/onboarding/onboarding.types'; + +export const mockSsoConfig: OnboardingSsoConfig = { + providers: [ + { id: 'google', label: 'Google' }, + { id: 'github', label: 'GitHub' }, + ], + forced: false, + passkeyEnabled: true, +}; + +export const mockDatabases: OnboardingMockDatabase[] = [ + { id: 'db-primary', name: 'primary', engine: 'postgres' }, + { id: 'db-analytics', name: 'analytics', engine: 'postgres' }, +]; + +export function simulateAgentPing(): Promise { + return new Promise((resolve) => setTimeout(resolve, 2000)); +} diff --git a/src/features/onboarding/onboarding.types.ts b/src/features/onboarding/onboarding.types.ts new file mode 100644 index 00000000..d46bab49 --- /dev/null +++ b/src/features/onboarding/onboarding.types.ts @@ -0,0 +1,80 @@ +export type OnboardingSsoConfig = { + providers: { id: string; label: string }[]; + forced: boolean; + passkeyEnabled: boolean; +}; + +export type OnboardingAccountData = { + name: string; + email: string; +}; + +export type OnboardingSecurityData = { + method: 'passkey' | 'two-factor' | 'skipped'; +}; + +export type OnboardingPreferencesData = { + theme: 'light' | 'dark'; + avatarDataUrl?: string; +}; + +export type OnboardingOrgData = { + name: string; + logoDataUrl?: string; +}; + +export type OnboardingMember = { + email: string; + role: 'member' | 'admin'; +}; + +export type OnboardingChannel = { + id: string; + provider: string; + label: string; +}; + +export type OnboardingDefaultsData = { + notifierId?: string; + storageId?: string; +}; + +export type OnboardingAgent = { + id: string; + name: string; + notifierId?: string; + storageId?: string; +}; + +export type OnboardingMockDatabase = { + id: string; + name: string; + engine: 'postgres' | 'mysql' | 'mongodb'; +}; + +export type OnboardingDbSettings = { + retentionDays: number; + notifierId?: string; + storageId?: string; +}; + +export type OnboardingProjectData = { + name: string; + description: string; + databaseIds: string[]; +}; + +export type OnboardingFlowData = { + sso?: { providerId: string }; + account?: OnboardingAccountData; + security?: OnboardingSecurityData; + preferences?: OnboardingPreferencesData; + org?: OnboardingOrgData; + members?: OnboardingMember[]; + notifiers?: OnboardingChannel[]; + storages?: OnboardingChannel[]; + defaults?: OnboardingDefaultsData; + agents?: OnboardingAgent[]; + project?: OnboardingProjectData; + dbSettings?: Record; +};