diff --git a/apps/trading/client-pages/market/trade-grid.tsx b/apps/trading/client-pages/market/trade-grid.tsx index 9639f0116..e2fd169fa 100644 --- a/apps/trading/client-pages/market/trade-grid.tsx +++ b/apps/trading/client-pages/market/trade-grid.tsx @@ -102,6 +102,7 @@ const MarketBottomPanel = memo( @@ -157,6 +158,7 @@ const MarketBottomPanel = memo( diff --git a/libs/orders/src/lib/components/order-list-container.tsx b/libs/orders/src/lib/components/order-list-container.tsx index 5b91ff427..018558702 100644 --- a/libs/orders/src/lib/components/order-list-container.tsx +++ b/libs/orders/src/lib/components/order-list-container.tsx @@ -6,9 +6,11 @@ import { OrderListManager } from './order-list-manager'; export const OrderListContainer = ({ marketId, onMarketClick, + enforceBottomPlaceholder, }: { marketId?: string; onMarketClick?: (marketId: string) => void; + enforceBottomPlaceholder?: boolean; }) => { const { pubKey, isReadOnly } = useVegaWallet(); @@ -22,6 +24,7 @@ export const OrderListContainer = ({ marketId={marketId} onMarketClick={onMarketClick} isReadOnly={isReadOnly} + enforceBottomPlaceholder={enforceBottomPlaceholder} /> ); }; diff --git a/libs/orders/src/lib/components/order-list-manager/order-list-manager.tsx b/libs/orders/src/lib/components/order-list-manager/order-list-manager.tsx index 385588dd8..1b5b2841a 100644 --- a/libs/orders/src/lib/components/order-list-manager/order-list-manager.tsx +++ b/libs/orders/src/lib/components/order-list-manager/order-list-manager.tsx @@ -1,12 +1,7 @@ import { AsyncRenderer } from '@vegaprotocol/ui-toolkit'; import { t } from '@vegaprotocol/i18n'; -import { useCallback, useRef, useState } from 'react'; -import type { - BodyScrollEvent, - BodyScrollEndEvent, - FilterChangedEvent, - SortChangedEvent, -} from 'ag-grid-community'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import type { FilterChangedEvent, SortChangedEvent } from 'ag-grid-community'; import { Button } from '@vegaprotocol/ui-toolkit'; import type { AgGridReact } from 'ag-grid-react'; import type { GridReadyEvent } from 'ag-grid-community'; @@ -23,13 +18,14 @@ import { } from '@vegaprotocol/wallet'; import type { OrderTxUpdateFieldsFragment } from '@vegaprotocol/wallet'; import { OrderEditDialog } from '../order-list/order-edit-dialog'; -import type { Order } from '../order-data-provider'; +import type { Order, OrderEdge } from '../order-data-provider'; export interface OrderListManagerProps { partyId: string; marketId?: string; onMarketClick?: (marketId: string) => void; isReadOnly: boolean; + enforceBottomPlaceholder: boolean; } const CancelAllOrdersButton = ({ @@ -65,78 +61,50 @@ export const OrderListManager = ({ marketId, onMarketClick, isReadOnly, + enforceBottomPlaceholder, }: OrderListManagerProps) => { const gridRef = useRef(null); - const scrolledToTop = useRef(true); + const [dataCount, setDataCount] = useState(0); + const scrolledToTop = useRef(false); const [sort, setSort] = useState(); const [filter, setFilter] = useState(initialFilter); const [editOrder, setEditOrder] = useState(null); const create = useVegaTransactionStore((state) => state.create); const hasActiveOrder = useHasActiveOrder(marketId); - const { - data, - error, - loading, - addNewRows, - getRows, - reload, - makeBottomPlaceholders, - } = useOrderListData({ + const { data, error, loading, reload } = useOrderListData({ partyId, - marketId, sort, filter, gridRef, scrolledToTop, }); - const checkBottomPlaceholder = useCallback(() => { - if (!isReadOnly && hasActiveOrder) { - const rowCont = gridRef.current?.api?.getModel().getRowCount() ?? 0; - const lastRowIndex = gridRef.current?.api?.getLastDisplayedRow(); - if (lastRowIndex && rowCont - 1 === lastRowIndex) { - const lastrow = - gridRef.current?.api.getDisplayedRowAtIndex(lastRowIndex); - lastrow?.setRowHeight(50); - makeBottomPlaceholders(lastrow?.data); - gridRef.current?.api.onRowHeightChanged(); - gridRef.current?.api.refreshInfiniteCache(); - } - } - }, [isReadOnly, hasActiveOrder, makeBottomPlaceholders]); - - const onBodyScrollEnd = useCallback( - (event: BodyScrollEndEvent) => { - if (event.top === 0) { - addNewRows(); - } - checkBottomPlaceholder(); - }, - [addNewRows, checkBottomPlaceholder] - ); - - const onBodyScroll = useCallback((event: BodyScrollEvent) => { - scrolledToTop.current = event.top <= 0; - }, []); + const { + onSortChanged: bottomPlaceholderOnSortChanged, + onFilterChanged: bottomPlaceholderOnFilterChanged, + ...bottomPlaceholderProps + } = useBottomPlaceholder({ + gridRef, + disabled: !enforceBottomPlaceholder && !isReadOnly && !hasActiveOrder, + }); const onFilterChanged = useCallback( (event: FilterChangedEvent) => { - makeBottomPlaceholders(); const updatedFilter = event.api.getFilterModel(); if (Object.keys(updatedFilter).length) { setFilter(updatedFilter); } else { setFilter(undefined); } - checkBottomPlaceholder(); + setDataCount(gridRef.current?.api?.getModel().getRowCount() ?? 0); + bottomPlaceholderOnFilterChanged?.(); }, - [setFilter, makeBottomPlaceholders, checkBottomPlaceholder] + [setFilter, bottomPlaceholderOnFilterChanged] ); const onSortChange = useCallback( (event: SortChangedEvent) => { - makeBottomPlaceholders(); const sort = event.columnApi .getColumnState() .sort((a, b) => (a.sortIndex || 0) - (b.sortIndex || 0)) @@ -148,9 +116,9 @@ export const OrderListManager = ({ return acc; }, [] as { colId: string; sort: string }[]); setSort(sort.length > 0 ? sort : undefined); - checkBottomPlaceholder(); + bottomPlaceholderOnSortChanged?.(); }, - [setSort, makeBottomPlaceholders, checkBottomPlaceholder] + [setSort, bottomPlaceholderOnSortChanged] ); const cancel = useCallback( @@ -166,15 +134,13 @@ export const OrderListManager = ({ [create] ); - const onGridReady = useCallback( - ({ api }: GridReadyEvent) => { - api.setDatasource({ - getRows, - }); - api.setFilterModel(initialFilter); - }, - [getRows] - ); + const onGridReady = useCallback(({ api }: GridReadyEvent) => { + api.setFilterModel(initialFilter); + }, []); + + useEffect(() => { + setDataCount(gridRef.current?.api?.getModel().getRowCount() ?? 0); + }, [data]); const cancelAll = useCallback( (marketId?: string) => { @@ -186,20 +152,24 @@ export const OrderListManager = ({ }, [create] ); - const { isFullWidthRow, fullWidthCellRenderer, rowClassRules } = - useBottomPlaceholder({ - gridRef, - }); + const extractNodesDecorator = useCallback( + (data: (OrderEdge | null)[] | null, loading: boolean) => + data && !loading + ? data + .filter((item) => item !== null) + .map((item) => (item as OrderEdge).node) + : null, + [] + ); + const extractedData = extractNodesDecorator(data, loading); return ( <>
!(data && data.length)} + noDataCondition={(data) => !dataCount} reload={reload} />
diff --git a/libs/orders/src/lib/components/order-list-manager/use-order-list-data.ts b/libs/orders/src/lib/components/order-list-manager/use-order-list-data.ts index 53bcf2bfc..4a5200284 100644 --- a/libs/orders/src/lib/components/order-list-manager/use-order-list-data.ts +++ b/libs/orders/src/lib/components/order-list-manager/use-order-list-data.ts @@ -79,6 +79,9 @@ export const useOrderListData = ({ timeInForce: filter?.timeInForce?.value, types: filter?.type?.value, }, + pagination: { + first: 1000, + }, }), [partyId, marketId, filter] ); @@ -98,7 +101,6 @@ export const useOrderListData = ({ ({ data, delta, - totalCount, }: { data: (OrderEdge | null)[] | null; delta?: Order[]; @@ -112,7 +114,10 @@ export const useOrderListData = ({ ).length; } } - return updateGridData(dataRef, data, gridRef); + if (gridRef.current?.api?.getModel().getType() === 'infinite') { + return updateGridData(dataRef, data, gridRef); + } + return false; }, [gridRef, scrolledToTop] ); @@ -126,7 +131,10 @@ export const useOrderListData = ({ totalCount?: number; }) => { totalCountRef.current = totalCount; - return updateGridData(dataRef, data, gridRef); + if (gridRef.current?.api?.getModel().getType() === 'infinite') { + return updateGridData(dataRef, data, gridRef); + } + return false; }, [gridRef] ); diff --git a/libs/orders/src/lib/components/order-list/order-list.tsx b/libs/orders/src/lib/components/order-list/order-list.tsx index 61c6ebde8..c1d2e7ec6 100644 --- a/libs/orders/src/lib/components/order-list/order-list.tsx +++ b/libs/orders/src/lib/components/order-list/order-list.tsx @@ -39,10 +39,10 @@ export const OrderListTable = memo( return ( ) => { if (!data) { return undefined; @@ -110,6 +110,7 @@ export const OrderListTable = memo( ) ); }} + minWidth={80} /> ) => { if (!order) { return undefined; @@ -130,6 +130,7 @@ export const OrderListTable = memo( if (order?.liquidityProvision) return t('Liquidity provision'); return Schema.OrderTypeMapping[value]; }} + minWidth={80} /> )} + minWidth={100} /> ); }} + minWidth={150} /> ); }} + minWidth={150} /> ) : null; }} + sortable={false} /> ); diff --git a/libs/react-helpers/src/hooks/use-bottom-placeholder.tsx b/libs/react-helpers/src/hooks/use-bottom-placeholder.tsx index 1bce82078..2e0ab70e2 100644 --- a/libs/react-helpers/src/hooks/use-bottom-placeholder.tsx +++ b/libs/react-helpers/src/hooks/use-bottom-placeholder.tsx @@ -68,7 +68,7 @@ export const useBottomPlaceholder = ({ isFullWidthRow, fullWidthCellRenderer, onSortChanged: onRowsChanged, - onFilterChange: onRowsChanged, + onFilterChanged: onRowsChanged, } : {}, [onBodyScrollEnd, onRowsChanged, disabled]