Quick reference for Portfolio Buddy 2 project structure. Use when: adding new features, modifying existing components, understanding data flow, or onboarding to the codebase...
App.tsx (351 lines)
āāā Header
ā āāā App title and branding
āāā UploadSection
ā āāā File upload to Supabase
ā āāā CSV parsing and validation
ā āāā Error handling
āāā ErrorList
ā āāā Display parsing/validation errors
āāā UploadedFilesList
ā āāā List of successfully uploaded files
āāā AnalyticsControls
ā āāā Toggle Metrics view
ā āāā Toggle Portfolio view
ā āāā Toggle Correlation view
āāā PortfolioSection (591 lines - NEEDS REFACTOR!)
ā āāā usePortfolio hook (date filtering)
ā āāā useContractMultipliers hook
ā āāā Chart.js equity curves
ā āāā Portfolio statistics
ā āāā ContractInput components
ā āāā MasterContractControl
ā āāā MetricsTable integration
āāā CorrelationSection
ā āāā CorrelationHeatmap (Chart.js)
ā āāā Spearman correlation
ā āāā Pearson correlation
āāā MetricsTable (242 lines)
ā āāā useMetrics hook
ā āāā useSorting hook (advanced multi-column)
ā āāā SortableHeader components
ā āāā Selection state management
āāā SessionComplete
āāā Completion UI/messaging
Location: src/hooks/useMetrics.ts Purpose: Calculate trading metrics from uploaded portfolio data Features:
Usage:
const { metrics, isCalculating } = useMetrics(portfolioData, riskFreeRate)
Returns:
metrics: Array of calculated metrics per strategyisCalculating: Boolean loading stateNote: Contains 4 TypeScript any violations in sort comparisons (tech debt)
Location: src/hooks/usePortfolio.ts Purpose: Manage portfolio data with date range filtering Features:
Usage:
const {
portfolioData,
filteredData,
dateRange,
setDateRange
} = usePortfolio(uploadedFiles)
Recent Addition: Date range filtering (commit 258ba3a)
Note: Contains 11 TypeScript any violations in trade/metrics types (tech debt)
Location: src/hooks/useContractMultipliers.ts Purpose: Manage contract multipliers for futures trading Features:
Usage:
const {
multipliers,
setMultiplier,
setAllMultipliers,
getAdjustedMetrics
} = useContractMultipliers(strategies)
Location: src/hooks/useSorting.ts Purpose: Advanced multi-column sorting for MetricsTable Features:
Usage:
const {
sortedData,
sortColumn,
sortDirection,
handleSort
} = useSorting(data, defaultColumn)
Location: src/utils/dataUtils.ts Contains Core Functions:
CSV & Data Processing:
parseCSV(file) - Parse CSV file with PapaParseprocessCurrencyColumns(data) - Clean currency values ($, commas)parseFilenameComponents(filename) - Extract symbol/direction/strategy from filenamegetDisplayName(symbol, direction, strategy) - Format display namesnormalizeDate(date) - Normalize dates to midnight UTCgetDateKey(date) - Convert date to YYYY-MM-DD string keyMetric Calculations:
calculateMetrics(data, filename) - Calculate trade-level metrics for a strategygetAdjustedMetrics(metrics, multiplier) - Apply contract multiplier to metricsRisk-Adjusted Metrics (PortfolioSection.tsx):
(annualGrowthRate / 100) / (maxDrawdown / startingCapital)Correlation Analysis:
buildCorrelationMatrix(strategies) - Build Spearman correlation matrixcalculatePearsonCorrelation(returns1, returns2) - Pearson correlation coefficientcalculateRanks(values) - Rank calculation for Spearman correlationTrading Calculations:
getMarginRate(symbol) - Get margin requirements by symbolcalculateEquityCurve(trades) - Build cumulative equity curvecalculateDailyReturns(equity) - Calculate daily returns from equity curveFormatting:
formatNumber(value, decimals) - Format numbers with decimalsformatCurrency(value) - Format as currency ($X,XXX.XX)formatPercent(value) - Format as percentage (X.XX%)Note: Contains 1 TypeScript any violation in Metrics interface (tech debt)
1. User uploads CSV via UploadSection
ā
2. parseCSV() extracts trade data
ā
3. processCurrencyColumns() cleans data
ā
4. File uploaded to Supabase storage
ā
5. usePortfolio hook fetches and aggregates data
ā
6. Date range filter applied (if set)
ā
7. useMetrics calculates all metrics
ā
8. MetricsTable displays results
1. User inputs contract size in ContractInput
ā
2. useContractMultipliers stores value
ā
3. getAdjustedMetrics() applies multiplier
ā
4. Adjusted metrics shown in MetricsTable
ā
5. Portfolio charts update with adjusted values
1. User clicks SortableHeader
ā
2. useSorting updates sort column/direction
ā
3. Custom comparison logic applied
ā
4. MetricsTable re-renders with sorted data
1. User selects assets in MetricsTable
ā
2. Selection state passed to CorrelationSection
ā
3. buildCorrelationMatrix() calculates correlations
ā
4. CorrelationHeatmap renders Chart.js heatmap
ā
5. Spearman & Pearson correlations both shown
useStateuseMemouseCallbackuseRefExample Pattern:
const [data, setData] = useState<Trade[]>([])
const metrics = useMemo(() => calculateMetrics(data), [data])
const handleUpload = useCallback((file: File) => {
// upload logic
}, [])
dataUtils.calculateMetrics()calculateMetrics()MetricsTable.tsxuseSorting.ts if neededExample: Sortino Ratio was added in commits 258ba3a & 9f25040
src/components/import { Line } from 'react-chartjs-2'
import { Chart, registerables } from 'chart.js'
import zoomPlugin from 'chartjs-plugin-zoom'
useMetrics or usePortfolio for dataApp.tsxsrc/hooks/use[Feature].tsuse prefix, camelCaseany)ā ļø Recharts is installed but NEVER imported - should be removed (11.5KB waste)
Current Violations:
For PortfolioSection (591 lines):
EquityChartSection.tsxPortfolioStats.tsxContractControls.tsxinterface Trade {
date: Date
symbol: string
pnl: number
// ...
}
interface Metric {
name: string
sharpe: number
sortino: number
// ...
}
any TypesCurrent violations (15 total) - see portfolio-context skill for details
Preferred approach:
// Bad
const data: any = parseData()
// Good
interface ParsedData {
trades: Trade[]
errors: string[]
}
const data: ParsedData = parseData()
// Expensive correlation calculation
const correlationMatrix = useMemo(
() => buildCorrelationMatrix(selectedStrategies),
[selectedStrategies]
)
const handleSort = useCallback((column: string) => {
setSortColumn(column)
setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc')
}, [])