4ed623c84c
* feat: update connect dialog to handle api v2 * feat: better error handling * feat: update to only use strings for pubkey, add json rpc connector * feat: make json connector follow same patterns as rest connector * feat: add ability to change wallet location * feat: add chain id fetch * feat: improve types * feat: adjust send tx types * chore: remove dialog title and chain check temporarily * feat: additional UI and error handling * feat: rename keypair and keypairs to pubKey and pubKeys * feat: make rest and json rpc connectors return consistent data * feat: rename derived ids more clearly * feat: update send_transaction response type * chore: fix tests after context name change * feat: add utils for wallet, add encode tx func * feat: return null if tx is rejected * feat: fix up styles for connect buttons * feat: handle wallet version check * feat: add chain id check * chore: rename select pub key function to match, fix tests * fix: tests for rest connector form * feat: add tests for json rpc flow * feat: connect dialog changes * chore: change status to enum to avoid magic strings * feat: add custom icons and handle provided key name * chore: update global wallet connection e2d tests * chore: change zod validation to only expected required values * chore: ignore new generated code files * chore: fix typos and add translations * chore: set hosted wallet via env var and only show if not mainnet * feat: add functionality for try again button * test: fix failing tests * chore: fix lint and test * chore: remove double import * chore: make console-lite-e2e strict so json connector compiles correctly * chore: make token e2e tsconfig strict * chore: make stats-e2e tsconfig strict * feat: update json rpc request namespace * feat: simplify connector setup, support try again * chore: remove comment * fix: build errors * chore: make chainId check optional based on presence of appChainId, mock request for tests * chore: mock chain id request for all apps on all pages * fix: footer border on small screens * fix: use beforeEach for chainId query mock * chore: remove optional chain check, prevent rendering until fetch is complete * chore: update NX_VEGA_WALLET_URLs as the application now appends the base path, adjust token tests * fix: token e2e test that checks for pubkey name * chore: remove duplicated test, update wallet title assertion * fix: token tests * fix: token e2e assertions * fix: withdraw test * feat: enable json RPC for token * fix: sendTx command now accpets pubkey as separate arg * fix: test to use gui option temporarily Co-authored-by: Dexter <dexter.edwards93@gmail.com>
153 lines
4.4 KiB
TypeScript
153 lines
4.4 KiB
TypeScript
import { LiquidityTable, useLiquidityProvision } from '@vegaprotocol/liquidity';
|
|
import { addDecimalsFormatNumber, t } from '@vegaprotocol/react-helpers';
|
|
import { LiquidityProvisionStatus } from '@vegaprotocol/types';
|
|
import {
|
|
AsyncRenderer,
|
|
Tab,
|
|
Tabs,
|
|
Link as UiToolkitLink,
|
|
} from '@vegaprotocol/ui-toolkit';
|
|
import { useVegaWallet } from '@vegaprotocol/wallet';
|
|
import type { AgGridReact } from 'ag-grid-react';
|
|
import { Header, HeaderStat } from '../../components/header';
|
|
import { useRouter } from 'next/router';
|
|
import { useRef, useMemo } from 'react';
|
|
import { tooltipMapping } from '@vegaprotocol/market-info';
|
|
import Link from 'next/link';
|
|
|
|
const LiquidityPage = ({ id }: { id?: string }) => {
|
|
const { query } = useRouter();
|
|
const { pubKey } = useVegaWallet();
|
|
const gridRef = useRef<AgGridReact | null>(null);
|
|
|
|
// Default to first marketId query item if found
|
|
const marketId =
|
|
id || (Array.isArray(query.marketId) ? query.marketId[0] : query.marketId);
|
|
|
|
const {
|
|
data: {
|
|
liquidityProviders,
|
|
suppliedStake,
|
|
targetStake,
|
|
name,
|
|
symbol,
|
|
assetDecimalPlaces,
|
|
},
|
|
loading,
|
|
error,
|
|
} = useLiquidityProvision({ marketId });
|
|
|
|
const myLpEdges = useMemo(
|
|
() => liquidityProviders.filter((e) => e.party === pubKey),
|
|
[liquidityProviders, pubKey]
|
|
);
|
|
const activeEdges = useMemo(
|
|
() =>
|
|
liquidityProviders.filter(
|
|
(e) => e.status === LiquidityProvisionStatus.STATUS_ACTIVE
|
|
),
|
|
[liquidityProviders]
|
|
);
|
|
const inactiveEdges = useMemo(
|
|
() =>
|
|
liquidityProviders.filter(
|
|
(e) => e.status !== LiquidityProvisionStatus.STATUS_ACTIVE
|
|
),
|
|
[liquidityProviders]
|
|
);
|
|
|
|
const enum LiquidityTabs {
|
|
Active = 'active',
|
|
Inactive = 'inactive',
|
|
MyLiquidityProvision = 'myLP',
|
|
}
|
|
|
|
const getActiveDefaultId = () => {
|
|
if (myLpEdges?.length > 0) return LiquidityTabs.MyLiquidityProvision;
|
|
if (activeEdges?.length) return LiquidityTabs.Active;
|
|
else if (inactiveEdges?.length > 0) return LiquidityTabs.Inactive;
|
|
return LiquidityTabs.Active;
|
|
};
|
|
|
|
return (
|
|
<AsyncRenderer loading={loading} error={error} data={liquidityProviders}>
|
|
<div className="h-full grid grid-rows-[min-content_1fr]">
|
|
<Header
|
|
title={
|
|
<Link href={`/markets/${marketId}`} passHref={true}>
|
|
<UiToolkitLink>
|
|
{`${name} ${t('liquidity provision')}`}
|
|
</UiToolkitLink>
|
|
</Link>
|
|
}
|
|
>
|
|
<HeaderStat
|
|
heading={t('Target stake')}
|
|
description={tooltipMapping['targetStake']}
|
|
>
|
|
<div>
|
|
{targetStake
|
|
? `${addDecimalsFormatNumber(
|
|
targetStake,
|
|
assetDecimalPlaces ?? 0
|
|
)} ${symbol}`
|
|
: '-'}
|
|
</div>
|
|
</HeaderStat>
|
|
<HeaderStat
|
|
heading={t('Supplied stake')}
|
|
description={tooltipMapping['suppliedStake']}
|
|
>
|
|
<div>
|
|
{suppliedStake
|
|
? `${addDecimalsFormatNumber(
|
|
suppliedStake,
|
|
assetDecimalPlaces ?? 0
|
|
)} ${symbol}`
|
|
: '-'}
|
|
</div>
|
|
</HeaderStat>
|
|
<HeaderStat heading={t('Market ID')}>
|
|
<div className="break-word">{marketId}</div>
|
|
</HeaderStat>
|
|
</Header>
|
|
<Tabs active={getActiveDefaultId()}>
|
|
<Tab
|
|
id={LiquidityTabs.MyLiquidityProvision}
|
|
name={t('My liquidity provision')}
|
|
hidden={!pubKey}
|
|
>
|
|
<LiquidityTable
|
|
ref={gridRef}
|
|
data={myLpEdges}
|
|
symbol={symbol}
|
|
assetDecimalPlaces={assetDecimalPlaces}
|
|
/>
|
|
</Tab>
|
|
<Tab id={LiquidityTabs.Active} name={t('Active')}>
|
|
<LiquidityTable
|
|
ref={gridRef}
|
|
data={activeEdges}
|
|
symbol={symbol}
|
|
assetDecimalPlaces={assetDecimalPlaces}
|
|
/>
|
|
</Tab>
|
|
<Tab id={LiquidityTabs.Inactive} name={t('Inactive')}>
|
|
<LiquidityTable
|
|
ref={gridRef}
|
|
data={inactiveEdges}
|
|
symbol={symbol}
|
|
assetDecimalPlaces={assetDecimalPlaces}
|
|
/>
|
|
</Tab>
|
|
</Tabs>
|
|
</div>
|
|
</AsyncRenderer>
|
|
);
|
|
};
|
|
LiquidityPage.getInitialProps = () => ({
|
|
page: 'liquidity',
|
|
});
|
|
|
|
export default LiquidityPage;
|