* feat: use MarketList query only * fix: remove Market.ts from index * feat: 30 refactor dialog, market list, change query * feat: #30 add indicativeVolume, total fees, tooltip, large dialog, tooltip accepts html description * fix: #30 total fees display in tooltip * fix: #30 toggle title on dialog open * fix: #30 fix order, price, high, low utils * fix: #30 fix test for market utils * feat: #30 add popover with markets to select * feat: #30 storybook popover * feat: #30 remove border on trigger and add some other classes * fix: #30 fix format check with format:write * feat: #30 add tooltip on taker fee * feat: #30 add tooltip on taker fee * fix: #30 format on select market list * fix: #30 remove unknown cast in test mock data * fix: #30 show markets where you have open positions * fix: #30 double check if open positions * fix: #30 dialog has only small/large sizes * feat: #30 add border on trigger and change padding and no wrap * fix: #30 if fees or factors are not found * fix: #30 remove markets.cy tests as markets page is now gone * fix #30 remove view full market list test * fix: #30 add rotating arrow on market title * fix: #30 add ease-in-out on popover * fix: #30 add ease-in-out on popover * fix: #30 align select a market table * fix: #30 select a market title * fix: #30 select a market title * fix: #30 fix any validateDOMnesting issues * fix: #30 show loading market data * fix: #30 add list of header columns * fix: #30 add list of header columns * fix: #30 small refactoring after review * fix: #30 update bold undreline class names * fix: #30 add large-mobile size * feat: #30 refactor select markets tables to render array of columns * fix: #30 remove size from select market dialog * fix: #30 add extra file for columns * fix: #30 update formtting * fix: #30 make sure popup closes on same market navigation * fix: rename market-utils, add calcCandle methods, store market id on select * fix: useMemo ondata and marketPositionData + orderbook stories fix * feat: #30 add open volume positions * fix: add market summary back * fix: update formatting * fix: use currentcolor on arrow * fix: create all markets page * fix: add overflow-y auto * fix: enlarge select market to get started dialog * fix: revert markets container * fix: use query to fix flickering on position markets * fix: edit unordered list in tooltips * fix: fix tooltip table * fix: fix home.cy.ts * chore: skip /markets tests
104 lines
2.2 KiB
TypeScript
104 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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`;
|
|
|
|
export 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
|
|
) => {
|
|
return 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);
|