vega-frontend-monorepo/libs/positions/src/lib/positions-data-provider.ts
Bartłomiej Głownia 98d3c47808
feat(orderbook): improve data handling performance (#605)
* feat(orderbook): improve data handling performance

* feat(orderbook): fix scrolling out of range
2022-06-27 12:05:05 +02:00

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);