import { useState, useEffect } from 'react'; import AssetSetupForm from '@/components/Assets/AssetSetupForm'; import AddPurchaseForm from '@/components/Transactions/AddPurchaseForm'; import AddMilestoneForm from '@/components/Milestones/AddMilestoneForm'; import UpdatePriceForm from '@/components/Pricing/UpdatePriceForm'; interface OnboardingStep { id: string; title: string; description: string; completed: boolean; required: boolean; } interface OnboardingFlowProps { onComplete?: () => void; } export default function OnboardingFlow({ onComplete }: OnboardingFlowProps) { const [currentStep, setCurrentStep] = useState(0); const [steps, setSteps] = useState([ { id: 'asset', title: 'SET ASSET', description: 'Choose the asset you want to track', completed: false, required: true, }, { id: 'purchases', title: 'ADD PURCHASES', description: 'Enter your current holdings', completed: false, required: true, }, { id: 'milestones', title: 'SET MILESTONES', description: 'Define your investment goals', completed: false, required: true, }, { id: 'price', title: 'CURRENT PRICE', description: 'Set current asset price', completed: false, required: true, }, ]); // Check onboarding status on mount useEffect(() => { checkOnboardingStatus(); }, []); const checkOnboardingStatus = async () => { try { // Check asset const assetResponse = await fetch('/assets/current'); const assetData = await assetResponse.json(); const hasAsset = !!assetData.asset; // Check purchases const purchaseResponse = await fetch('/purchases/summary'); const purchaseData = await purchaseResponse.json(); const hasPurchases = purchaseData.total_shares > 0; // Check milestones const milestonesResponse = await fetch('/milestones'); const milestonesData = await milestonesResponse.json(); const hasMilestones = milestonesData.length > 0; // Check current price const priceResponse = await fetch('/pricing/current'); const priceData = await priceResponse.json(); const hasPrice = !!priceData.current_price; setSteps(prev => prev.map(step => ({ ...step, completed: (step.id === 'asset' && hasAsset) || (step.id === 'purchases' && hasPurchases) || (step.id === 'milestones' && hasMilestones) || (step.id === 'price' && hasPrice) }))); // Find first incomplete required step const firstIncompleteStep = steps.findIndex(step => step.required && !step.completed ); if (firstIncompleteStep !== -1) { setCurrentStep(firstIncompleteStep); } else { // All required steps complete, check if we should call onComplete const allRequiredComplete = steps.filter(s => s.required).every(s => s.completed); if (allRequiredComplete && onComplete) { onComplete(); } } } catch (error) { console.error('Failed to check onboarding status:', error); } }; const handleStepComplete = async () => { // Mark current step as completed setSteps(prev => prev.map((step, index) => index === currentStep ? { ...step, completed: true } : step )); // Refresh onboarding status await checkOnboardingStatus(); // Move to next incomplete step or complete onboarding const nextIncompleteStep = steps.findIndex((step, index) => index > currentStep && step.required && !step.completed ); if (nextIncompleteStep !== -1) { setCurrentStep(nextIncompleteStep); } else { // All required steps complete const allRequiredComplete = steps.filter(s => s.required).every(s => s.completed); if (allRequiredComplete && onComplete) { onComplete(); } } }; const handleStepSelect = (stepIndex: number) => { setCurrentStep(stepIndex); }; const renderStepContent = () => { const step = steps[currentStep]; switch (step.id) { case 'asset': return ( ); case 'purchases': return ( ); case 'milestones': return ( ); case 'price': return ( ); default: return null; } }; return (
{/* Terminal-style border with red glow */}
{/* Header */}

[SYSTEM] ONBOARDING SEQUENCE

Initialize your asset tracking system

{/* Progress indicator */}
{steps.map((step, index) => ( ))}

{steps[currentStep].description}

STEP {currentStep + 1}/{steps.length}

{/* Step content */}
{renderStepContent()}
{/* Status footer */}

[STATUS] {steps.filter(s => s.completed).length}/{steps.length} STEPS COMPLETE

{steps.filter(s => s.required && !s.completed).length} REQUIRED REMAINING

); }