import { Link } from 'react-router-dom'; import type { BrokerMoney, BrokerPosition } from '../../api/responses'; import { getBrokerInstrumentPath, getBrokerPositionGroup } from './brokerDisplay'; type BrokerPositionGroupConfig = { key: 'shares' | 'bonds' | 'other'; title: string; }; const GROUPS: BrokerPositionGroupConfig[] = [ { key: 'shares', title: 'Акции' }, { key: 'bonds', title: 'Облигации' }, { key: 'other', title: 'Другие инструменты' }, ]; const tableStyle = { width: '100%', borderCollapse: 'collapse', fontSize: 14, } satisfies React.CSSProperties; const thStyle = { borderBottom: '1px solid #e0e0e0', color: 'var(--color-text-secondary)', fontWeight: 600, padding: '10px 8px', } satisfies React.CSSProperties; const tdStyle = { borderBottom: '1px solid #eeeeee', padding: '10px 8px', verticalAlign: 'top', } satisfies React.CSSProperties; function formatMoney(value: BrokerMoney | null | undefined) { if (!value) return '-'; return new Intl.NumberFormat('ru-RU', { style: 'currency', currency: value.currency || 'RUB', maximumFractionDigits: 2, }).format(value.value); } function formatQuantity(value: number | null | undefined) { return value == null ? '-' : value.toLocaleString('ru-RU'); } function PositionTicker({ position }: { position: BrokerPosition }) { const label = position.ticker || position.figi || '-'; const path = getBrokerInstrumentPath({ ticker: position.ticker, instrumentType: position.instrumentType, classCode: position.classCode, }); if (!path || label === '-') { return {label}; } return ( {label} ); } function PositionTable({ title, positions }: { title: string; positions: BrokerPosition[] }) { return ( {title} Тикер Название Количество Цена Стоимость {positions.map((position) => ( {position.name || '-'} {formatQuantity(position.quantity)} {formatMoney(position.currentPrice)} {formatMoney(position.currentValue)} ))} ); } export function BrokerPositionsSection({ positions }: { positions: BrokerPosition[] }) { const grouped = GROUPS.map((group) => ({ ...group, positions: positions.filter((position) => getBrokerPositionGroup(position) === group.key), })).filter((group) => group.positions.length > 0); if (grouped.length === 0) { return ( Позиции В портфеле нет позиций ); } return ( Позиции {grouped.map((group) => ( ))} ); }
В портфеле нет позиций