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';
function PriceTrackingStep({ onEnable, onSkip }: { onEnable: () => void; onSkip?: () => void }) {
const [enabled, setEnabled] = useState(false);
return (
Track the current market price of your asset to see portfolio value and P&L. You can enable this later in settings.
{enabled && (
)}
{!enabled && (
)}
);
}
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 goals',
completed: false,
required: true,
},
{
id: 'price',
title: 'CURRENT PRICE',
description: 'Set current asset price (optional)',
completed: false,
required: false,
},
]);
// 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;
const freshSteps = steps.map(step => ({
...step,
completed:
(step.id === 'asset' && hasAsset) ||
(step.id === 'purchases' && hasPurchases) ||
(step.id === 'milestones' && hasMilestones) ||
(step.id === 'price' && hasPrice)
}));
setSteps(freshSteps);
const firstIncompleteRequired = freshSteps.findIndex(s => s.required && !s.completed);
if (firstIncompleteRequired !== -1) {
setCurrentStep(firstIncompleteRequired);
} else {
if (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 — handles setCurrentStep and onComplete
await checkOnboardingStatus();
};
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
Set up your tracker
{/* 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
);
}