feat: implement onboarding flow with complex creation and email verification, and add Zustand for state management
This commit is contained in:
@@ -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,
|
||||
});
|
||||
});
|
||||
|
||||
14
apps/frontend/src/routes/onboard/create-complex.tsx
Normal file
14
apps/frontend/src/routes/onboard/create-complex.tsx
Normal 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,
|
||||
});
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
18
apps/frontend/src/routes/onboard/verify-email.tsx
Normal file
18
apps/frontend/src/routes/onboard/verify-email.tsx
Normal 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,
|
||||
});
|
||||
Reference in New Issue
Block a user