import { useState, useEffect } from "react"; import { Link, useNavigate } from "react-router-dom"; import Layout from "@/components/Layout"; import LoadingScreen from "@/components/LoadingScreen"; import { SkeletonOnboardingStep } from "@/components/Skeleton"; import UserTypeSelection from "@/components/onboarding/UserTypeSelection"; import PersonalInfo from "@/components/onboarding/PersonalInfo"; import Experience from "@/components/onboarding/Experience"; import Interests from "@/components/onboarding/Interests"; import Welcome from "@/components/onboarding/Welcome"; import { useAuth } from "@/contexts/AuthContext"; import { aethexUserService, aethexAchievementService, } from "@/lib/aethex-database-adapter"; import { aethexToast } from "@/lib/aethex-toast"; export type UserType = "game-developer" | "client" | "member" | "customer"; export interface OnboardingData { userType: UserType | null; personalInfo: { firstName: string; lastName: string; email: string; company?: string; }; experience: { level: string; skills: string[]; previousProjects?: string; }; interests: { primaryGoals: string[]; preferredServices: string[]; }; } const initialData: OnboardingData = { userType: null, personalInfo: { firstName: "", lastName: "", email: "", company: "", }, experience: { level: "", skills: [], previousProjects: "", }, interests: { primaryGoals: [], preferredServices: [], }, }; export default function Onboarding() { const [currentStep, setCurrentStep] = useState(0); const [data, setData] = useState(initialData); const [isLoading, setIsLoading] = useState(true); const [isTransitioning, setIsTransitioning] = useState(false); const [isFinishing, setIsFinishing] = useState(false); const navigate = useNavigate(); const { user } = useAuth(); const steps = [ { title: "Choose Your Path", component: UserTypeSelection }, { title: "Personal Information", component: PersonalInfo }, { title: "Experience Level", component: Experience }, { title: "Interests & Goals", component: Interests }, { title: "Welcome to AeThex", component: Welcome }, ]; useEffect(() => { const timer = setTimeout(() => { setIsLoading(false); }, 1200); return () => clearTimeout(timer); }, []); const updateData = (newData: Partial) => { setData((prev) => ({ ...prev, ...newData })); }; const nextStep = () => { if (currentStep < steps.length - 1) { setIsTransitioning(true); setTimeout(() => { setCurrentStep((prev) => prev + 1); setIsTransitioning(false); }, 300); } }; const prevStep = () => { if (currentStep > 0) { setIsTransitioning(true); setTimeout(() => { setCurrentStep((prev) => prev - 1); setIsTransitioning(false); }, 300); } }; const CurrentStepComponent = steps[currentStep].component; const finishOnboarding = async () => { if (!user) { navigate("/login"); return; } setIsFinishing(true); try { const userTypeMap: Record = { "game-developer": "game_developer", client: "client", member: "community_member", customer: "customer", }; const existing = await aethexUserService.getCurrentUser(); const payload = { username: `${data.personalInfo.firstName || user.email?.split("@")[0] || "user"}`, full_name: `${data.personalInfo.firstName} ${data.personalInfo.lastName}`.trim(), user_type: (userTypeMap[data.userType || "member"] as any) || "community_member", experience_level: (data.experience.level as any) || "beginner", bio: data.experience.previousProjects || undefined, } as any; if (existing) { await aethexUserService.updateProfile(user.id, payload); } else { await aethexUserService.createInitialProfile(user.id, payload); } const interests = Array.from( new Set([ ...(data.interests.primaryGoals || []), ...(data.interests.preferredServices || []), ]), ); if (interests.length) { await aethexUserService.addUserInterests(user.id, interests); } await aethexAchievementService.checkAndAwardOnboardingAchievement( user.id, ); navigate("/dashboard", { replace: true }); } catch (e) { // Create a readable error message for logging and UI function formatError(err: any) { if (!err) return "Unknown error"; if (typeof err === "string") return err; if (err instanceof Error) return err.message + (err.stack ? `\n${err.stack}` : ""); if ((err as any).message) return (err as any).message; try { return JSON.stringify(err); } catch { return String(err); } } const formatted = formatError(e as any); console.error("Finalize onboarding failed:", formatted, e); aethexToast.error({ title: "Onboarding failed", description: formatted || "Please try again", }); } finally { setIsFinishing(false); } }; if (isLoading) { return ( ); } return (
{/* Progress Bar */}

Join AeThex

Step {currentStep + 1} of {steps.length}
Already have an account?{" "} Sign In
{/* Step Indicators */}
{steps.map((_, index) => (
))}
{/* Step Content */}

{steps[currentStep].title}

{isTransitioning ? ( ) : (
{currentStep === steps.length - 1 ? ( ) : ( )}
)}
{/* Floating particles effect */}
{[...Array(15)].map((_, i) => (
))}
); }