2022-03-23 12:47:45 +00:00
|
|
|
import { useState, useEffect, useRef } from 'react';
|
|
|
|
import { produce } from 'immer';
|
2022-03-28 19:34:45 +00:00
|
|
|
import merge from 'lodash/merge';
|
2022-03-23 12:47:45 +00:00
|
|
|
import { useApolloClient } from '@apollo/client';
|
2022-02-17 05:03:46 +00:00
|
|
|
import { useRouter } from 'next/router';
|
Feat/84 Order list (#89)
* scaffold dealticket package, remove trading views from react-helpers
* add deal ticket component, add intent utils, expand dialog and form group styles
* add splash component, show market not found message if market doesnt exist
* tidy up error handling
* add handleError method for vega tx hook
* add better testname for provider test, flesh out tests a bit more for deal ticket
* Add unit tests for useVegaTransaction and useOrderSubmit hooks
* add wrapper component for order dialog styles
* add vega styled loader to ui toolkit and use in order dialog
* add title prop to order dialog
* add button radio component
* revert dialog styles
* move splash component to ui-toolkit, add story
* convert intent to enum
* add date-fns, add datetime to helpers
* add order types to wallet package, make price undefined if order type is market
* tidy up order state by moving submit and transaction hooks out of deal ticket
* add types package, delete old generated types from trading project
* rename types package to graphql
* add order list container and order list component
* add test setup for useOrders
* add test for use-orders hook
* tidy unnecessary diff
* regen types and use them in order-list, also change to use applytransaction hook for orderlist grid
* make order table columns resizable
* make market table not have highlightable cells, use splash for orders errors and loading states, unit test for orderlist container
* add tests for order list table
* show rejection reason and expires at depending on status and tif
* add decimal places to query
* only update row if data has changed, add test coverage
* add setup tests file to avoid importing jest-dom for every test, add async-renderer component to handle fetch ui logic
* install all of lodash but import individually to get tree shaking
* add setup tests file for orderlist package
* add missing fields to use orders spec mock order
* fix act warnings in index page test
* fix casing of app import
* remove react-singleton-hook, simplify side formatting
* fix linting errors
2022-03-23 19:08:10 +00:00
|
|
|
import { AsyncRenderer } from '../../components/async-renderer';
|
2022-03-23 12:47:45 +00:00
|
|
|
import { MarketListTable, getRowNodeId } from '@vegaprotocol/market-list';
|
|
|
|
import {
|
|
|
|
Markets_markets,
|
2022-03-23 16:40:07 +00:00
|
|
|
Markets_markets_data,
|
|
|
|
MarketsDataProviderCallbackArg,
|
|
|
|
marketsDataProvider,
|
2022-03-23 12:47:45 +00:00
|
|
|
} from '@vegaprotocol/graphql';
|
|
|
|
|
|
|
|
import type { AgGridReact } from 'ag-grid-react';
|
2022-02-28 23:43:36 +00:00
|
|
|
|
2022-03-14 15:52:02 +00:00
|
|
|
const Markets = () => {
|
|
|
|
const { pathname, push } = useRouter();
|
2022-03-28 19:34:45 +00:00
|
|
|
const [markets, setMarkets] = useState<Markets_markets[] | null>(null);
|
2022-03-23 12:47:45 +00:00
|
|
|
const [loading, setLoading] = useState<boolean>(true);
|
2022-03-28 19:34:45 +00:00
|
|
|
const [error, setError] = useState<Error>();
|
2022-03-23 12:47:45 +00:00
|
|
|
const client = useApolloClient();
|
2022-03-28 19:34:45 +00:00
|
|
|
const gridRef = useRef<AgGridReact | null>(null);
|
2022-03-23 12:47:45 +00:00
|
|
|
const initialized = useRef<boolean>(false);
|
|
|
|
|
|
|
|
useEffect(() => {
|
2022-03-23 16:40:07 +00:00
|
|
|
return marketsDataProvider(
|
|
|
|
client,
|
|
|
|
({ data, error, loading, delta }: MarketsDataProviderCallbackArg) => {
|
|
|
|
setError(error);
|
|
|
|
setLoading(loading);
|
|
|
|
if (!error && !loading) {
|
|
|
|
if (!initialized.current || !gridRef.current) {
|
|
|
|
initialized.current = true;
|
|
|
|
setMarkets(data);
|
|
|
|
} else {
|
|
|
|
const update: Markets_markets[] = [];
|
|
|
|
const add: Markets_markets[] = [];
|
2022-03-23 12:47:45 +00:00
|
|
|
|
2022-03-23 16:40:07 +00:00
|
|
|
// split into updates and adds
|
2022-03-28 19:34:45 +00:00
|
|
|
if (!gridRef.current || !delta) return;
|
|
|
|
|
2022-03-23 16:40:07 +00:00
|
|
|
const rowNode = gridRef.current.api.getRowNode(
|
|
|
|
getRowNodeId(delta.market)
|
2022-03-23 12:47:45 +00:00
|
|
|
);
|
2022-03-23 16:40:07 +00:00
|
|
|
|
|
|
|
if (rowNode) {
|
|
|
|
const updatedData = produce(
|
|
|
|
rowNode.data.data,
|
2022-03-28 19:34:45 +00:00
|
|
|
(draft: Markets_markets_data) => merge(draft, delta)
|
2022-03-23 16:40:07 +00:00
|
|
|
);
|
|
|
|
if (updatedData !== rowNode.data.data) {
|
|
|
|
update.push({ ...rowNode.data, data: delta });
|
|
|
|
}
|
2022-03-24 17:29:56 +00:00
|
|
|
}
|
|
|
|
// @TODO - else add new market
|
2022-03-23 16:40:07 +00:00
|
|
|
if (update.length || add.length) {
|
|
|
|
gridRef.current.api.applyTransactionAsync({
|
|
|
|
update,
|
|
|
|
add,
|
|
|
|
addIndex: 0,
|
|
|
|
});
|
|
|
|
}
|
2022-03-23 12:47:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-03-23 16:40:07 +00:00
|
|
|
);
|
2022-03-23 12:47:45 +00:00
|
|
|
}, [client, initialized]);
|
2022-03-14 15:52:02 +00:00
|
|
|
|
2022-02-17 05:03:46 +00:00
|
|
|
return (
|
Feat/84 Order list (#89)
* scaffold dealticket package, remove trading views from react-helpers
* add deal ticket component, add intent utils, expand dialog and form group styles
* add splash component, show market not found message if market doesnt exist
* tidy up error handling
* add handleError method for vega tx hook
* add better testname for provider test, flesh out tests a bit more for deal ticket
* Add unit tests for useVegaTransaction and useOrderSubmit hooks
* add wrapper component for order dialog styles
* add vega styled loader to ui toolkit and use in order dialog
* add title prop to order dialog
* add button radio component
* revert dialog styles
* move splash component to ui-toolkit, add story
* convert intent to enum
* add date-fns, add datetime to helpers
* add order types to wallet package, make price undefined if order type is market
* tidy up order state by moving submit and transaction hooks out of deal ticket
* add types package, delete old generated types from trading project
* rename types package to graphql
* add order list container and order list component
* add test setup for useOrders
* add test for use-orders hook
* tidy unnecessary diff
* regen types and use them in order-list, also change to use applytransaction hook for orderlist grid
* make order table columns resizable
* make market table not have highlightable cells, use splash for orders errors and loading states, unit test for orderlist container
* add tests for order list table
* show rejection reason and expires at depending on status and tif
* add decimal places to query
* only update row if data has changed, add test coverage
* add setup tests file to avoid importing jest-dom for every test, add async-renderer component to handle fetch ui logic
* install all of lodash but import individually to get tree shaking
* add setup tests file for orderlist package
* add missing fields to use orders spec mock order
* fix act warnings in index page test
* fix casing of app import
* remove react-singleton-hook, simplify side formatting
* fix linting errors
2022-03-23 19:08:10 +00:00
|
|
|
<AsyncRenderer loading={loading} error={error} data={markets}>
|
|
|
|
{(data) => (
|
|
|
|
<MarketListTable
|
2022-03-23 12:47:45 +00:00
|
|
|
ref={gridRef}
|
Feat/84 Order list (#89)
* scaffold dealticket package, remove trading views from react-helpers
* add deal ticket component, add intent utils, expand dialog and form group styles
* add splash component, show market not found message if market doesnt exist
* tidy up error handling
* add handleError method for vega tx hook
* add better testname for provider test, flesh out tests a bit more for deal ticket
* Add unit tests for useVegaTransaction and useOrderSubmit hooks
* add wrapper component for order dialog styles
* add vega styled loader to ui toolkit and use in order dialog
* add title prop to order dialog
* add button radio component
* revert dialog styles
* move splash component to ui-toolkit, add story
* convert intent to enum
* add date-fns, add datetime to helpers
* add order types to wallet package, make price undefined if order type is market
* tidy up order state by moving submit and transaction hooks out of deal ticket
* add types package, delete old generated types from trading project
* rename types package to graphql
* add order list container and order list component
* add test setup for useOrders
* add test for use-orders hook
* tidy unnecessary diff
* regen types and use them in order-list, also change to use applytransaction hook for orderlist grid
* make order table columns resizable
* make market table not have highlightable cells, use splash for orders errors and loading states, unit test for orderlist container
* add tests for order list table
* show rejection reason and expires at depending on status and tif
* add decimal places to query
* only update row if data has changed, add test coverage
* add setup tests file to avoid importing jest-dom for every test, add async-renderer component to handle fetch ui logic
* install all of lodash but import individually to get tree shaking
* add setup tests file for orderlist package
* add missing fields to use orders spec mock order
* fix act warnings in index page test
* fix casing of app import
* remove react-singleton-hook, simplify side formatting
* fix linting errors
2022-03-23 19:08:10 +00:00
|
|
|
markets={data}
|
|
|
|
onRowClicked={(id) =>
|
|
|
|
push(`${pathname}/${id}?portfolio=orders&trade=orderbook`)
|
|
|
|
}
|
|
|
|
/>
|
|
|
|
)}
|
|
|
|
</AsyncRenderer>
|
2022-02-17 05:03:46 +00:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2022-03-23 12:47:45 +00:00
|
|
|
export default Markets;
|