vega-frontend-monorepo/libs/accounts/src/lib/accounts-table.tsx

175 lines
4.5 KiB
TypeScript
Raw Normal View History

import { forwardRef } from 'react';
import type {
ColumnApi,
GroupCellRendererParams,
ValueFormatterParams,
} from 'ag-grid-community';
import {
PriceCell,
addDecimalsFormatNumber,
t,
addSummaryRows,
} from '@vegaprotocol/react-helpers';
import type { SummaryRow } from '@vegaprotocol/react-helpers';
import { AgGridDynamic as AgGrid } from '@vegaprotocol/ui-toolkit';
import { AgGridColumn } from 'ag-grid-react';
import type { AgGridReact } from 'ag-grid-react';
chore: stagnet3 api updates (#1321) * chore: update account, fills and orders subscriptions in data providers * chore: update account, fills and orders subscriptions in data providers * fixing console-lite * fixing types in general - regen * chore: update account, fills and orders subscriptions in data providers * fixed console-lite unit tests, uncommented quote name * chore: update account, fills and orders subscriptions in data providers * type aligning of assets and proposals * fixes liquidity data provider * fixed accounts build errors and unit tests * regen types, removed market name * regen types * fixed positions * chore: handle updates in derived market provider, update orders * removed taker fee mapping (renamed to maker fee) * chore: update account, fills and orders subscriptions in data providers * chore: update account, fills and orders subscriptions in data providers * chore: fix Order type * chore: fix possible null types * chore: revert order-list.stories.tsx * chore: derivedDataProvider fixes * fills unit tests fixes * orders unit tests fixes * added eslint ingore for generated files in liquidity * added unique key to the list element of simple market toolbar * changed main-branch-name to develop for pr workflows * removed redundant waitFor * increased test timeout to 10s * removed mocked response * chore: disable simple market list tests * chore: fix e2e projects mock types * feat: [subscription-update] - uncomment some console-lite tests * cypress: trading-accounts * chore: replace market candles with candlesConnection * chore: ignore gql errors, to be reverted after candlesConnectio n will be fixed * feat: [subscription-update] - improve wrongly renamed hook * feat: [subscription-update] - improve wrongly renamed hook * feat: [subscription-update] - improve wrongly renamed hook 3 * chore: add pagination hangdling to derived data provier * cypress: trading-fills * feat: [stagnet3 api update] - remove redundant command in tests * feat: [stagnet3 api update] - remove redundant command in tests * chore: fix trading orders e2e tests * chore: fix console lite e2e mocks * chore: fix market-trade tests * chore: use markets only in market selector, change Instrument cache policy * chore: fix market-selector tests * feat: [subscription-update] - improve ag grid conf for unit tests * feat: [subscription-update] - improve ag grid conf for unit tests * chore: fix candle types in console lite market mocks * chore: revert error policy ignore * chore: revert jest timeout * chore: remove unused AccountFields * chore: revert remove unused AccountFields * chore: simplify node subscription probe * chore: remove unused generated types in candles-chart * chore: improve useMarketsList mock * feat: [subscription-update] - increase jest timeout * feat: [subscription-update] - fix jest timeout * feat: [subscription-update] - fix jest timeout * feat: [subscription-update] - try to fix failing test again * chore: fix candles-chart types * feat: [subscription-update] - temporary skip failing test * feat: [subscription-update] - temporary skip failing test * feat: [subscription-update] - temporary skip failing test * feat: [subscription-update] - fix failling int test * feat: [subscription-update] - try to restore commented unit tests * feat: [subscription-update] - try to restore commented unit tests * feat: [subscription-update] - improve fixed unit tests Co-authored-by: asiaznik <artur@vegaprotocol.io> Co-authored-by: maciek <maciek@vegaprotocol.io>
2022-09-20 15:24:28 +00:00
import type { AccountFieldsFragment } from './__generated___/Accounts';
import { getId } from './accounts-data-provider';
import { useAssetDetailsDialogStore } from '@vegaprotocol/assets';
import type { AccountType } from '@vegaprotocol/types';
import { AccountTypeMapping } from '@vegaprotocol/types';
interface AccountsTableProps {
data: AccountFieldsFragment[] | null;
}
interface AccountsTableValueFormatterParams extends ValueFormatterParams {
data: AccountFieldsFragment;
}
export const getGroupId = (
data: AccountFieldsFragment & SummaryRow,
columnApi: ColumnApi
) => {
if (data.__summaryRow) {
return null;
}
const sortColumnId = columnApi.getColumnState().find((c) => c.sort)?.colId;
switch (sortColumnId) {
case 'asset.symbol':
return data.asset.id;
}
return undefined;
};
export const getGroupSummaryRow = (
data: AccountFieldsFragment[],
columnApi: ColumnApi
): Partial<AccountFieldsFragment & SummaryRow> | null => {
if (!data.length) {
return null;
}
const sortColumnId = columnApi.getColumnState().find((c) => c.sort)?.colId;
switch (sortColumnId) {
case 'asset.symbol':
return {
__summaryRow: true,
balance: data
.reduce((a, i) => a + (parseFloat(i.balance) || 0), 0)
.toString(),
asset: data[0].asset,
};
}
return null;
};
const comparator = (
valueA: string,
valueB: string,
nodeA: { data: AccountFieldsFragment & SummaryRow },
nodeB: { data: AccountFieldsFragment & SummaryRow },
isInverted: boolean
) => {
if (valueA < valueB) {
return -1;
}
if (valueA > valueB) {
return 1;
}
if (nodeA.data.__summaryRow) {
return isInverted ? -1 : 1;
}
if (nodeB.data.__summaryRow) {
return isInverted ? 1 : -1;
}
return 0;
};
export const AccountsTable = forwardRef<AgGridReact, AccountsTableProps>(
({ data }, ref) => {
const { setAssetDetailsDialogOpen, setAssetDetailsDialogSymbol } =
useAssetDetailsDialogStore();
return (
<AgGrid
style={{ width: '100%', height: '100%' }}
overlayNoRowsTemplate={t('No accounts')}
rowData={data}
getRowId={({ data }) => getId(data)}
ref={ref}
defaultColDef={{
flex: 1,
resizable: true,
}}
components={{ PriceCell }}
onSortChanged={({ api, columnApi }) => {
addSummaryRows(api, columnApi, getGroupId, getGroupSummaryRow);
}}
onGridReady={(event) => {
event.columnApi.applyColumnState({
state: [
{
colId: 'asset.symbol',
sort: 'asc',
},
],
});
}}
>
<AgGridColumn
headerName={t('Asset')}
field="asset.symbol"
sortable
sortingOrder={['asc', 'desc']}
comparator={comparator}
cellRenderer={({ value }: GroupCellRendererParams) =>
value && value.length > 0 ? (
<button
className="hover:underline"
onClick={() => {
setAssetDetailsDialogOpen(true);
setAssetDetailsDialogSymbol(value);
}}
>
{value}
</button>
) : (
''
)
}
/>
<AgGridColumn
headerName={t('Type')}
field="type"
valueFormatter={({ value }: ValueFormatterParams) =>
value ? AccountTypeMapping[value as AccountType] : '-'
}
/>
<AgGridColumn
headerName={t('Market')}
field="market.tradableInstrument.instrument.name"
valueFormatter="value || '—'"
/>
<AgGridColumn
headerName={t('Balance')}
field="balance"
cellRenderer="PriceCell"
type="rightAligned"
valueFormatter={({
value,
data,
}: AccountsTableValueFormatterParams) =>
addDecimalsFormatNumber(value, data.asset.decimals)
}
/>
</AgGrid>
);
}
);
export default AccountsTable;