import { Fragment, useState } from 'react' import { CliErrorPanel } from '../components/CliErrorPanel' import { EmptyNote } from '../components/EmptyState' import { Panel } from '../components/Panel' import { SectionSkeleton } from '../components/Skeleton' import { SegTabs } from '../components/SegTabs' import { StaleBanner } from '../components/StaleBanner' import { type Polled, usePolled } from '../hooks/usePolled' import { formatCompact, formatUsd } from '../lib/format' import { codeburn } from '../lib/ipc' import type { DateRange, MenubarPayload, OptimizeJsonReport, Period, SessionYieldJson, WasteAction, YieldJsonReport } from '../lib/types' type OptimizeTab = 'waste' | 'reverts' | 'abandoned' | 'fixes' export function Optimize({ period, provider, range = null }: { period: Period; provider: string; range?: DateRange | null }) { const overview = usePolled( () => range ? codeburn.getOverview(period, provider, range) : codeburn.getOverview(period, provider), [period, provider, range?.from, range?.to], ) return } export function OptimizeContent({ period, provider = 'all', range = null, overview, refreshToken = 0, ready = true, }: { period: Period provider?: string range?: DateRange | null overview: Polled refreshToken?: number ready?: boolean }) { // Gate on app-level readiness so boot hydrates the cache once (default true // keeps standalone renders/tests polling normally). const optimizeReport = usePolled( () => range ? codeburn.getOptimizeReport(period, provider, range) : codeburn.getOptimizeReport(period, provider), [period, provider, range?.from, range?.to, refreshToken], { enabled: ready, memoKey: `optimize|${period}|${provider}|${range?.from ?? ''}-${range?.to ?? ''}` }, ) const yieldReport = usePolled( () => range ? codeburn.getYield(period, provider, range) : codeburn.getYield(period, provider), [period, provider, range?.from, range?.to, refreshToken], { enabled: ready, memoKey: `optyield|${period}|${provider}|${range?.from ?? ''}-${range?.to ?? ''}` }, ) const [tab, setTab] = useState('waste') if (!overview.data) { if (overview.error) return return } const yieldData = yieldReport.error ? null : yieldReport.data const revertedTotal = yieldData ? formatUsd(yieldData.summary.reverted.costUSD) : '—' const abandonedTotal = yieldData ? formatUsd(yieldData.summary.abandoned.costUSD) : '—' const options = [ { value: 'waste', label: `Waste ${formatUsd(overview.data.optimize.savingsUSD)}` }, { value: 'reverts', label: `Reverts ${revertedTotal}` }, { value: 'abandoned', label: `Abandoned ${abandonedTotal}` }, // The Fixes tab renders topFindings (capped list), so label the count that shows. { value: 'fixes', label: `Fixes ${overview.data.optimize.topFindings.length.toLocaleString('en-US')}` }, ] return ( <> {overview.error && } setTab(value as OptimizeTab)} style={{ alignSelf: 'flex-start' }} /> {tab === 'waste' ? ( ) : tab === 'reverts' ? ( ) : tab === 'abandoned' ? ( ) : ( )} ) } function WasteRows({ report }: { report: Polled }) { if (!report.data) { if (report.error) return return Scanning optimize findings… } return (
{report.data.summary.findingCount.toLocaleString('en-US')} findings · {formatUsd(report.data.summary.potentialSavingsCostUSD)} potential · health {report.data.summary.healthScore}/100
) } type OptimizeFinding = OptimizeJsonReport['findings'][number] const IMPACT_ICON: Record<'high' | 'medium' | 'low', string> = { high: '↑', medium: '→', low: '↓', } function actionText(fix: WasteAction): string { return fix.type === 'file-content' ? fix.content : fix.text } function ActionableFindingRows({ findings }: { findings: OptimizeFinding[] }) { const [expandedId, setExpandedId] = useState(null) const [copiedId, setCopiedId] = useState(null) if (!findings.length) return No waste findings in this range yet. const copyFix = async (finding: OptimizeFinding) => { await navigator.clipboard.writeText(actionText(finding.fix)) setCopiedId(finding.id) window.setTimeout(() => setCopiedId(current => current === finding.id ? null : current), 1_500) } return (
{findings.map(finding => { const expanded = expandedId === finding.id return ( {expanded && (

{finding.explanation}

{finding.fix.label} {finding.fix.type === 'file-content' && {finding.fix.path}}
{actionText(finding.fix)}
)}
) })}
) } type Finding = MenubarPayload['optimize']['topFindings'][number] function FindingRows({ findings, empty }: { findings: Finding[]; empty: string }) { if (!findings.length) return {empty} return (
{findings.map((finding, i) => (
{String(i + 1).padStart(2, '0')} {finding.title} {finding.impact.charAt(0).toUpperCase() + finding.impact.slice(1)} {formatUsd(finding.savingsUSD)}
))}
) } function YieldRows({ report, category, empty, }: { report: Polled category: SessionYieldJson['category'] empty: string }) { if (report.error || !report.data) return Yield data is unavailable right now. const rows = report.data.details.filter(row => row.category === category) if (!rows.length) return {empty} return ( <> {rows.map((row, i) => (
{String(i + 1).padStart(2, '0')}
{row.project} {row.commitCount.toLocaleString('en-US')} {row.commitCount === 1 ? 'commit' : 'commits'} · {row.sessionId}
{formatUsd(row.costUSD)}
))} ) } function FixesRows({ data }: { data: MenubarPayload }) { return }