import { useState } from 'react'; import { useNavigate } from '@tanstack/react-router'; import { useCompanies, useCreateCompany } from '../api/hooks'; import { DataTable, type Column } from '../components/DataTable'; import { StatusBadge, LoadingSpinner, Card } from '../components/ui'; import type { Company } from '../api/hooks'; const columns: Column[] = [ { key: 'ticker', header: 'Ticker', className: 'font-mono font-semibold text-brand-300' }, { key: 'legal_name', header: 'Name' }, { key: 'sector', header: 'Sector' }, { key: 'active', header: 'Status', render: (r) => , }, { key: 'active_source_count', header: 'Sources', render: (r) => {r.active_source_count ?? '—'}, }, ]; export function CompaniesPage() { const navigate = useNavigate(); const { data, isLoading, error } = useCompanies(); const [showAdd, setShowAdd] = useState(false); if (isLoading) return ; if (error) return
Failed to load companies
; return (

Companies

{showAdd && setShowAdd(false)} />} data={data ?? []} columns={columns} keyField="id" onRowClick={(row) => navigate({ to: '/companies/$id', params: { id: row.id } })} filterFn={(row, q) => { const lq = q.toLowerCase(); return ( row.ticker.toLowerCase().includes(lq) || (row.legal_name ?? '').toLowerCase().includes(lq) || (row.sector ?? '').toLowerCase().includes(lq) ); }} />
); } function AddCompanyForm({ onClose }: { onClose: () => void }) { const [ticker, setTicker] = useState(''); const [name, setName] = useState(''); const [sector, setSector] = useState(''); const [exchange, setExchange] = useState(''); const mutation = useCreateCompany(); return (
{ e.preventDefault(); if (ticker.trim() && name.trim()) { mutation.mutate( { ticker: ticker.trim().toUpperCase(), legal_name: name.trim(), sector: sector || undefined, exchange: exchange || undefined, }, { onSuccess: onClose }, ); } }} >
setTicker(e.target.value)} required placeholder="AAPL" className="w-full rounded-md border border-surface-700 bg-surface-900 px-2 py-1.5 text-sm text-gray-200 placeholder-gray-500 uppercase" />
setName(e.target.value)} required placeholder="Apple Inc." className="w-full rounded-md border border-surface-700 bg-surface-900 px-2 py-1.5 text-sm text-gray-200 placeholder-gray-500" />
setSector(e.target.value)} placeholder="Technology" className="w-full rounded-md border border-surface-700 bg-surface-900 px-2 py-1.5 text-sm text-gray-200 placeholder-gray-500" />
setExchange(e.target.value)} placeholder="NASDAQ" className="w-full rounded-md border border-surface-700 bg-surface-900 px-2 py-1.5 text-sm text-gray-200 placeholder-gray-500" />
{mutation.error &&
Failed to create company
}
); }