import type { BrokerPositionsPage as BrokerPositionsPageData } from '@/shared/api/responses'; import { Box } from '@mui/material'; import { Button, Heading, Skeleton, Text } from '@moex-vibe/design-system'; import { formatBrokerMoney as formatMoney } from '@/shared/lib/formatters'; import { PositionTicker } from './PositionTicker'; const tableSx = { width: '100%', borderCollapse: 'collapse', fontSize: 14, } as const; const thSx = { borderBottom: '1px solid', borderColor: 'divider', color: 'text.secondary', fontWeight: 600, p: 1, textAlign: 'left', } as const; const tdSx = { borderBottom: '1px solid', borderColor: 'divider', p: 1, verticalAlign: 'top', textAlign: 'right', } as const; const tdSxLeft = { ...tdSx, textAlign: 'left', } as const; 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 ? ( Тикер Название Количество Цена Стоимость {[1, 2, 3, 4].map((row) => ( ))} ) : positions.length === 0 && !isFetching ? ( {emptyMessage} ) : ( Тикер Название Количество Цена Стоимость {positions.map((position) => ( {position.name || '-'} {formatQuantity(position.quantity)} {formatMoney(position.currentPrice)} {formatMoney(position.currentValue)} ))} {isFetching && ( Загрузка страницы {pageNumber}… )} )}
); }