* feat(orderbook): improve data handling performance * feat(orderbook): fix scrolling out of range
102 lines
2.2 KiB
TypeScript
102 lines
2.2 KiB
TypeScript
import produce from 'immer';
|
|
import { gql } from '@apollo/client';
|
|
import type {
|
|
Positions,
|
|
Positions_party_positions,
|
|
} from './__generated__/Positions';
|
|
import { makeDataProvider } from '@vegaprotocol/react-helpers';
|
|
|
|
import type {
|
|
PositionSubscribe,
|
|
PositionSubscribe_positions,
|
|
} from './__generated__/PositionSubscribe';
|
|
|
|
const POSITIONS_FRAGMENT = gql`
|
|
fragment PositionDetails on Position {
|
|
realisedPNL
|
|
openVolume
|
|
unrealisedPNL
|
|
averageEntryPrice
|
|
market {
|
|
id
|
|
name
|
|
data {
|
|
markPrice
|
|
marketTradingMode
|
|
market {
|
|
id
|
|
}
|
|
}
|
|
decimalPlaces
|
|
positionDecimalPlaces
|
|
tradableInstrument {
|
|
instrument {
|
|
id
|
|
name
|
|
metadata {
|
|
tags
|
|
}
|
|
code
|
|
product {
|
|
... on Future {
|
|
settlementAsset {
|
|
id
|
|
symbol
|
|
name
|
|
decimals
|
|
}
|
|
quoteName
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`;
|
|
|
|
const POSITION_QUERY = gql`
|
|
${POSITIONS_FRAGMENT}
|
|
query Positions($partyId: ID!) {
|
|
party(id: $partyId) {
|
|
id
|
|
positions {
|
|
...PositionDetails
|
|
}
|
|
}
|
|
}
|
|
`;
|
|
|
|
export const POSITIONS_SUB = gql`
|
|
${POSITIONS_FRAGMENT}
|
|
subscription PositionSubscribe($partyId: ID!) {
|
|
positions(partyId: $partyId) {
|
|
...PositionDetails
|
|
}
|
|
}
|
|
`;
|
|
|
|
const update = (
|
|
data: Positions_party_positions[],
|
|
delta: PositionSubscribe_positions
|
|
) =>
|
|
produce(data, (draft) => {
|
|
const index = draft.findIndex((m) => m.market.id === delta.market.id);
|
|
if (index !== -1) {
|
|
draft[index] = delta;
|
|
} else {
|
|
draft.push(delta);
|
|
}
|
|
});
|
|
const getData = (responseData: Positions): Positions_party_positions[] | null =>
|
|
responseData.party ? responseData.party.positions : null;
|
|
const getDelta = (
|
|
subscriptionData: PositionSubscribe
|
|
): PositionSubscribe_positions => subscriptionData.positions;
|
|
|
|
export const positionsDataProvider = makeDataProvider<
|
|
Positions,
|
|
Positions_party_positions[],
|
|
PositionSubscribe,
|
|
PositionSubscribe_positions
|
|
>(POSITION_QUERY, POSITIONS_SUB, update, getData, getDelta);
|