import { useState, useEffect } from 'react'; import { Container, Title, Text, Stack, Card, Group, Button, TextInput, Select, Stepper, ThemeIcon, Progress, Alert, Loader, Center, Anchor, } from '@mantine/core'; import { useForm } from '@mantine/form'; import { IconUser, IconBuilding, IconUserPlus, IconListDetails, IconCheck, IconPlayerPlay, IconConfetti, } from '@tabler/icons-react'; import { useNavigate, Link } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import api from '../../services/api'; import { useAuthStore } from '../../stores/authStore'; const STEPS = [ { slug: 'profile', label: 'Complete Your Profile', icon: IconUser, description: 'Set up your name and contact' }, { slug: 'workspace', label: 'Configure Your HOA', icon: IconBuilding, description: 'Organization name and settings' }, { slug: 'invite_member', label: 'Invite a Team Member', icon: IconUserPlus, description: 'Add a board member or manager' }, { slug: 'first_workflow', label: 'Set Up First Account', icon: IconListDetails, description: 'Create your chart of accounts' }, ]; export function OnboardingPage() { const navigate = useNavigate(); const queryClient = useQueryClient(); const user = useAuthStore((s) => s.user); const [activeStep, setActiveStep] = useState(0); const { data: progress, isLoading } = useQuery({ queryKey: ['onboarding-progress'], queryFn: async () => { const { data } = await api.get('/onboarding/progress'); return data; }, }); const markStep = useMutation({ mutationFn: (step: string) => api.patch('/onboarding/progress', { step }), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['onboarding-progress'] }), }); const completedSteps = progress?.completedSteps || []; const completedCount = completedSteps.length; const allDone = progress?.completedAt != null; // Profile form const profileForm = useForm({ initialValues: { firstName: user?.firstName || '', lastName: user?.lastName || '', phone: '', }, }); // Workspace form const workspaceForm = useForm({ initialValues: { orgName: '', address: '', fiscalYearStart: '1' }, }); // Invite form const inviteForm = useForm({ initialValues: { email: '', role: 'treasurer' }, validate: { email: (v) => (/\S+@\S+/.test(v) ? null : 'Valid email required') }, }); useEffect(() => { // Auto-advance to first incomplete step const firstIncomplete = STEPS.findIndex((s) => !completedSteps.includes(s.slug)); if (firstIncomplete >= 0) setActiveStep(firstIncomplete); }, [completedSteps]); if (isLoading) { return