chore(markets): remove trading mode and type from market query (#6117)

Co-authored-by: Dariusz Majcherczyk <dariusz.majcherczyk@gmail.com>
This commit is contained in:
Bartłomiej Głownia 2024-03-28 12:09:18 +01:00 committed by GitHub
parent bb2464ddc2
commit df21996707
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 238 additions and 321 deletions

View File

@ -1,5 +1,5 @@
import { useMemo } from 'react'; import { useMemo } from 'react';
import { getAsset, type MarketFieldsFragment } from '@vegaprotocol/markets'; import { getAsset, type MarketMaybeWithData } from '@vegaprotocol/markets';
import { t } from '@vegaprotocol/i18n'; import { t } from '@vegaprotocol/i18n';
import { ButtonLink } from '@vegaprotocol/ui-toolkit'; import { ButtonLink } from '@vegaprotocol/ui-toolkit';
import { type AgGridReact } from 'ag-grid-react'; import { type AgGridReact } from 'ag-grid-react';
@ -17,7 +17,7 @@ import { type RowClickedEvent } from 'ag-grid-community';
import { Link, useNavigate } from 'react-router-dom'; import { Link, useNavigate } from 'react-router-dom';
type MarketsTableProps = { type MarketsTableProps = {
data: MarketFieldsFragment[] | null; data: MarketMaybeWithData[] | null;
}; };
export const MarketsTable = ({ data }: MarketsTableProps) => { export const MarketsTable = ({ data }: MarketsTableProps) => {
const openAssetDetailsDialog = useAssetDetailsDialogStore( const openAssetDetailsDialog = useAssetDetailsDialogStore(
@ -56,10 +56,10 @@ export const MarketsTable = ({ data }: MarketsTableProps) => {
headerName: t('Status'), headerName: t('Status'),
field: 'state', field: 'state',
hide: window.innerWidth <= BREAKPOINT_MD, hide: window.innerWidth <= BREAKPOINT_MD,
valueGetter: ({ valueGetter: ({ data }: VegaValueGetterParams<MarketMaybeWithData>) => {
data, return data?.data?.marketState
}: VegaValueGetterParams<MarketFieldsFragment>) => { ? MarketStateMapping[data?.data.marketState]
return data?.state ? MarketStateMapping[data?.state] : '-'; : '-';
}, },
}, },
{ {
@ -70,7 +70,7 @@ export const MarketsTable = ({ data }: MarketsTableProps) => {
cellRenderer: ({ cellRenderer: ({
data, data,
}: VegaICellRendererParams< }: VegaICellRendererParams<
MarketFieldsFragment, MarketMaybeWithData,
'tradableInstrument.instrument.product.settlementAsset.symbol' 'tradableInstrument.instrument.product.settlementAsset.symbol'
>) => { >) => {
const value = data && getAsset(data); const value = data && getAsset(data);
@ -99,7 +99,7 @@ export const MarketsTable = ({ data }: MarketsTableProps) => {
field: 'id', field: 'id',
cellRenderer: ({ cellRenderer: ({
value, value,
}: VegaICellRendererParams<MarketFieldsFragment, 'id'>) => }: VegaICellRendererParams<MarketMaybeWithData, 'id'>) =>
value ? ( value ? (
<Link className="underline" to={value}> <Link className="underline" to={value}>
{t('View details')} {t('View details')}
@ -116,7 +116,7 @@ export const MarketsTable = ({ data }: MarketsTableProps) => {
<AgGrid <AgGrid
ref={gridRef} ref={gridRef}
rowData={data} rowData={data}
getRowId={({ data }: { data: MarketFieldsFragment }) => data.id} getRowId={({ data }: { data: MarketMaybeWithData }) => data.id}
overlayNoRowsTemplate={t('This chain has no markets')} overlayNoRowsTemplate={t('This chain has no markets')}
domLayout="autoHeight" domLayout="autoHeight"
defaultColDef={{ defaultColDef={{

View File

@ -1,6 +1,6 @@
import { useScrollToLocation } from '../../hooks/scroll-to-location'; import { useScrollToLocation } from '../../hooks/scroll-to-location';
import { useDocumentTitle } from '../../hooks/use-document-title'; import { useDocumentTitle } from '../../hooks/use-document-title';
import { marketsProvider } from '@vegaprotocol/markets'; import { marketsWithDataProvider } from '@vegaprotocol/markets';
import { RouteTitle } from '../../components/route-title'; import { RouteTitle } from '../../components/route-title';
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit'; import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
import { t } from '@vegaprotocol/i18n'; import { t } from '@vegaprotocol/i18n';
@ -12,7 +12,7 @@ export const MarketsPage = () => {
useScrollToLocation(); useScrollToLocation();
const { data, loading, error } = useDataProvider({ const { data, loading, error } = useDataProvider({
dataProvider: marketsProvider, dataProvider: marketsWithDataProvider,
variables: undefined, variables: undefined,
skipUpdates: true, skipUpdates: true,
}); });

View File

@ -5,8 +5,8 @@ import type { Market } from '@vegaprotocol/markets';
import { import {
addDecimalsFormatNumber, addDecimalsFormatNumber,
fromNanoSeconds, fromNanoSeconds,
getExpiryDate,
getMarketExpiryDate, getMarketExpiryDate,
useExpiryDate,
} from '@vegaprotocol/utils'; } from '@vegaprotocol/utils';
import { import {
Last24hPriceChange, Last24hPriceChange,
@ -20,6 +20,7 @@ import {
useMarketTradingMode, useMarketTradingMode,
useExternalTwap, useExternalTwap,
getQuoteName, getQuoteName,
useMarketState,
} from '@vegaprotocol/markets'; } from '@vegaprotocol/markets';
import { MarketState as State } from '@vegaprotocol/types'; import { MarketState as State } from '@vegaprotocol/types';
import { HeaderStat } from '../../components/header'; import { HeaderStat } from '../../components/header';
@ -66,11 +67,8 @@ export const MarketHeaderStats = ({ market }: MarketHeaderStatsProps) => {
quoteUnit={quoteUnit} quoteUnit={quoteUnit}
/> />
</HeaderStat> </HeaderStat>
<HeaderStatMarketTradingMode <HeaderStatMarketTradingMode marketId={market.id} />
marketId={market.id} <MarketState marketId={market.id} />
initialTradingMode={market.tradingMode}
/>
<MarketState market={market} />
{asset ? ( {asset ? (
<HeaderStat <HeaderStat
heading={t('Settlement asset')} heading={t('Settlement asset')}
@ -264,13 +262,13 @@ export const FundingCountdown = ({ marketId }: { marketId: string }) => {
}; };
const ExpiryLabel = ({ market }: ExpiryLabelProps) => { const ExpiryLabel = ({ market }: ExpiryLabelProps) => {
const content = market.tradableInstrument.instrument.metadata.tags const { data: marketState } = useMarketState(market.id);
? getExpiryDate( const content =
market.tradableInstrument.instrument.metadata.tags, useExpiryDate(
market.marketTimestamps.close, market.tradableInstrument.instrument.metadata.tags,
market.state market.marketTimestamps.close,
) marketState
: '-'; ) || '-';
return <div data-testid="trading-expiry">{content}</div>; return <div data-testid="trading-expiry">{content}</div>;
}; };
@ -283,6 +281,7 @@ const ExpiryTooltipContent = ({
market, market,
explorerUrl, explorerUrl,
}: ExpiryTooltipContentProps) => { }: ExpiryTooltipContentProps) => {
const { data: state } = useMarketState(market.id);
const t = useT(); const t = useT();
if (market.marketTimestamps.close === null) { if (market.marketTimestamps.close === null) {
const oracleId = const oracleId =
@ -298,8 +297,8 @@ const ExpiryTooltipContent = ({
const isExpired = const isExpired =
metadataExpiryDate && metadataExpiryDate &&
Date.now() - metadataExpiryDate.valueOf() > 0 && Date.now() - metadataExpiryDate.valueOf() > 0 &&
(market.state === State.STATE_TRADING_TERMINATED || (state === State.STATE_TRADING_TERMINATED ||
market.state === State.STATE_SETTLED); state === State.STATE_SETTLED);
return ( return (
<section data-testid="expiry-tooltip"> <section data-testid="expiry-tooltip">

View File

@ -40,7 +40,6 @@ describe('Closed', () => {
const market = createMarketFragment({ const market = createMarketFragment({
id: marketId, id: marketId,
state: MarketState.STATE_SETTLED,
tradableInstrument: { tradableInstrument: {
instrument: { instrument: {
metadata: { metadata: {
@ -96,6 +95,7 @@ describe('Closed', () => {
const marketsData = createMarketsDataFragment({ const marketsData = createMarketsDataFragment({
__typename: 'MarketData', __typename: 'MarketData',
marketState: MarketState.STATE_SETTLED,
market: { market: {
__typename: 'Market', __typename: 'Market',
id: marketId, id: marketId,
@ -208,7 +208,7 @@ describe('Closed', () => {
const cells = screen.getAllByRole('gridcell'); const cells = screen.getAllByRole('gridcell');
const expectedValues = [ const expectedValues = [
market.tradableInstrument.instrument.code, market.tradableInstrument.instrument.code,
MarketStateMapping[market.state], MarketStateMapping[marketsData.marketState],
'3 days ago', '3 days ago',
/* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @typescript-eslint/no-non-null-assertion */
addDecimalsFormatNumber(marketsData.bestBidPrice, market.decimalPlaces), addDecimalsFormatNumber(marketsData.bestBidPrice, market.decimalPlaces),
@ -227,87 +227,6 @@ describe('Closed', () => {
}); });
}); });
it('only renders settled and terminated markets', async () => {
const mixedMarkets = [
{
// include as settled
__typename: 'MarketEdge' as const,
node: createMarketFragment({
id: 'include-0',
state: MarketState.STATE_SETTLED,
}),
},
{
// omit this market
__typename: 'MarketEdge' as const,
node: createMarketFragment({
id: 'discard-0',
state: MarketState.STATE_SUSPENDED,
}),
},
{
// include as terminated
__typename: 'MarketEdge' as const,
node: createMarketFragment({
id: 'include-1',
state: MarketState.STATE_TRADING_TERMINATED,
}),
},
{
// omit this market
__typename: 'MarketEdge' as const,
node: createMarketFragment({
id: 'discard-1',
state: MarketState.STATE_ACTIVE,
}),
},
];
const mixedMarketsMock: MockedResponse<MarketsQuery> = {
request: {
query: MarketsDocument,
},
result: {
data: {
marketsConnection: {
__typename: 'MarketConnection',
edges: mixedMarkets,
},
},
},
};
await renderComponent([mixedMarketsMock, marketsDataMock, oracleDataMock]);
// check that the number of rows in datagrid is 2
const container = within(
document.querySelector('.ag-center-cols-container') as HTMLElement
);
const expectedRows = mixedMarkets.filter((m) => {
return [
MarketState.STATE_SETTLED,
MarketState.STATE_TRADING_TERMINATED,
].includes(m.node.state);
});
await waitFor(() => {
// check rows length is correct
const rows = container.getAllByRole('row');
expect(rows).toHaveLength(expectedRows.length);
});
// check that only included ids are shown
const cells = screen
.getAllByRole('gridcell')
.filter((cell) => cell.getAttribute('col-id') === 'code')
.map((cell) => {
const marketCode = within(cell).getByTestId('stack-cell-primary');
return marketCode.textContent;
});
expect(cells).toEqual(
expectedRows.map((m) => m.node.tradableInstrument.instrument.code)
);
});
it('display market actions', async () => { it('display market actions', async () => {
// Use market with a successor Id as the actions dropdown will optionally // Use market with a successor Id as the actions dropdown will optionally
// show a link to the successor market // show a link to the successor market
@ -315,8 +234,7 @@ describe('Closed', () => {
{ {
__typename: 'MarketEdge' as const, __typename: 'MarketEdge' as const,
node: createMarketFragment({ node: createMarketFragment({
id: 'include-0', id: marketId,
state: MarketState.STATE_SETTLED,
successorMarketID: 'successor', successorMarketID: 'successor',
parentMarketID: 'parent', parentMarketID: 'parent',
}), }),
@ -375,8 +293,7 @@ describe('Closed', () => {
{ {
__typename: 'MarketEdge' as const, __typename: 'MarketEdge' as const,
node: createMarketFragment({ node: createMarketFragment({
id: 'include-0', id: marketId,
state: MarketState.STATE_SETTLED,
successorMarketID: 'successor', successorMarketID: 'successor',
}), }),
}, },

View File

@ -15,7 +15,7 @@ import {
addDecimalsFormatNumber, addDecimalsFormatNumber,
getMarketExpiryDate, getMarketExpiryDate,
} from '@vegaprotocol/utils'; } from '@vegaprotocol/utils';
import { closedMarketsWithDataProvider, getAsset } from '@vegaprotocol/markets'; import { closedMarketsProvider, getAsset } from '@vegaprotocol/markets';
import type { DataSourceFilterFragment } from '@vegaprotocol/markets'; import type { DataSourceFilterFragment } from '@vegaprotocol/markets';
import { useAssetDetailsDialogStore } from '@vegaprotocol/assets'; import { useAssetDetailsDialogStore } from '@vegaprotocol/assets';
import { useMarketClickHandler } from '../../lib/hooks/use-market-click-handler'; import { useMarketClickHandler } from '../../lib/hooks/use-market-click-handler';
@ -35,7 +35,7 @@ interface Row {
code: string; code: string;
name: string; name: string;
decimalPlaces: number; decimalPlaces: number;
state: MarketState; state?: MarketState;
metadata: string[]; metadata: string[];
closeTimestamp: string | null; closeTimestamp: string | null;
bestBidPrice: string | undefined; bestBidPrice: string | undefined;
@ -53,7 +53,7 @@ interface Row {
export const Closed = () => { export const Closed = () => {
const { data: marketData, error } = useDataProvider({ const { data: marketData, error } = useDataProvider({
dataProvider: closedMarketsWithDataProvider, dataProvider: closedMarketsProvider,
variables: undefined, variables: undefined,
}); });
@ -87,7 +87,7 @@ export const Closed = () => {
code: instrument.code, code: instrument.code,
name: instrument.name, name: instrument.name,
decimalPlaces: market.decimalPlaces, decimalPlaces: market.decimalPlaces,
state: market.state, state: market.data?.marketState,
metadata: instrument.metadata.tags ?? [], metadata: instrument.metadata.tags ?? [],
closeTimestamp: market.marketTimestamps.close, closeTimestamp: market.marketTimestamps.close,
bestBidPrice: market.data?.bestBidPrice, bestBidPrice: market.data?.bestBidPrice,

View File

@ -3,11 +3,17 @@ import type { MockedResponse } from '@apollo/client/testing';
import { MockedProvider } from '@apollo/client/testing'; import { MockedProvider } from '@apollo/client/testing';
import { ProposalsList } from './proposals-list'; import { ProposalsList } from './proposals-list';
import { MarketState } from '@vegaprotocol/types'; import { MarketState } from '@vegaprotocol/types';
import { createMarketFragment } from '@vegaprotocol/mock'; import {
createMarketFragment,
createMarketsDataFragment,
} from '@vegaprotocol/mock';
import { import {
type MarketsQuery, type MarketsQuery,
MarketsDocument, MarketsDocument,
type MarketsQueryVariables, type MarketsQueryVariables,
type MarketsDataQuery,
type MarketsDataQueryVariables,
MarketsDataDocument,
} from '@vegaprotocol/markets'; } from '@vegaprotocol/markets';
const parentMarketName = 'Parent Market Name'; const parentMarketName = 'Parent Market Name';
@ -15,12 +21,13 @@ const ParentMarketCell = () => <span>{parentMarketName}</span>;
describe('ProposalsList', () => { describe('ProposalsList', () => {
const rowContainerSelector = '.ag-center-cols-container'; const rowContainerSelector = '.ag-center-cols-container';
const market = createMarketFragment({ const market = createMarketFragment();
state: MarketState.STATE_PROPOSED, const marketData = createMarketsDataFragment({
marketState: MarketState.STATE_PROPOSED,
}); });
it('should be properly rendered', async () => { it('should be properly rendered', async () => {
const mock: MockedResponse<MarketsQuery, MarketsQueryVariables> = { const marketMock: MockedResponse<MarketsQuery, MarketsQueryVariables> = {
request: { request: {
query: MarketsDocument, query: MarketsDocument,
}, },
@ -37,8 +44,28 @@ describe('ProposalsList', () => {
}, },
}; };
const marketDataMock: MockedResponse<
MarketsDataQuery,
MarketsDataQueryVariables
> = {
request: {
query: MarketsDataDocument,
},
result: {
data: {
marketsConnection: {
edges: [
{
node: { data: marketData },
},
],
},
},
},
};
render( render(
<MockedProvider mocks={[mock]}> <MockedProvider mocks={[marketMock, marketDataMock]}>
<ProposalsList cellRenderers={{ ParentMarketCell }} /> <ProposalsList cellRenderers={{ ParentMarketCell }} />
</MockedProvider> </MockedProvider>
); );
@ -69,7 +96,7 @@ describe('ProposalsList', () => {
expect(await container.findAllByRole('row')).toHaveLength( expect(await container.findAllByRole('row')).toHaveLength(
// @ts-ignore data is mocked // @ts-ignore data is mocked
mock?.result?.data.marketsConnection.edges.length marketMock?.result?.data.marketsConnection.edges.length
); );
expect( expect(
@ -81,7 +108,7 @@ describe('ProposalsList', () => {
}); });
it('empty response should causes no data message display', async () => { it('empty response should causes no data message display', async () => {
const mock: MockedResponse<MarketsQuery, MarketsQueryVariables> = { const marketMock: MockedResponse<MarketsQuery, MarketsQueryVariables> = {
request: { request: {
query: MarketsDocument, query: MarketsDocument,
}, },
@ -93,8 +120,23 @@ describe('ProposalsList', () => {
}, },
}, },
}; };
const marketDataMock: MockedResponse<
MarketsDataQuery,
MarketsDataQueryVariables
> = {
request: {
query: MarketsDataDocument,
},
result: {
data: {
marketsConnection: {
edges: [],
},
},
},
};
render( render(
<MockedProvider mocks={[mock]}> <MockedProvider mocks={[marketMock, marketDataMock]}>
<ProposalsList cellRenderers={{ ParentMarketCell }} /> <ProposalsList cellRenderers={{ ParentMarketCell }} />
</MockedProvider> </MockedProvider>
); );

View File

@ -19,7 +19,7 @@ import {
} from '@vegaprotocol/types'; } from '@vegaprotocol/types';
import { ProposalActionsDropdown } from './proposal-actions-dropdown'; import { ProposalActionsDropdown } from './proposal-actions-dropdown';
import { import {
type MarketFieldsFragment, type MarketMaybeWithData,
getProductType, getProductType,
} from '@vegaprotocol/markets'; } from '@vegaprotocol/markets';
import { useT } from '../../../lib/use-t'; import { useT } from '../../../lib/use-t';
@ -40,7 +40,7 @@ export const useColumnDefs = () => {
data, data,
}: { }: {
value: string; value: string;
data: MarketFieldsFragment; data: MarketMaybeWithData;
}) => { }) => {
if (!value || !data) return '-'; if (!value || !data) return '-';
@ -70,10 +70,13 @@ export const useColumnDefs = () => {
{ {
colId: 'state', colId: 'state',
headerName: t('State'), headerName: t('State'),
field: 'state', field: 'data.marketState',
valueFormatter: ({ valueFormatter: ({
value, value,
}: VegaValueFormatterParams<MarketFieldsFragment, 'state'>) => { }: VegaValueFormatterParams<
MarketMaybeWithData,
'data.marketState'
>) => {
return value ? MarketStateMapping[value] : '-'; return value ? MarketStateMapping[value] : '-';
}, },
filter: SetFilter, filter: SetFilter,
@ -93,7 +96,7 @@ export const useColumnDefs = () => {
valueFormatter: ({ valueFormatter: ({
value, value,
}: VegaValueFormatterParams< }: VegaValueFormatterParams<
MarketFieldsFragment, MarketMaybeWithData,
'marketTimestamps.pending' 'marketTimestamps.pending'
>) => { >) => {
return value ? getDateTimeFormat().format(new Date(value)) : '-'; return value ? getDateTimeFormat().format(new Date(value)) : '-';
@ -107,7 +110,7 @@ export const useColumnDefs = () => {
valueFormatter: ({ valueFormatter: ({
value, value,
}: VegaValueFormatterParams< }: VegaValueFormatterParams<
MarketFieldsFragment, MarketMaybeWithData,
'marketTimestamps.open' 'marketTimestamps.open'
>) => (value ? getDateTimeFormat().format(new Date(value)) : '-'), >) => (value ? getDateTimeFormat().format(new Date(value)) : '-'),
filter: DateRangeFilter, filter: DateRangeFilter,
@ -117,7 +120,7 @@ export const useColumnDefs = () => {
...COL_DEFS.actions, ...COL_DEFS.actions,
cellRenderer: ({ cellRenderer: ({
data, data,
}: VegaICellRendererParams<MarketFieldsFragment>) => { }: VegaICellRendererParams<MarketMaybeWithData>) => {
if (!data?.marketProposal?.id) return null; if (!data?.marketProposal?.id) return null;
return <ProposalActionsDropdown id={data.marketProposal.id} />; return <ProposalActionsDropdown id={data.marketProposal.id} />;

View File

@ -9,7 +9,7 @@ export interface SettlementDataCellProps {
oracleSpecId: string; oracleSpecId: string;
metaDate: Date | null; metaDate: Date | null;
closeTimestamp: string | null; closeTimestamp: string | null;
marketState: MarketState; marketState?: MarketState;
} }
export const SettlementDateCell = ({ export const SettlementDateCell = ({

View File

@ -125,7 +125,9 @@ export const useMarketsColumnDefs = () => {
valueFormatter: ({ valueFormatter: ({
data, data,
}: VegaValueFormatterParams<MarketMaybeWithData, 'state'>) => { }: VegaValueFormatterParams<MarketMaybeWithData, 'state'>) => {
return data?.state ? Schema.MarketStateMapping[data.state] : '-'; return data?.data?.marketState
? Schema.MarketStateMapping[data?.data?.marketState]
: '-';
}, },
filter: SetFilter, filter: SetFilter,
filterParams: { filterParams: {

View File

@ -72,17 +72,17 @@ const MarketData = ({
const marketTradingMode = marketData const marketTradingMode = marketData
? marketData.marketTradingMode ? marketData.marketTradingMode
: market.data : market.data?.marketTradingMode;
? market.data.marketTradingMode
: market.tradingMode;
const mode = [ const mode =
MarketTradingMode.TRADING_MODE_BATCH_AUCTION, marketTradingMode &&
MarketTradingMode.TRADING_MODE_MONITORING_AUCTION, [
MarketTradingMode.TRADING_MODE_OPENING_AUCTION, MarketTradingMode.TRADING_MODE_BATCH_AUCTION,
].includes(marketTradingMode) MarketTradingMode.TRADING_MODE_MONITORING_AUCTION,
? MarketTradingModeMapping[marketTradingMode] MarketTradingMode.TRADING_MODE_OPENING_AUCTION,
: ''; ].includes(marketTradingMode)
? MarketTradingModeMapping[marketTradingMode]
: '';
const { oneDayCandles } = useCandles({ marketId: market.id }); const { oneDayCandles } = useCandles({ marketId: market.id });

View File

@ -120,7 +120,7 @@ export const MarketSelector = ({
<div data-testid="market-selector-list"> <div data-testid="market-selector-list">
<MarketList <MarketList
data={markets} data={markets}
loading={loading} loading={loading && !data}
error={error} error={error}
searchTerm={filter.searchTerm} searchTerm={filter.searchTerm}
currentMarketId={currentMarketId} currentMarketId={currentMarketId}

View File

@ -409,7 +409,6 @@ describe('useMarketSelectorList', () => {
}), }),
createMarketFragment({ createMarketFragment({
id: 'market-1', id: 'market-1',
state: MarketState.STATE_ACTIVE,
// @ts-ignore data not on fragment // @ts-ignore data not on fragment
data: createMarketsDataFragment({ data: createMarketsDataFragment({
marketState: MarketState.STATE_ACTIVE, marketState: MarketState.STATE_ACTIVE,
@ -424,7 +423,6 @@ describe('useMarketSelectorList', () => {
}), }),
createMarketFragment({ createMarketFragment({
id: 'market-2', id: 'market-2',
state: MarketState.STATE_ACTIVE,
// @ts-ignore data not on fragment // @ts-ignore data not on fragment
data: createMarketsDataFragment({ data: createMarketsDataFragment({
marketState: MarketState.STATE_ACTIVE, marketState: MarketState.STATE_ACTIVE,
@ -439,7 +437,6 @@ describe('useMarketSelectorList', () => {
}), }),
createMarketFragment({ createMarketFragment({
id: 'market-3', id: 'market-3',
state: MarketState.STATE_ACTIVE,
// @ts-ignore data not on fragment // @ts-ignore data not on fragment
data: createMarketsDataFragment({ data: createMarketsDataFragment({
marketState: MarketState.STATE_ACTIVE, marketState: MarketState.STATE_ACTIVE,

View File

@ -1,48 +1,18 @@
import throttle from 'lodash/throttle'; import { useMarketState } from '@vegaprotocol/markets';
import type { MarketData, Market } from '@vegaprotocol/markets';
import { marketDataProvider } from '@vegaprotocol/markets';
import { useDataProvider } from '@vegaprotocol/data-provider';
import * as Schema from '@vegaprotocol/types'; import * as Schema from '@vegaprotocol/types';
import { HeaderStat } from '../header'; import { HeaderStat } from '../header';
import { useCallback, useRef, useState } from 'react';
import * as constants from '../constants';
import { DocsLinks } from '@vegaprotocol/environment'; import { DocsLinks } from '@vegaprotocol/environment';
import { ExternalLink } from '@vegaprotocol/ui-toolkit'; import { ExternalLink } from '@vegaprotocol/ui-toolkit';
import { useT } from '../../lib/use-t'; import { useT } from '../../lib/use-t';
export const MarketState = ({ market }: { market: Market | null }) => { export const MarketState = ({ marketId }: { marketId?: string }) => {
const t = useT(); const t = useT();
const [marketState, setMarketState] = useState<Schema.MarketState | null>( const { data: marketState } = useMarketState(marketId);
null
);
const throttledSetMarketState = useRef(
throttle((state: Schema.MarketState) => {
setMarketState(state);
}, constants.THROTTLE_UPDATE_TIME)
).current;
const update = useCallback(
({ data: marketData }: { data: MarketData | null }) => {
if (marketData) {
throttledSetMarketState(marketData.marketState);
}
return true;
},
[throttledSetMarketState]
);
useDataProvider({
dataProvider: marketDataProvider,
update,
variables: { marketId: market?.id || '' },
skip: !market?.id,
});
return ( return (
<HeaderStat <HeaderStat
heading={t('Status')} heading={t('Status')}
description={useGetMarketStateTooltip(marketState)} description={useGetMarketStateTooltip(marketState ?? undefined)}
testId="market-state" testId="market-state"
> >
{marketState ? Schema.MarketStateMapping[marketState] : '-'} {marketState ? Schema.MarketStateMapping[marketState] : '-'}
@ -50,7 +20,7 @@ export const MarketState = ({ market }: { market: Market | null }) => {
); );
}; };
const useGetMarketStateTooltip = (state: Schema.MarketState | null) => { const useGetMarketStateTooltip = (state?: Schema.MarketState) => {
const t = useT(); const t = useT();
if (state === Schema.MarketState.STATE_ACTIVE) { if (state === Schema.MarketState.STATE_ACTIVE) {
return t('Enactment date reached and usual auction exit checks pass'); return t('Enactment date reached and usual auction exit checks pass');

View File

@ -26,20 +26,15 @@ const getTradingModeLabel = (
interface HeaderStatMarketTradingModeProps { interface HeaderStatMarketTradingModeProps {
marketId?: string; marketId?: string;
onSelect?: (marketId: string, metaKey?: boolean) => void; onSelect?: (marketId: string, metaKey?: boolean) => void;
initialTradingMode?: Schema.MarketTradingMode;
initialTrigger?: Schema.AuctionTrigger;
} }
export const HeaderStatMarketTradingMode = ({ export const HeaderStatMarketTradingMode = ({
marketId, marketId,
onSelect, onSelect,
initialTradingMode,
initialTrigger,
}: HeaderStatMarketTradingModeProps) => { }: HeaderStatMarketTradingModeProps) => {
const t = useT(); const t = useT();
const { data } = useStaticMarketData(marketId); const { data } = useStaticMarketData(marketId);
const marketTradingMode = data?.marketTradingMode ?? initialTradingMode; const { marketTradingMode, trigger } = data || {};
const trigger = data?.trigger ?? initialTrigger;
return ( return (
<HeaderStat <HeaderStat
@ -56,8 +51,6 @@ export const HeaderStatMarketTradingMode = ({
export const MarketTradingMode = ({ export const MarketTradingMode = ({
marketId, marketId,
initialTradingMode,
initialTrigger,
inViewRoot, inViewRoot,
}: Omit<HeaderStatMarketTradingModeProps, 'onUpdate'> & { }: Omit<HeaderStatMarketTradingModeProps, 'onUpdate'> & {
inViewRoot?: RefObject<Element>; inViewRoot?: RefObject<Element>;
@ -72,10 +65,7 @@ export const MarketTradingMode = ({
} }
> >
<span ref={ref}> <span ref={ref}>
{getTradingModeLabel( {getTradingModeLabel(data?.marketTradingMode, data?.trigger)}
data?.marketTradingMode ?? initialTradingMode,
data?.trigger ?? initialTrigger
)}
</span> </span>
</Tooltip> </Tooltip>
); );

View File

@ -948,13 +948,13 @@ const EntityIcon = ({
export const areAllMarketsSettled = (transferNode: EnrichedRewardTransfer) => { export const areAllMarketsSettled = (transferNode: EnrichedRewardTransfer) => {
const settledMarkets = transferNode.markets?.filter( const settledMarkets = transferNode.markets?.filter(
(m) => (m) =>
m?.state && m?.data?.marketState &&
[ [
MarketState.STATE_TRADING_TERMINATED, MarketState.STATE_TRADING_TERMINATED,
MarketState.STATE_SETTLED, MarketState.STATE_SETTLED,
MarketState.STATE_CANCELLED, MarketState.STATE_CANCELLED,
MarketState.STATE_CLOSED, MarketState.STATE_CLOSED,
].includes(m.state) ].includes(m?.data?.marketState)
); );
return ( return (
@ -969,8 +969,8 @@ export const areAllMarketsSuspended = (
return ( return (
transferNode.markets?.filter( transferNode.markets?.filter(
(m) => (m) =>
m?.state === MarketState.STATE_SUSPENDED || m?.data?.marketState === MarketState.STATE_SUSPENDED ||
m?.state === MarketState.STATE_SUSPENDED_VIA_GOVERNANCE m?.data?.marketState === MarketState.STATE_SUSPENDED_VIA_GOVERNANCE
).length === transferNode.markets?.length && ).length === transferNode.markets?.length &&
Boolean(transferNode.markets && transferNode.markets.length > 0) Boolean(transferNode.markets && transferNode.markets.length > 0)
); );

View File

@ -7,6 +7,7 @@ from fixtures.market import setup_continuous_market
from conftest import init_vega, cleanup_container, init_page, auth_setup, risk_accepted_setup from conftest import init_vega, cleanup_container, init_page, auth_setup, risk_accepted_setup
from wallet_config import MM_WALLET, MM_WALLET2 from wallet_config import MM_WALLET, MM_WALLET2
@pytest.fixture(scope="module") @pytest.fixture(scope="module")
def setup_environment(request, browser) -> Generator[Tuple[Page, str, str], None, None]: def setup_environment(request, browser) -> Generator[Tuple[Page, str, str], None, None]:
with init_vega(request) as vega: with init_vega(request) as vega:
@ -22,7 +23,8 @@ def setup_environment(request, browser) -> Generator[Tuple[Page, str, str], None
side="SIDE_BUY", side="SIDE_BUY",
volume=10, volume=10,
price=60, price=60,
pegged_order=PeggedOrder(reference="PEGGED_REFERENCE_MID", offset=1), pegged_order=PeggedOrder(
reference="PEGGED_REFERENCE_MID", offset=1),
) )
vega.wait_fn(1) vega.wait_fn(1)
vega.wait_for_total_catchup() vega.wait_for_total_catchup()
@ -66,7 +68,8 @@ def setup_environment(request, browser) -> Generator[Tuple[Page, str, str], None
1, 1,
1 + 0.1 / 2, 1 + 0.1 / 2,
) )
submit_order(vega, MM_WALLET.name, market_id, "SIDE_SELL", 1, 1 + 0.1 / 2) submit_order(vega, MM_WALLET.name, market_id,
"SIDE_SELL", 1, 1 + 0.1 / 2)
submit_order(vega, MM_WALLET2.name, market_id, "SIDE_SELL", 1, 1) submit_order(vega, MM_WALLET2.name, market_id, "SIDE_SELL", 1, 1)
vega.wait_fn(1) vega.wait_fn(1)
@ -89,31 +92,37 @@ def setup_environment(request, browser) -> Generator[Tuple[Page, str, str], None
yield page, market_id yield page, market_id
def test_parked_order( def test_parked_order(
setup_environment: Tuple[Page, str, str], setup_environment: Tuple[Page, str, str],
) -> None: ) -> None:
page, market_id, = setup_environment page, market_id, = setup_environment
page.goto(f"/#/markets/{market_id}")
page.get_by_test_id("All").click() page.get_by_test_id("All").click()
expect(page.get_by_role("row").nth(5)).to_contain_text("0+10Mid - 1.00 Peg limitParked0.00GTC") expect(page.get_by_role("row").nth(5)).to_contain_text(
"0+10Mid - 1.00 Peg limitParked0.00GTC")
def test_trading_mode( def test_trading_mode(
setup_environment: Tuple[Page, str, str], setup_environment: Tuple[Page, str, str],
) -> None: ) -> None:
page, market_id, = setup_environment page, market_id, = setup_environment
expect(page.get_by_test_id("market-trading-mode")).to_have_text("Trading modeMonitoring auction - price") page.goto(f"/#/markets/{market_id}")
expect(page.get_by_test_id("market-trading-mode")
).to_have_text("Trading modeMonitoring auction - price")
expect(page.get_by_test_id("market-state")).to_have_text("StatusSuspended") expect(page.get_by_test_id("market-state")).to_have_text("StatusSuspended")
def test_market_info_price_monitoring_asd( def test_market_info_price_monitoring_asd(
setup_environment: Tuple[Page, str, str], setup_environment: Tuple[Page, str, str],
) -> None: ) -> None:
page, market_id, = setup_environment page, market_id, = setup_environment
page.goto(f"/#/markets/{market_id}")
page.get_by_test_id("Info").click() page.get_by_test_id("Info").click()
page.get_by_test_id("accordion-title").get_by_text( page.get_by_test_id("accordion-title").get_by_text(
"Key details").click() "Key details").click()
expect( expect(
page.get_by_test_id( page.get_by_test_id(
"key-value-table-row").nth(2)).to_contain_text("Suspended") "key-value-table-row").nth(2)).to_contain_text("Suspended")
expect( expect(
page.get_by_test_id( page.get_by_test_id(
"key-value-table-row").nth(3)).to_contain_text("Monitoring auction") "key-value-table-row").nth(3)).to_contain_text("Monitoring auction")

View File

@ -4,9 +4,9 @@ import {
} from '@vegaprotocol/assets'; } from '@vegaprotocol/assets';
import { useActiveRewardsQuery } from './__generated__/Rewards'; import { useActiveRewardsQuery } from './__generated__/Rewards';
import { import {
type MarketFieldsFragment, type MarketMaybeWithData,
useMarketsMapProvider,
getAsset, getAsset,
marketsWithDataProvider,
} from '@vegaprotocol/markets'; } from '@vegaprotocol/markets';
import { import {
type RecurringTransfer, type RecurringTransfer,
@ -20,6 +20,7 @@ import {
import { type ApolloError } from '@apollo/client'; import { type ApolloError } from '@apollo/client';
import compact from 'lodash/compact'; import compact from 'lodash/compact';
import { useEpochInfoQuery } from './__generated__/Epoch'; import { useEpochInfoQuery } from './__generated__/Epoch';
import { useDataProvider } from '@vegaprotocol/data-provider';
export type RewardTransfer = TransferNode & { export type RewardTransfer = TransferNode & {
transfer: { transfer: {
@ -35,7 +36,7 @@ export type EnrichedRewardTransfer = RewardTransfer & {
/** A flag determining whether a reward asset is being traded on any of the active markets */ /** A flag determining whether a reward asset is being traded on any of the active markets */
isAssetTraded?: boolean; isAssetTraded?: boolean;
/** A list of markets in scope */ /** A list of markets in scope */
markets?: MarketFieldsFragment[]; markets?: MarketMaybeWithData[];
}; };
/** /**
@ -115,11 +116,15 @@ export const useRewards = ({
loading: assetsLoading, loading: assetsLoading,
error: assetsError, error: assetsError,
} = useAssetsMapProvider(); } = useAssetsMapProvider();
const { const {
data: markets, data: markets,
loading: marketsLoading, loading: marketsLoading,
error: marketsError, error: marketsError,
} = useMarketsMapProvider(); } = useDataProvider({
dataProvider: marketsWithDataProvider,
variables: undefined,
});
const enriched = compact( const enriched = compact(
data?.transfersConnection?.edges?.map((n) => n?.node) data?.transfersConnection?.edges?.map((n) => n?.node)
@ -140,7 +145,7 @@ export const useRewards = ({
undefined; undefined;
const marketsInScope = compact( const marketsInScope = compact(
node.transfer.kind.dispatchStrategy.marketIdsInScope?.map( node.transfer.kind.dispatchStrategy.marketIdsInScope?.map(
(id) => markets && markets[id] (id) => markets && markets.find((m) => m.id === id)
) )
); );
const isAssetTraded = const isAssetTraded =
@ -151,7 +156,7 @@ export const useRewards = ({
return ( return (
mAsset.id === mAsset.id ===
node.transfer.kind.dispatchStrategy.dispatchMetricAssetId && node.transfer.kind.dispatchStrategy.dispatchMetricAssetId &&
m.state === MarketState.STATE_ACTIVE m.data?.marketState === MarketState.STATE_ACTIVE
); );
} catch { } catch {
// NOOP // NOOP

View File

@ -5,7 +5,9 @@ import { isMarketActive } from '../utils';
export const useTopTradedMarkets = () => { export const useTopTradedMarkets = () => {
const { data, loading, error } = useMarketList(); const { data, loading, error } = useMarketList();
const activeMarkets = data?.filter((m) => isMarketActive(m.state)); const activeMarkets = data?.filter(
(m) => m.data?.marketState && isMarketActive(m.data?.marketState)
);
const marketsByTopTraded = data const marketsByTopTraded = data
? orderBy(activeMarkets, (m) => calcTradedFactor(m), 'desc') ? orderBy(activeMarkets, (m) => calcTradedFactor(m), 'desc')
: undefined; : undefined;

View File

@ -850,9 +850,8 @@ describe('DealTicket', () => {
]; ];
it.each(states)('handles state %s correctly', async (marketState) => { it.each(states)('handles state %s correctly', async (marketState) => {
const marketOverrides = { state: marketState };
const marketDataOverrides = { marketState: marketState }; const marketDataOverrides = { marketState: marketState };
render(generateJsx([], marketOverrides, marketDataOverrides)); render(generateJsx([], {}, marketDataOverrides));
const text = `This market is ${marketState const text = `This market is ${marketState
.split('_') .split('_')

View File

@ -9,8 +9,6 @@ export function generateMarket(override?: PartialDeep<Market>): Market {
id: 'market-id', id: 'market-id',
decimalPlaces: 2, decimalPlaces: 2,
positionDecimalPlaces: 1, positionDecimalPlaces: 1,
tradingMode: Schema.MarketTradingMode.TRADING_MODE_CONTINUOUS,
state: Schema.MarketState.STATE_ACTIVE,
tickSize: '1', tickSize: '1',
marketTimestamps: { marketTimestamps: {
__typename: 'MarketTimestamps', __typename: 'MarketTimestamps',

View File

@ -199,8 +199,6 @@ const mockMarket: MarketFieldsFragment = {
id: 'marketId', id: 'marketId',
decimalPlaces: 1, decimalPlaces: 1,
positionDecimalPlaces: 4, positionDecimalPlaces: 4,
state: Schema.MarketState.STATE_ACTIVE,
tradingMode: Schema.MarketTradingMode.TRADING_MODE_CONTINUOUS,
} as MarketFieldsFragment; } as MarketFieldsFragment;
const orderFormValues: OrderFormValues = { const orderFormValues: OrderFormValues = {

View File

@ -3,8 +3,6 @@ import type { PartialDeep } from 'type-fest';
import * as Schema from '@vegaprotocol/types'; import * as Schema from '@vegaprotocol/types';
import type { Trade } from './fills-data-provider'; import type { Trade } from './fills-data-provider';
const { MarketState, MarketTradingMode } = Schema;
export const generateFill = (override?: PartialDeep<Trade>) => { export const generateFill = (override?: PartialDeep<Trade>) => {
const defaultFill: Trade = { const defaultFill: Trade = {
__typename: 'Trade', __typename: 'Trade',
@ -52,8 +50,6 @@ export const generateFill = (override?: PartialDeep<Trade>) => {
id: 'market-id', id: 'market-id',
positionDecimalPlaces: 0, positionDecimalPlaces: 0,
decimalPlaces: 5, decimalPlaces: 5,
state: MarketState.STATE_ACTIVE,
tradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS,
tickSize: '1', tickSize: '1',
fees: { fees: {
__typename: 'Fees', __typename: 'Fees',

View File

@ -1,10 +1,7 @@
import merge from 'lodash/merge'; import merge from 'lodash/merge';
import type { PartialDeep } from 'type-fest'; import type { PartialDeep } from 'type-fest';
import * as Schema from '@vegaprotocol/types';
import type { FundingPayment } from './funding-payments-data-provider'; import type { FundingPayment } from './funding-payments-data-provider';
const { MarketState, MarketTradingMode } = Schema;
export const generateFundingPayment = ( export const generateFundingPayment = (
override?: PartialDeep<FundingPayment> override?: PartialDeep<FundingPayment>
) => { ) => {
@ -20,8 +17,6 @@ export const generateFundingPayment = (
id: 'market-id', id: 'market-id',
positionDecimalPlaces: 0, positionDecimalPlaces: 0,
decimalPlaces: 5, decimalPlaces: 5,
state: MarketState.STATE_ACTIVE,
tradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS,
tickSize: '1', tickSize: '1',
fees: { fees: {
__typename: 'Fees', __typename: 'Fees',

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,9 @@
import * as Schema from '@vegaprotocol/types'; import * as Schema from '@vegaprotocol/types';
import type { Market, MarketMaybeWithDataAndCandles } from './markets-provider'; import type {
Market,
MarketMaybeWithData,
MarketMaybeWithDataAndCandles,
} from './markets-provider';
import { import {
calcCandleVolumePrice, calcCandleVolumePrice,
calcTradedFactor, calcTradedFactor,
@ -7,9 +11,10 @@ import {
sumFeesFactors, sumFeesFactors,
totalFeesFactorsPercentage, totalFeesFactorsPercentage,
} from './market-utils'; } from './market-utils';
import type { MarketData } from './market-data-provider';
const { MarketState, MarketTradingMode } = Schema; const { MarketState, MarketTradingMode } = Schema;
const MARKET_A: Partial<Market> = { const MARKET_A: Partial<MarketMaybeWithData> = {
id: '1', id: '1',
marketTimestamps: { marketTimestamps: {
__typename: 'MarketTimestamps', __typename: 'MarketTimestamps',
@ -18,11 +23,13 @@ const MARKET_A: Partial<Market> = {
open: '2022-05-18T13:08:27.693537312Z', open: '2022-05-18T13:08:27.693537312Z',
close: null, close: null,
}, },
state: MarketState.STATE_ACTIVE, data: {
tradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS, marketState: MarketState.STATE_ACTIVE,
marketTradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS,
} as MarketData,
}; };
const MARKET_B: Partial<Market> = { const MARKET_B: Partial<MarketMaybeWithData> = {
id: '2', id: '2',
marketTimestamps: { marketTimestamps: {
__typename: 'MarketTimestamps', __typename: 'MarketTimestamps',
@ -31,11 +38,13 @@ const MARKET_B: Partial<Market> = {
open: '2022-05-18T13:00:39.328347732Z', open: '2022-05-18T13:00:39.328347732Z',
close: null, close: null,
}, },
state: MarketState.STATE_ACTIVE, data: {
tradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS, marketState: MarketState.STATE_ACTIVE,
marketTradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS,
} as MarketData,
}; };
const MARKET_C: Partial<Market> = { const MARKET_C: Partial<MarketMaybeWithData> = {
id: '3', id: '3',
marketTimestamps: { marketTimestamps: {
__typename: 'MarketTimestamps', __typename: 'MarketTimestamps',
@ -44,11 +53,13 @@ const MARKET_C: Partial<Market> = {
open: '2022-05-17T13:00:39.328347732Z', open: '2022-05-17T13:00:39.328347732Z',
close: null, close: null,
}, },
state: MarketState.STATE_REJECTED, data: {
tradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS, marketState: MarketState.STATE_REJECTED,
marketTradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS,
} as MarketData,
}; };
const MARKET_D: Partial<Market> = { const MARKET_D: Partial<MarketMaybeWithData> = {
id: '4', id: '4',
marketTimestamps: { marketTimestamps: {
__typename: 'MarketTimestamps', __typename: 'MarketTimestamps',
@ -57,8 +68,10 @@ const MARKET_D: Partial<Market> = {
open: '2022-05-16T13:00:39.328347732Z', open: '2022-05-16T13:00:39.328347732Z',
close: null, close: null,
}, },
state: MarketState.STATE_ACTIVE, data: {
tradingMode: MarketTradingMode.TRADING_MODE_NO_TRADING, marketState: MarketState.STATE_ACTIVE,
marketTradingMode: MarketTradingMode.TRADING_MODE_NO_TRADING,
} as MarketData,
}; };
describe('mapDataToMarketList', () => { describe('mapDataToMarketList', () => {
@ -68,7 +81,7 @@ describe('mapDataToMarketList', () => {
MARKET_B, MARKET_B,
MARKET_C, MARKET_C,
MARKET_D, MARKET_D,
] as unknown as Market[]); ] as unknown as MarketMaybeWithData[]);
expect(result).toEqual([MARKET_B, MARKET_A]); expect(result).toEqual([MARKET_B, MARKET_A]);
}); });
}); });

View File

@ -89,8 +89,8 @@ export const filterAndSortMarkets = (markets: MarketMaybeWithData[]) => {
]; ];
const orderedMarkets = orderBy( const orderedMarkets = orderBy(
markets?.filter((m) => { markets?.filter((m) => {
const state = m.data?.marketState || m.state; const state = m.data?.marketState;
const tradingMode = m.data?.marketTradingMode || m.tradingMode; const tradingMode = m.data?.marketTradingMode;
return ( return (
state !== MarketState.STATE_REJECTED && state !== MarketState.STATE_REJECTED &&
tradingMode !== MarketTradingMode.TRADING_MODE_NO_TRADING tradingMode !== MarketTradingMode.TRADING_MODE_NO_TRADING
@ -101,19 +101,26 @@ export const filterAndSortMarkets = (markets: MarketMaybeWithData[]) => {
); );
return orderedMarkets.sort( return orderedMarkets.sort(
(a, b) => (a, b) =>
tradingModesOrdering.indexOf(a.data?.marketTradingMode || a.tradingMode) - (a.data?.marketTradingMode
tradingModesOrdering.indexOf(b.data?.marketTradingMode || b.tradingMode) ? tradingModesOrdering.indexOf(a.data?.marketTradingMode)
: -1) -
(b.data?.marketTradingMode
? tradingModesOrdering.indexOf(b.data?.marketTradingMode)
: -1)
); );
}; };
export const filterAndSortClosedMarkets = (markets: MarketMaybeWithData[]) => { export const filterAndSortClosedMarkets = (markets: MarketMaybeWithData[]) => {
return markets.filter((m) => { return markets.filter((m) => {
return [ return (
MarketState.STATE_SETTLED, m.data?.marketState &&
MarketState.STATE_TRADING_TERMINATED, [
MarketState.STATE_CLOSED, MarketState.STATE_SETTLED,
MarketState.STATE_CANCELLED, MarketState.STATE_TRADING_TERMINATED,
].includes(m.data?.marketState || m.state); MarketState.STATE_CLOSED,
MarketState.STATE_CANCELLED,
].includes(m.data.marketState)
);
}); });
}; };
@ -121,8 +128,9 @@ export const filterAndSortProposedMarkets = (
markets: MarketMaybeWithData[] markets: MarketMaybeWithData[]
) => { ) => {
return markets.filter((m) => { return markets.filter((m) => {
return [MarketState.STATE_PROPOSED].includes( return (
m.data?.marketState || m.state m.data?.marketState &&
[MarketState.STATE_PROPOSED].includes(m.data?.marketState)
); );
}); });
}; };

View File

@ -110,19 +110,30 @@ export const marketWithDataProvider = makeDerivedDataProvider<
}; };
}); });
export const activeMarketsProvider = makeDerivedDataProvider<Market[], never>( export const marketsWithDataProvider = makeDerivedDataProvider<
[marketsProvider], MarketMaybeWithData[],
([markets]) => filterAndSortMarkets(markets) never
>([marketsProvider, marketsDataProvider], (parts) =>
addData(parts[0] as Market[], parts[1] as MarketData[])
); );
export const closedMarketsProvider = makeDerivedDataProvider<Market[], never>( export const activeMarketsProvider = makeDerivedDataProvider<
[marketsProvider], MarketMaybeWithData[],
([markets]) => filterAndSortClosedMarkets(markets) never
>([marketsWithDataProvider], ([markets]) => filterAndSortMarkets(markets));
export const closedMarketsProvider = makeDerivedDataProvider<
MarketMaybeWithData[],
never
>([marketsWithDataProvider], ([markets]) =>
filterAndSortClosedMarkets(markets)
); );
export const proposedMarketsProvider = makeDerivedDataProvider<Market[], never>( export const proposedMarketsProvider = makeDerivedDataProvider<
[marketsProvider], MarketMaybeWithData[],
([markets]) => filterAndSortProposedMarkets(markets) never
>([marketsWithDataProvider], ([markets]) =>
filterAndSortProposedMarkets(markets)
); );
export type MarketMaybeWithCandles = Market & { candles?: Candle[] }; export type MarketMaybeWithCandles = Market & { candles?: Candle[] };
@ -157,28 +168,7 @@ const addData = <T extends Market>(markets: T[], marketsData: MarketData[]) =>
data: marketsData.find((data) => data.market.id === market.id), data: marketsData.find((data) => data.market.id === market.id),
})); }));
export const marketsWithDataProvider = makeDerivedDataProvider< export const marketsWithLiveDataProvider = makeDerivedDataProvider<
MarketMaybeWithData[],
never
>([activeMarketsProvider, marketsDataProvider], (parts) =>
addData(parts[0] as Market[], parts[1] as MarketData[])
);
export const closedMarketsWithDataProvider = makeDerivedDataProvider<
MarketMaybeWithData[],
never
>([closedMarketsProvider, marketsDataProvider], (parts) =>
addData(parts[0] as Market[], parts[1] as MarketData[])
);
export const allMarketsWithDataProvider = makeDerivedDataProvider<
MarketMaybeWithData[],
never
>([marketsProvider, marketsDataProvider], (parts) =>
addData(parts[0] as Market[], parts[1] as MarketData[])
);
export const allMarketsWithLiveDataProvider = makeDerivedDataProvider<
MarketMaybeWithData[], MarketMaybeWithData[],
MarketMaybeWithData, MarketMaybeWithData,
{ marketIds: string[] } { marketIds: string[] }

View File

@ -61,8 +61,6 @@ fragment MarketFields on Market {
decimalPlaces decimalPlaces
positionDecimalPlaces positionDecimalPlaces
tickSize tickSize
state
tradingMode
parentMarketID parentMarketID
successorMarketID successorMarketID
fees { fees {

View File

@ -36,8 +36,6 @@ export const createMarketFragment = (
id: 'market-0', id: 'market-0',
decimalPlaces: 5, decimalPlaces: 5,
positionDecimalPlaces: 0, positionDecimalPlaces: 0,
tradingMode: Schema.MarketTradingMode.TRADING_MODE_CONTINUOUS,
state: Schema.MarketState.STATE_ACTIVE,
tickSize: '1', tickSize: '1',
marketTimestamps: { marketTimestamps: {
__typename: 'MarketTimestamps', __typename: 'MarketTimestamps',
@ -190,8 +188,6 @@ const marketFieldsFragments: MarketFieldsFragment[] = [
}), }),
createMarketFragment({ createMarketFragment({
id: 'market-2', id: 'market-2',
tradingMode: Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION,
state: Schema.MarketState.STATE_SUSPENDED,
marketTimestamps: { marketTimestamps: {
proposed: '2022-08-23T11:36:32.252490405Z', proposed: '2022-08-23T11:36:32.252490405Z',
pending: '2022-08-24T11:36:32.252490405Z', pending: '2022-08-24T11:36:32.252490405Z',

View File

@ -29,7 +29,6 @@ export const generateOrder = (partialOrder?: PartialDeep<Order>) => {
close: null, close: null,
}, },
positionDecimalPlaces: 2, positionDecimalPlaces: 2,
state: Schema.MarketState.STATE_ACTIVE,
tradableInstrument: { tradableInstrument: {
__typename: 'TradableInstrument', __typename: 'TradableInstrument',
instrument: { instrument: {
@ -86,7 +85,6 @@ export const generateOrder = (partialOrder?: PartialDeep<Order>) => {
}, },
}, },
}, },
tradingMode: Schema.MarketTradingMode.TRADING_MODE_CONTINUOUS,
}, },
size: '10', size: '10',
type: Schema.OrderType.TYPE_MARKET, type: Schema.OrderType.TYPE_MARKET,

View File

@ -39,7 +39,6 @@ export const generateStopOrder = (
open: '', open: '',
}, },
positionDecimalPlaces: 2, positionDecimalPlaces: 2,
state: Schema.MarketState.STATE_ACTIVE,
tradableInstrument: { tradableInstrument: {
__typename: 'TradableInstrument', __typename: 'TradableInstrument',
instrument: { instrument: {
@ -96,7 +95,6 @@ export const generateStopOrder = (
}, },
}, },
}, },
tradingMode: Schema.MarketTradingMode.TRADING_MODE_CONTINUOUS,
}, },
submission: { submission: {
marketId: 'market-id', marketId: 'market-id',

View File

@ -3,8 +3,6 @@ import { OrderViewDialog } from './order-view-dialog';
import type { Order } from '../order-data-provider'; import type { Order } from '../order-data-provider';
import { BrowserRouter } from 'react-router-dom'; import { BrowserRouter } from 'react-router-dom';
import { import {
MarketState,
MarketTradingMode,
OrderStatus, OrderStatus,
OrderTimeInForce, OrderTimeInForce,
OrderType, OrderType,
@ -20,8 +18,6 @@ describe('OrderViewDialog', () => {
id: 'b66cd4be223dfd900a4750bb5175e17d8f678996877d262be4c749a99e22a970', id: 'b66cd4be223dfd900a4750bb5175e17d8f678996877d262be4c749a99e22a970',
decimalPlaces: 5, decimalPlaces: 5,
positionDecimalPlaces: 3, positionDecimalPlaces: 3,
state: MarketState.STATE_ACTIVE,
tradingMode: MarketTradingMode.TRADING_MODE_CONTINUOUS,
tickSize: '1', tickSize: '1',
fees: { fees: {
__typename: 'Fees', __typename: 'Fees',

View File

@ -111,7 +111,6 @@ const marketsData = [
__typename: 'Market', __typename: 'Market',
id: '5e6035fe6a6df78c9ec44b333c231e63d357acef0a0620d2c243f5865d1dc0d8', id: '5e6035fe6a6df78c9ec44b333c231e63d357acef0a0620d2c243f5865d1dc0d8',
decimalPlaces: 5, decimalPlaces: 5,
tradingMode: Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION,
positionDecimalPlaces: 0, positionDecimalPlaces: 0,
tradableInstrument: { tradableInstrument: {
__typename: 'TradableInstrument', __typename: 'TradableInstrument',
@ -131,6 +130,8 @@ const marketsData = [
}, },
data: { data: {
__typename: 'MarketData', __typename: 'MarketData',
marketTradingMode:
Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION,
markPrice: '9431775', markPrice: '9431775',
market: { market: {
__typename: 'Market', __typename: 'Market',
@ -142,7 +143,6 @@ const marketsData = [
__typename: 'Market', __typename: 'Market',
id: '10c4b1114d2f6fda239b73d018bca55888b6018f0ac70029972a17fea0a6a56e', id: '10c4b1114d2f6fda239b73d018bca55888b6018f0ac70029972a17fea0a6a56e',
decimalPlaces: 5, decimalPlaces: 5,
tradingMode: Schema.MarketTradingMode.TRADING_MODE_CONTINUOUS,
positionDecimalPlaces: 0, positionDecimalPlaces: 0,
tradableInstrument: { tradableInstrument: {
__typename: 'TradableInstrument', __typename: 'TradableInstrument',
@ -162,6 +162,7 @@ const marketsData = [
}, },
data: { data: {
__typename: 'MarketData', __typename: 'MarketData',
marketTradingMode: Schema.MarketTradingMode.TRADING_MODE_CONTINUOUS,
markPrice: '869762', markPrice: '869762',
market: { market: {
__typename: 'Market', __typename: 'Market',

View File

@ -17,7 +17,7 @@ import {
import { import {
type MarketMaybeWithData, type MarketMaybeWithData,
type MarketDataQueryVariables, type MarketDataQueryVariables,
allMarketsWithLiveDataProvider, marketsWithLiveDataProvider,
getAsset, getAsset,
marketInfoProvider, marketInfoProvider,
type MarketInfo, type MarketInfo,
@ -57,8 +57,8 @@ export interface Position {
marketDecimalPlaces: number; marketDecimalPlaces: number;
marketId: string; marketId: string;
marketCode: string; marketCode: string;
marketTradingMode: MarketTradingMode; marketTradingMode?: MarketTradingMode;
marketState: MarketState; marketState?: MarketState;
markPrice: string | undefined; markPrice: string | undefined;
notional: string | undefined; notional: string | undefined;
openVolume: string; openVolume: string;
@ -171,8 +171,8 @@ export const getMetrics = (
marketDecimalPlaces, marketDecimalPlaces,
marketId: market.id, marketId: market.id,
marketCode: market.tradableInstrument.instrument.code, marketCode: market.tradableInstrument.instrument.code,
marketTradingMode: market.tradingMode, marketTradingMode: market.data?.marketTradingMode,
marketState: market.state, marketState: market.data?.marketState,
markPrice: marketData ? marketData.markPrice : undefined, markPrice: marketData ? marketData.markPrice : undefined,
notional: notional notional: notional
? notional.multipliedBy(10 ** marketDecimalPlaces).toFixed(0) ? notional.multipliedBy(10 ** marketDecimalPlaces).toFixed(0)
@ -325,6 +325,7 @@ export const preparePositions = (metrics: Position[], showClosed: boolean) => {
} }
if ( if (
p.marketState &&
[ [
MarketState.STATE_ACTIVE, MarketState.STATE_ACTIVE,
MarketState.STATE_PENDING, MarketState.STATE_PENDING,
@ -369,7 +370,7 @@ export const positionsMetricsProvider = makeDerivedDataProvider<
partyId: firstOrSelf(variables.partyIds), partyId: firstOrSelf(variables.partyIds),
}), }),
(callback, client, variables) => (callback, client, variables) =>
allMarketsWithLiveDataProvider(callback, client, { marketsWithLiveDataProvider(callback, client, {
marketIds: variables.marketIds, marketIds: variables.marketIds,
}), }),
(callback, client, variables) => (callback, client, variables) =>

View File

@ -35,10 +35,10 @@ export const getMarketExpiryDateFormatted = (
return null; return null;
}; };
export const getExpiryDate = ( export const useExpiryDate = (
tags: ReadonlyArray<string> | null, tags?: ReadonlyArray<string> | null,
close: string | null, close?: string | null,
state: MarketState state?: MarketState | null
): string => { ): string => {
const t = useT(); const t = useT();
const metadataExpiryDate = getMarketExpiryDate(tags); const metadataExpiryDate = getMarketExpiryDate(tags);

View File

@ -138,8 +138,6 @@ describe('WithdrawFormContainer', () => {
id: 'marketId-1', id: 'marketId-1',
decimalPlaces: 5, decimalPlaces: 5,
positionDecimalPlaces: 0, positionDecimalPlaces: 0,
state: Types.MarketState.STATE_SUSPENDED,
tradingMode: Types.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION,
tickSize: '1', tickSize: '1',
fees: { fees: {
__typename: 'Fees', __typename: 'Fees',