// FinancialOnboarding.js import React, { useState } from 'react'; import Modal from '../ui/modal.js'; import ExpensesWizard from '../../components/ExpensesWizard.js'; // path to your wizard import { Button } from '../../components/ui/button.js'; // using your Tailwind-based button import { saveDraft, clearDraft, loadDraft } from '../../utils/onboardingDraftApi.js'; const FinancialOnboarding = ({ nextStep, prevStep, data, setData }) => { const { currently_working = '', current_salary = 0, additional_income = 0, monthly_expenses = 0, monthly_debt_payments = 0, retirement_savings = 0, retirement_contribution = 0, emergency_fund = 0, emergency_contribution = 0, extra_cash_emergency_pct = 50, extra_cash_retirement_pct = 50, } = data; const [showExpensesWizard, setShowExpensesWizard] = useState(false); const handleNeedHelpExpenses = () => { setShowExpensesWizard(true); }; const handleExpensesCalculated = (total) => { setData(prev => ({...prev, monthly_expenses: total })); saveDraft({ financialData: { monthly_expenses: total } }).catch(() => {}); }; const infoIcon = (msg) => ( i ); const handleChange = (e) => { const { name, value, type, checked } = e.target; let val = parseFloat(value) || 0; if (type === 'checkbox') { val = checked; } if (name === 'extra_cash_emergency_pct') { val = Math.min(Math.max(val, 0), 100); setData(prevData => ({ ...prevData, extra_cash_emergency_pct: val, extra_cash_retirement_pct: 100 - val })); saveDraft({ financialData: { extra_cash_emergency_pct: val, extra_cash_retirement_pct: 100 - val } }).catch(() => {}); } else if (name === 'extra_cash_retirement_pct') { val = Math.min(Math.max(val, 0), 100); setData(prevData => ({ ...prevData, extra_cash_retirement_pct: val, extra_cash_emergency_pct: 100 - val })); saveDraft({ financialData: { extra_cash_retirement_pct: val, extra_cash_emergency_pct: 100 - val } }).catch(() => {}); } else { setData(prev => ({ ...prev, [name]: val })); saveDraft({ financialData: { [name]: val, extra_cash_emergency_pct: Number.isFinite(extra_cash_emergency_pct) ? extra_cash_emergency_pct : 50, extra_cash_retirement_pct: Number.isFinite(extra_cash_retirement_pct) ? extra_cash_retirement_pct : 50 } }).catch(()=>{}); setData(prev => ({ ...prev, [name]: val })); // Persist with 50/50 fallback if split is invalid or both 0 let ePct = Number(extra_cash_emergency_pct); let rPct = Number(extra_cash_retirement_pct); if (!Number.isFinite(ePct)) ePct = 0; if (!Number.isFinite(rPct)) rPct = 0; if ((ePct + rPct) === 0) { ePct = 50; rPct = 50; } saveDraft({ financialData: { [name]: val, extra_cash_emergency_pct: ePct, extra_cash_retirement_pct: rPct }}).catch(()=>{}); } }; const handleSubmit = () => { // Final guard: coerce to numbers, clamp, and 50/50 if both resolve to 0 let ePct = Number(extra_cash_emergency_pct); let rPct = Number(extra_cash_retirement_pct); if (!Number.isFinite(ePct)) ePct = 0; if (!Number.isFinite(rPct)) rPct = 0; ePct = Math.min(Math.max(ePct, 0), 100); rPct = Math.min(Math.max(rPct, 0), 100); if ((ePct + rPct) === 0) { ePct = 50; rPct = 50; } saveDraft({ financialData: { extra_cash_emergency_pct: ePct, extra_cash_retirement_pct: rPct }}).catch(()=>{}); nextStep(); }; return (

Financial Details

{currently_working === 'yes' && (
{ const v = parseFloat(e.target.value) || 0; saveDraft({ financialData: { current_salary: v } }).catch(() => {}); }} className="w-full border rounded p-2" />
{ const v = parseFloat(e.target.value) || 0; saveDraft({ financialData: { additional_income: v } }).catch(() => {}); }} className="w-full border rounded p-2" />
)}
{ const v = parseFloat(e.target.value) || 0; saveDraft({ financialData: { monthly_expenses: v } }).catch(() => {}); }} placeholder="e.g. 1500" />
{ const v = parseFloat(e.target.value) || 0; saveDraft({ financialData: { monthly_debt_payments: v } }).catch(() => {}); }} className="w-full border rounded p-2" />
{ const v = parseFloat(e.target.value) || 0; saveDraft({ financialData: { retirement_savings: v } }).catch(() => {}); }} className="w-full border rounded p-2" />
{ const v = parseFloat(e.target.value) || 0; saveDraft({ financialData: { retirement_contribution: v } }).catch(() => {}); }} className="w-full border rounded p-2" />
{ const v = parseFloat(e.target.value) || 0; saveDraft({ financialData: { emergency_fund: v } }).catch(() => {}); }} className="w-full border rounded p-2" />
{ const v = parseFloat(e.target.value) || 0; saveDraft({ financialData: { emergency_contribution: v } }).catch(() => {}); }} className="w-full border rounded p-2" />

Extra Monthly Cash Allocation

If you have extra money left each month after expenses, how would you like to allocate it? (Must add to 100%)

{ const v = parseFloat(e.target.value) || 50; saveDraft({ financialData: { extra_cash_emergency_pct: v } }).catch(() => {}); }} className="w-full border rounded p-2" />
{ const v = parseFloat(e.target.value) || 50; saveDraft({ financialData: { extra_cash_retirement_pct: v } }).catch(() => {}); }} className="w-full border rounded p-2" />
{showExpensesWizard && ( setShowExpensesWizard(false)}> setShowExpensesWizard(false)} onExpensesCalculated={handleExpensesCalculated} /> )}
); }; export default FinancialOnboarding;