import type { BrokerPositionsPage as BrokerPositionsPageData } from '@/shared/api/responses'; import { TableSkeleton } from '@/shared/ui/TableSkeleton'; import { formatBrokerMoney as formatMoney } from '@/shared/lib/formatters'; import { PositionTicker } from './PositionTicker'; 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; const pagButtonStyle = { padding: '6px 14px', borderRadius: 6, border: '1px solid #e0e0e0', background: 'var(--color-surface)', color: 'var(--color-text)', fontSize: 14, fontWeight: 600, cursor: 'pointer', lineHeight: 1.4, } satisfies React.CSSProperties; const pagButtonDisabledStyle = { ...pagButtonStyle, opacity: 0.35, cursor: 'not-allowed', } satisfies React.CSSProperties; function formatQuantity(value: number | null | undefined) { return value == null ? '-' : value.toLocaleString('ru-RU'); } export function BrokerPositionTable({ title, page, isLoading, isFetching, emptyMessage, pageNumber, onNext, onPrevious, }: { title: string; page: BrokerPositionsPageData | undefined; isLoading: boolean; isFetching: boolean; emptyMessage: string; pageNumber: number; onNext: () => void; onPrevious: () => void; }) { const positions = page?.items ?? []; const canGoBack = pageNumber > 1; const canGoForward = Boolean(page?.hasNext && page.nextCursor); return (

{title}

{pageNumber}
{isLoading ? (
Тикер Название Количество Цена Стоимость
) : positions.length === 0 && !isFetching ? (

{emptyMessage}

) : (
{positions.map((position) => ( ))}
Тикер Название Количество Цена Стоимость
{position.name || '-'} {formatQuantity(position.quantity)} {formatMoney(position.currentPrice)} {formatMoney(position.currentValue)}
{isFetching && (
Загрузка страницы {pageNumber}…
)}
)}
); }