"use client"; import { useEffect, useState } from "react"; import { KpiSection, type KpiHistoryData } from "./KpiSection"; import { PeerComparison, type PeerComparisonData } from "./PeerComparison"; interface EquityOverviewProps { ticker: string; sector: Record | null; health: Record | null; } export function EquityOverview({ ticker, sector, health }: EquityOverviewProps) { const [peerData, setPeerData] = useState(null); const [kpiData, setKpiData] = useState(null); useEffect(() => { let cancelled = false; Promise.all([ fetch(`/api/market/peers/${encodeURIComponent(ticker)}`).then((r) => (r.ok ? r.json() : null)), fetch(`/api/financials/${encodeURIComponent(ticker)}/kpi-history`).then((r) => (r.ok ? r.json() : null)), ]).then(([p, k]) => { if (!cancelled) { setPeerData(p && Array.isArray(p.peers) ? p : null); setKpiData(k && Array.isArray(k.quarters) ? k : null); } }); return () => { cancelled = true; }; }, [ticker]); const metrics: { label: string; value: string }[] = [ { label: "Sector", value: String(sector?.sector ?? "—") }, { label: "Industry", value: String(sector?.industry ?? "—") }, { label: "Market Cap", value: sector?.market_cap ? `$${(Number(sector.market_cap) / 1e9).toFixed(1)}B` : "—" }, { label: "P/E Ratio", value: sector?.pe_ratio != null ? Number(sector.pe_ratio).toFixed(1) : "—" }, { label: "Beta", value: sector?.beta != null ? Number(sector.beta).toFixed(2) : "—" }, { label: "Div Yield", value: sector?.dividend_yield != null ? `${Number(sector.dividend_yield).toFixed(2)}%` : "—" }, { label: "52W High", value: sector?.fifty_two_week_high != null ? `$${Number(sector.fifty_two_week_high).toFixed(2)}` : "—" }, { label: "52W Low", value: sector?.fifty_two_week_low != null ? `$${Number(sector.fifty_two_week_low).toFixed(2)}` : "—" }, ]; return (

{ticker} Overview

{sector?.current_price != null && (

${Number(sector.current_price).toFixed(2)}

)}
{metrics.map((m) => (
{m.label}
{m.value}
))}

DuPont Analysis

{!!health?.dupont && typeof health.dupont === "object" && health.dupont !== null ? (
{[ { label: "ROE", value: (health.dupont as { roe?: unknown }).roe }, { label: "Net Profit Margin", value: (health.dupont as { npm?: unknown }).npm }, { label: "Asset Turnover", value: (health.dupont as { asset_turnover?: unknown }).asset_turnover }, { label: "Equity Multiplier", value: (health.dupont as { equity_multiplier?: unknown }).equity_multiplier }, ].map((d) => (
{d.label} {d.value != null ? Number(d.value).toFixed(2) : "—"}
))}
) : (
No data
)}
); } function Card({ title, value }: { title: string; value: string }) { return (

{title}

{value}
); }