chore: fix positions data provider restarts (#1509)

This commit is contained in:
Bartłomiej Głownia 2022-09-28 00:02:48 +02:00 committed by GitHub
parent e310f04034
commit 414b8ced13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 30 additions and 42 deletions

View File

@ -17,11 +17,11 @@ const getRowId = ({ data }: { data: Position }) => data.marketId;
const PositionsAsset = ({ partyId, assetSymbol }: Props) => { const PositionsAsset = ({ partyId, assetSymbol }: Props) => {
const gridRef = useRef<AgGridReact | null>(null); const gridRef = useRef<AgGridReact | null>(null);
const { data, error, loading, getRows } = usePositionsData({ const { data, error, loading, getRows } = usePositionsData(
partyId, partyId,
assetSymbol,
gridRef, gridRef,
}); assetSymbol
);
const { columnDefs, defaultColDef } = useColumnDefinitions(); const { columnDefs, defaultColDef } = useColumnDefinitions();
return ( return (
<AsyncRenderer loading={loading} error={error} data={data}> <AsyncRenderer loading={loading} error={error} data={data}>

View File

@ -6,9 +6,7 @@ import PositionsAsset from './positions-asset';
const Positions = () => { const Positions = () => {
const { partyId } = useOutletContext<{ partyId: string }>(); const { partyId } = useOutletContext<{ partyId: string }>();
const { data, error, loading, assetSymbols } = usePositionsAssets({ const { data, error, loading, assetSymbols } = usePositionsAssets(partyId);
partyId,
});
return ( return (
<AsyncRenderer loading={loading} error={error} data={data}> <AsyncRenderer loading={loading} error={error} data={data}>
{assetSymbols && assetSymbols.length > 0 && ( {assetSymbols && assetSymbols.length > 0 && (

View File

@ -160,7 +160,7 @@ export const SelectMarketPopover = ({
PositionsSubscription_positions[] PositionsSubscription_positions[]
>({ >({
dataProvider: positionsDataProvider, dataProvider: positionsDataProvider,
update: () => false, noUpdate: true,
variables, variables,
skip: !keypair, skip: !keypair,
}); });

View File

@ -17,10 +17,7 @@ export const PositionsManager = ({ partyId }: PositionsManagerProps) => {
[submit] [submit]
); );
const { data, error, loading, assetSymbols } = usePositionsAssets({ const { data, error, loading, assetSymbols } = usePositionsAssets(partyId);
partyId,
});
return ( return (
<> <>
<AsyncRenderer loading={loading} error={error} data={data}> <AsyncRenderer loading={loading} error={error} data={data}>

View File

@ -16,11 +16,11 @@ interface PositionsProps {
export const Positions = memo( export const Positions = memo(
({ partyId, assetSymbol, onClose }: PositionsProps) => { ({ partyId, assetSymbol, onClose }: PositionsProps) => {
const gridRef = useRef<AgGridReact | null>(null); const gridRef = useRef<AgGridReact | null>(null);
const { data, error, loading, getRows } = usePositionsData({ const { data, error, loading, getRows } = usePositionsData(
partyId, partyId,
assetSymbol,
gridRef, gridRef,
}); assetSymbol
);
return ( return (
<AsyncRenderer loading={loading} error={error} data={data}> <AsyncRenderer loading={loading} error={error} data={data}>

View File

@ -3,14 +3,10 @@ import { useDataProvider } from '@vegaprotocol/react-helpers';
import type { Position } from './positions-data-providers'; import type { Position } from './positions-data-providers';
import { positionsMetricsDataProvider as dataProvider } from './positions-data-providers'; import { positionsMetricsDataProvider as dataProvider } from './positions-data-providers';
interface Props {
partyId: string;
}
const getSymbols = (positions: Position[]) => const getSymbols = (positions: Position[]) =>
Array.from(new Set(positions.map((position) => position.assetSymbol))).sort(); Array.from(new Set(positions.map((position) => position.assetSymbol))).sort();
export const usePositionsAssets = ({ partyId }: Props) => { export const usePositionsAssets = (partyId: string) => {
const variables = useMemo(() => ({ partyId }), [partyId]); const variables = useMemo(() => ({ partyId }), [partyId]);
const assetSymbols = useRef<string[] | undefined>(); const assetSymbols = useRef<string[] | undefined>();
const update = useCallback(({ data }: { data: Position[] | null }) => { const update = useCallback(({ data }: { data: Position[] | null }) => {

View File

@ -8,12 +8,6 @@ import { positionsMetricsDataProvider as dataProvider } from './positions-data-p
import filter from 'lodash/filter'; import filter from 'lodash/filter';
import { t, toBigNum, useDataProvider } from '@vegaprotocol/react-helpers'; import { t, toBigNum, useDataProvider } from '@vegaprotocol/react-helpers';
interface Props {
partyId: string;
assetSymbol?: string;
gridRef: RefObject<AgGridReact>;
}
const getSummaryRow = (positions: Position[]) => { const getSummaryRow = (positions: Position[]) => {
const summaryRow = { const summaryRow = {
notional: new BigNumber(0), notional: new BigNumber(0),
@ -41,7 +35,11 @@ const getSummaryRow = (positions: Position[]) => {
}; };
}; };
export const usePositionsData = ({ partyId, assetSymbol, gridRef }: Props) => { export const usePositionsData = (
partyId: string,
gridRef: RefObject<AgGridReact>,
assetSymbol?: string
) => {
const variables = useMemo(() => ({ partyId }), [partyId]); const variables = useMemo(() => ({ partyId }), [partyId]);
const dataRef = useRef<Position[] | null>(null); const dataRef = useRef<Position[] | null>(null);
const update = useCallback( const update = useCallback(
@ -61,22 +59,21 @@ export const usePositionsData = ({ partyId, assetSymbol, gridRef }: Props) => {
variables, variables,
}); });
dataRef.current = assetSymbol ? filter(data, { assetSymbol }) : data; dataRef.current = assetSymbol ? filter(data, { assetSymbol }) : data;
const getRows = async ({ const getRows = useCallback(
successCallback, async ({ successCallback, startRow, endRow }: GetRowsParams) => {
startRow, const rowsThisBlock = dataRef.current
endRow, ? dataRef.current.slice(startRow, endRow)
}: GetRowsParams) => { : [];
const rowsThisBlock = dataRef.current const lastRow = dataRef.current?.length ?? -1;
? dataRef.current.slice(startRow, endRow) successCallback(rowsThisBlock, lastRow);
: []; if (gridRef.current?.api) {
const lastRow = dataRef.current?.length ?? -1; gridRef.current.api.setPinnedBottomRowData([
successCallback(rowsThisBlock, lastRow); getSummaryRow(rowsThisBlock),
if (gridRef.current?.api) { ]);
gridRef.current.api.setPinnedBottomRowData([ }
getSummaryRow(rowsThisBlock), },
]); [gridRef]
} );
};
return { return {
data, data,
error, error,