42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
import { useBrokerPositions } from '@/entities/broker-position';
|
||
import { useBrokerAccountContext } from '@/widgets/broker-account-layout';
|
||
import { BrokerPositionTable } from '@/widgets/broker-positions-table';
|
||
import { useCursorPagination } from '@/shared/lib/useCursorPagination';
|
||
|
||
type BrokerPositionsPageProps = {
|
||
type: 'share' | 'bond';
|
||
title: 'Акции' | 'Облигации';
|
||
};
|
||
|
||
export function BrokerPositionsPage({ type, title }: BrokerPositionsPageProps) {
|
||
const { accountId } = useBrokerAccountContext();
|
||
const pagination = useCursorPagination();
|
||
const positions = useBrokerPositions(accountId, { type, limit: 10, cursor: pagination.cursor });
|
||
|
||
if (positions.error) {
|
||
return (
|
||
<section aria-labelledby={`broker-${type}-heading`}>
|
||
<h2 id={`broker-${type}-heading`} style={{ fontSize: 20, margin: 0 }}>
|
||
{title}
|
||
</h2>
|
||
<p role="alert">
|
||
{type === 'share' ? 'Не удалось загрузить акции' : 'Не удалось загрузить облигации'}
|
||
</p>
|
||
</section>
|
||
);
|
||
}
|
||
|
||
return (
|
||
<BrokerPositionTable
|
||
title={title}
|
||
page={positions.data}
|
||
isLoading={positions.isLoading}
|
||
isFetching={positions.isFetching}
|
||
emptyMessage={type === 'share' ? 'На счёте нет акций' : 'На счёте нет облигаций'}
|
||
pageNumber={pagination.pageNumber}
|
||
onNext={() => pagination.handleNext(positions.data?.nextCursor)}
|
||
onPrevious={pagination.handlePrevious}
|
||
/>
|
||
);
|
||
}
|