feat: implement onboarding flow with complex creation and email verification, and add Zustand for state management

This commit is contained in:
Jose Selesan
2026-04-21 09:14:45 -03:00
parent 23e4218f6f
commit 07408dbbbe
29 changed files with 843 additions and 71 deletions

View File

@@ -1,7 +1,7 @@
import { useEffect } from 'react';
import { apiClient } from '@/lib/api-client';
import { useAuth } from '@/lib/auth';
import { createFileRoute, useNavigate } from '@tanstack/react-router';
import { useEffect } from 'react';
function AuthCallbackPage() {
const navigate = useNavigate();
@@ -28,10 +28,10 @@ function AuthCallbackPage() {
navigate({ to: '/select-complex' });
}
} else {
navigate({ to: '/' });
navigate({ to: '/onboard/create-complex' });
}
} catch {
navigate({ to: '/login' });
navigate({ to: '/onboard' });
}
}
@@ -47,4 +47,4 @@ function AuthCallbackPage() {
export const Route = createFileRoute('/auth-callback')({
component: AuthCallbackPage,
});
});

View File

@@ -0,0 +1,14 @@
import { CreateComplexPage } from '@/features/onboard/create-complex-page';
import { createFileRoute, redirect } from '@tanstack/react-router';
export const Route = createFileRoute('/onboard/create-complex')({
beforeLoad: ({ context }) => {
const hasSession = context.auth.isAuthenticated;
const hasPendingSignup = Boolean(sessionStorage.getItem('pending-signup-email'));
if (!hasSession && !hasPendingSignup) {
throw redirect({ to: '/onboard' });
}
},
component: CreateComplexPage,
});

View File

@@ -1,6 +1,11 @@
import { OnboardStartPage } from '@/features/onboard/onboard-start-page';
import { createFileRoute } from '@tanstack/react-router';
import { OnboardLoginPage } from '@/features/onboard/onboard-login-page';
import { createFileRoute, redirect } from '@tanstack/react-router';
export const Route = createFileRoute('/onboard/')({
component: OnboardStartPage,
beforeLoad: ({ context }) => {
if (!context.auth.isAuthenticated) {
throw redirect({ to: '/login', search: { redirect: '/onboard/create-complex' } });
}
},
component: OnboardLoginPage,
});

View File

@@ -0,0 +1,18 @@
import { VerifyEmailPage } from '@/features/onboard/verify-email-page';
import { createFileRoute, redirect } from '@tanstack/react-router';
import { z } from 'zod';
const verifyEmailSearchSchema = z.object({
email: z.string().email().optional(),
});
export const Route = createFileRoute('/onboard/verify-email')({
validateSearch: verifyEmailSearchSchema,
beforeLoad: () => {
const hasPendingSignup = Boolean(sessionStorage.getItem('pending-signup-email'));
if (!hasPendingSignup) {
throw redirect({ to: '/onboard' });
}
},
component: VerifyEmailPage,
});