Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(uirefresh): component refresh - orderbook #1116

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/components/Tabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export const Tabs = <TabItemsValue extends string>({
</$List>

{(currentItem?.slotToolbar ?? slotToolbar) && (
<Toolbar>{currentItem?.slotToolbar ?? slotToolbar}</Toolbar>
<$Toolbar>{currentItem?.slotToolbar ?? slotToolbar}</$Toolbar>
)}
</>
);
Expand Down Expand Up @@ -176,6 +176,8 @@ const $Root = styled(Root)<{
--tabs-currentHeight: var(--tabs-height-mobile);
}

--toolbar-width: ;

/* Rules */
${layoutMixins.scrollArea}
overscroll-behavior: contain;
Expand Down Expand Up @@ -358,6 +360,11 @@ const $DropdownSelectMenu = styled(DropdownSelectMenu)<{
: css``}
` as typeof dropdownSelectMenuType;

const $Toolbar = styled(Toolbar)`
justify-content: flex-end;
width: var(--toolbar-width);
`;

export const MobileTabs = styled(Tabs)`
--trigger-backgroundColor: transparent;
--trigger-active-backgroundColor: transparent;
Expand Down
2 changes: 1 addition & 1 deletion src/components/Toolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,5 @@ const $Root = styled(Root)<{ layout?: 'column' | 'row' }>`
row: layoutMixins.row,
}[layout]}

padding: 0 1rem;
padding: var(--toolbar-padding, 0 1rem);
`;
3 changes: 2 additions & 1 deletion src/constants/orderbook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ export const ORDERBOOK_HEIGHT = 756;
export const ORDERBOOK_WIDTH = 300;
export const ORDERBOOK_ROW_HEIGHT = 21;
export const ORDERBOOK_ROW_PADDING_RIGHT = 8;
export const ORDERBOOK_HEADER_HEIGHT = 70;
export const ORDERBOOK_HEADER_HEIGHT = 43;
export const ORDERBOOK_CONTROLS_HEIGHT = 38;
51 changes: 41 additions & 10 deletions src/pages/trade/VerticalPanel.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
import { useCallback, useEffect, useRef, useState } from 'react';

import { shallowEqual } from 'react-redux';
import styled from 'styled-components';

import { TradeLayouts } from '@/constants/layout';
import { STRING_KEYS } from '@/constants/localization';
import { ORDERBOOK_HEADER_HEIGHT, ORDERBOOK_ROW_HEIGHT } from '@/constants/orderbook';
import {
ORDERBOOK_CONTROLS_HEIGHT,
ORDERBOOK_MAX_ROWS_PER_SIDE,
ORDERBOOK_HEADER_HEIGHT,
ORDERBOOK_ROW_HEIGHT,
} from '@/constants/orderbook';

import { useCalculateOrderbookData } from '@/hooks/Orderbook/useOrderbookValues';
import { useStringGetter } from '@/hooks/useStringGetter';

import { Tabs } from '@/components/Tabs';
import { CanvasOrderbook } from '@/views/CanvasOrderbook/CanvasOrderbook';
import { OrderbookControls } from '@/views/CanvasOrderbook/OrderbookControls';
import { LiveTrades } from '@/views/tables/LiveTrades';

import { useAppSelector } from '@/state/appTypes';
import { getCurrentMarketData } from '@/state/perpetualsSelectors';

import { testFlags } from '@/lib/testFlags';

enum Tab {
Expand All @@ -25,20 +38,31 @@ const HISTOGRAM_SIDES_BY_LAYOUT = {
export const VerticalPanel = ({ tradeLayout }: { tradeLayout: TradeLayouts }) => {
const stringGetter = useStringGetter();
const [value, setValue] = useState(Tab.Orderbook);
const [rowsPerSide, setRowsPerSide] = useState<number | undefined>(undefined);
const [rowsPerSide, setRowsPerSide] = useState<number>(ORDERBOOK_MAX_ROWS_PER_SIDE);

const { uiRefresh } = testFlags;

const canvasOrderbookRef = useRef<HTMLDivElement>(null);
const canvasOrderbook = canvasOrderbookRef.current;

const calculateNumRows = useCallback((orderbookHeight: number) => {
const maxNumRowsToRender = Math.floor(
(orderbookHeight - ORDERBOOK_HEADER_HEIGHT - ORDERBOOK_ROW_HEIGHT) /
(2 * ORDERBOOK_ROW_HEIGHT)
);
setRowsPerSide(maxNumRowsToRender);
}, []);
const { assetId: id } = useAppSelector(getCurrentMarketData, shallowEqual) ?? {};
const { currentGrouping } = useCalculateOrderbookData({
rowsPerSide,
});

const calculateNumRows = useCallback(
(orderbookHeight: number) => {
const maxNumRowsToRender = Math.floor(
(orderbookHeight -
ORDERBOOK_HEADER_HEIGHT -
ORDERBOOK_ROW_HEIGHT -
(uiRefresh ? 0 : ORDERBOOK_CONTROLS_HEIGHT)) /
(2 * ORDERBOOK_ROW_HEIGHT)
);
setRowsPerSide(maxNumRowsToRender);
},
[uiRefresh]
);

useEffect(() => {
const resizeObserver = new ResizeObserver((entries) => {
Expand All @@ -65,7 +89,7 @@ export const VerticalPanel = ({ tradeLayout }: { tradeLayout: TradeLayouts }) =>
}, [calculateNumRows, canvasOrderbook]);

return (
<Tabs
<$Tabs
fullWidthTabs
dividerStyle={uiRefresh ? 'underline' : 'border'}
value={value}
Expand All @@ -84,15 +108,22 @@ export const VerticalPanel = ({ tradeLayout }: { tradeLayout: TradeLayouts }) =>
label: stringGetter({ key: STRING_KEYS.ORDERBOOK_SHORT }),
value: Tab.Orderbook,
forceMount: true,
slotToolbar: <OrderbookControls assetId={id} grouping={currentGrouping} />,
ref: canvasOrderbookRef,
},
{
content: <LiveTrades histogramSide={HISTOGRAM_SIDES_BY_LAYOUT[tradeLayout]} />,
label: stringGetter({ key: STRING_KEYS.TRADES }),
value: Tab.Trades,
slotToolbar: <div />,
},
]}
withTransitions={false}
/>
);
};

const $Tabs = styled(Tabs)`
--toolbar-padding: 0;
--toolbar-width: 50%;
` as typeof Tabs;
6 changes: 5 additions & 1 deletion src/views/CanvasOrderbook/CanvasOrderbook.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
} from '@/state/perpetualsSelectors';

import { MustBigNumber } from '@/lib/numbers';
import { testFlags } from '@/lib/testFlags';

import { OrderbookControls } from './OrderbookControls';
import { OrderbookMiddleRow, OrderbookRow } from './OrderbookRow';
Expand Down Expand Up @@ -68,6 +69,7 @@ export const CanvasOrderbook = forwardRef(

const { tickSizeDecimals = USD_DECIMALS } = currentMarketConfig ?? {};

const { uiRefresh } = testFlags;
/**
* Slice asks and bids to rowsPerSide using empty rows
*/
Expand Down Expand Up @@ -203,7 +205,9 @@ export const CanvasOrderbook = forwardRef(
return (
<div ref={ref} tw="flex flex-1 flex-col overflow-hidden">
<$OrderbookContent $isLoading={!hasOrderbook}>
{!hideHeader && <OrderbookControls assetId={id} grouping={currentGrouping} />}
{!hideHeader && !uiRefresh && (
<OrderbookControls assetId={id} grouping={currentGrouping} />
)}
{!hideHeader && (
<OrderbookRow tw="h-1.75 text-color-text-0">
<span>
Expand Down
28 changes: 19 additions & 9 deletions src/views/CanvasOrderbook/OrderbookControls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { useCallback } from 'react';

import { clamp } from 'lodash';
import { shallowEqual, useDispatch } from 'react-redux';
import styled from 'styled-components';
import styled, { css } from 'styled-components';

import { MarketOrderbookGrouping, Nullable, OrderbookGrouping } from '@/constants/abacus';
import { ButtonShape, ButtonSize } from '@/constants/buttons';
Expand All @@ -19,6 +19,7 @@ import { getSelectedDisplayUnit } from '@/state/configsSelectors';
import { getCurrentMarketConfig } from '@/state/perpetualsSelectors';

import abacusStateManager from '@/lib/abacus';
import { testFlags } from '@/lib/testFlags';

type OrderbookControlsProps = {
className?: string;
Expand All @@ -29,6 +30,7 @@ type OrderbookControlsProps = {
export const OrderbookControls = ({ className, assetId, grouping }: OrderbookControlsProps) => {
const dispatch = useDispatch();
const displayUnit = useAppSelector(getSelectedDisplayUnit);
const { uiRefresh } = testFlags;

const modifyScale = useCallback(
(direction: number) => {
Expand All @@ -42,6 +44,7 @@ export const OrderbookControls = ({ className, assetId, grouping }: OrderbookCon
);
const currentMarketConfig = useAppSelector(getCurrentMarketConfig, shallowEqual);
const tickSizeDecimals = currentMarketConfig?.tickSizeDecimals ?? USD_DECIMALS;

const onToggleDisplayUnit = useCallback(
(newValue: DisplayUnit) => {
if (!assetId) return;
Expand All @@ -55,10 +58,16 @@ export const OrderbookControls = ({ className, assetId, grouping }: OrderbookCon
},
[dispatch, assetId]
);

return (
<$OrderbookControlsContainer className={className}>
<$OrderbookControlsContainer className={className} $uiRefreshEnabled={uiRefresh}>
<div tw="flex justify-between gap-0.5">
<div tw="flex gap-0.5">
<Output
value={grouping?.tickSize}
type={OutputType.Fiat}
fractionDigits={tickSizeDecimals === 1 ? 2 : tickSizeDecimals}
/>
<$ButtonGroup>
<Button
size={ButtonSize.XSmall}
Expand All @@ -75,13 +84,8 @@ export const OrderbookControls = ({ className, assetId, grouping }: OrderbookCon
+
</Button>
</$ButtonGroup>
<Output
value={grouping?.tickSize}
type={OutputType.Fiat}
fractionDigits={tickSizeDecimals === 1 ? 2 : tickSizeDecimals}
/>
</div>
{assetId && (
{!uiRefresh && assetId && (
<ToggleGroup
items={[
{ label: assetId, value: DisplayUnit.Asset },
Expand All @@ -97,7 +101,7 @@ export const OrderbookControls = ({ className, assetId, grouping }: OrderbookCon
);
};

const $OrderbookControlsContainer = styled.div`
const $OrderbookControlsContainer = styled.div<{ $uiRefreshEnabled: boolean }>`
color: var(--color-text-0);
font: var(--font-small-book);

Expand All @@ -109,6 +113,12 @@ const $OrderbookControlsContainer = styled.div`
padding-top: 0.3rem;
padding-bottom: 0.3rem;
}

${({ $uiRefreshEnabled }) =>
!$uiRefreshEnabled &&
css`
flex-direction: column-reverse;
`}
`;
const $ButtonGroup = styled.div`
display: flex;
Expand Down
Loading