vega-frontend-monorepo/libs/positions/src/lib/positions-container.tsx

70 lines
2.2 KiB
TypeScript
Raw Normal View History

import { useRef, useCallback, useMemo } from 'react';
import { produce } from 'immer';
import merge from 'lodash/merge';
import { useRouter } from 'next/router';
2022-03-29 22:52:51 +00:00
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
import { useDataProvider } from '@vegaprotocol/react-helpers';
import { useVegaWallet } from '@vegaprotocol/wallet';
2022-03-29 22:52:51 +00:00
import { PositionSubscribe_positions } from './__generated__/PositionSubscribe';
import { Positions_party_positions } from './__generated__/Positions';
import type { AgGridReact } from 'ag-grid-react';
2022-03-29 22:52:51 +00:00
import PositionsTable, { getRowNodeId } from './positions-table';
import { positionsDataProvider } from './positions-data-provider';
2022-03-29 22:52:51 +00:00
export const PositionsContainer = () => {
const { pathname, push } = useRouter();
2022-03-29 17:31:00 +00:00
const gridRef = useRef<AgGridReact | null>(null);
const { keypair } = useVegaWallet();
2022-03-29 17:31:00 +00:00
const variables = useMemo(() => ({ partyId: keypair?.pub }), [keypair]);
const update = useCallback(
(delta: PositionSubscribe_positions) => {
const update: Positions_party_positions[] = [];
const add: Positions_party_positions[] = [];
if (!gridRef.current) {
return false;
}
const rowNode = gridRef.current.api.getRowNode(getRowNodeId(delta));
if (rowNode) {
const updatedData = produce<Positions_party_positions>(
rowNode.data,
(draft: Positions_party_positions) => {
merge(draft, delta);
}
);
if (updatedData !== rowNode.data) {
update.push(updatedData);
}
} else {
add.push(delta);
}
if (update.length || add.length) {
gridRef.current.api.applyTransactionAsync({
update,
add,
addIndex: 0,
});
}
return true;
},
[gridRef]
);
const { data, error, loading } = useDataProvider<
Positions_party_positions,
PositionSubscribe_positions
>(positionsDataProvider, update, variables);
return (
<AsyncRenderer loading={loading} error={error} data={data}>
{(data) => (
<PositionsTable
ref={gridRef}
data={data}
onRowClicked={(id) =>
push(`${pathname}/${id}?portfolio=orders&trade=orderbook`)
}
/>
)}
</AsyncRenderer>
);
};