Merge pull request #4880 from vegaprotocol/chore/update-develop-with-mainnet-fixes

chore(trading,governance): update develop with mainnet fixes
This commit is contained in:
Matthew Russell 2023-09-26 14:06:20 -04:00 committed by GitHub
commit 2b8abde938
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 174 additions and 148 deletions

View File

@ -4,7 +4,7 @@ import { AssetTypeMapping, AssetStatusMapping } from '@vegaprotocol/assets';
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';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import type { VegaICellRendererParams } from '@vegaprotocol/datagrid'; import type { VegaICellRendererParams } from '@vegaprotocol/datagrid';
import { useRef, useLayoutEffect } from 'react'; import { useRef, useLayoutEffect } from 'react';
import { BREAKPOINT_MD } from '../../config/breakpoints'; import { BREAKPOINT_MD } from '../../config/breakpoints';

View File

@ -4,7 +4,7 @@ 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';
import type { ColDef } from 'ag-grid-community'; import type { ColDef } from 'ag-grid-community';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import type { import type {
VegaICellRendererParams, VegaICellRendererParams,
VegaValueGetterParams, VegaValueGetterParams,

View File

@ -2,7 +2,7 @@ import type { ProposalListFieldsFragment } from '@vegaprotocol/proposals';
import { VoteProgress } from '@vegaprotocol/proposals'; import { VoteProgress } from '@vegaprotocol/proposals';
import type { AgGridReact } from 'ag-grid-react'; import type { AgGridReact } from 'ag-grid-react';
import { ExternalLink } from '@vegaprotocol/ui-toolkit'; import { ExternalLink } from '@vegaprotocol/ui-toolkit';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import type { import type {
VegaICellRendererParams, VegaICellRendererParams,
VegaValueFormatterParams, VegaValueFormatterParams,
@ -105,7 +105,7 @@ export const ProposalsTable = ({ data }: ProposalsTableProps) => {
? new BigNumber(0) ? new BigNumber(0)
: yesTokens.multipliedBy(100).dividedBy(totalTokensVoted); : yesTokens.multipliedBy(100).dividedBy(totalTokensVoted);
return ( return (
<div className="uppercase flex h-full items-center justify-center pt-2"> <div className="flex items-center justify-center h-full pt-2 uppercase">
<VoteProgress <VoteProgress
threshold={requiredMajorityPercentage} threshold={requiredMajorityPercentage}
progress={yesPercentage} progress={yesPercentage}

View File

@ -3,7 +3,7 @@ import { forwardRef, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { Button, Icon } from '@vegaprotocol/ui-toolkit'; import { Button, Icon } from '@vegaprotocol/ui-toolkit';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import { useAppState } from '../../../../contexts/app-state/app-state-context'; import { useAppState } from '../../../../contexts/app-state/app-state-context';
import { BigNumber } from '../../../../lib/bignumber'; import { BigNumber } from '../../../../lib/bignumber';
import { import {
@ -85,17 +85,17 @@ const TopThirdCellRenderer = (
}} }}
className="grid grid-cols-[60px_1fr] w-full h-full py-4 px-0 text-sm text-white text-center overflow-scroll" className="grid grid-cols-[60px_1fr] w-full h-full py-4 px-0 text-sm text-white text-center overflow-scroll"
> >
<div className="text-xs text-left px-3"> <div className="px-3 text-xs text-left">
{params?.data?.rankingDisplay} {params?.data?.rankingDisplay}
</div> </div>
<div className="whitespace-normal px-3"> <div className="px-3 whitespace-normal">
<div className="mb-4"> <div className="mb-4">
<Button <Button
data-testid="show-all-validators" data-testid="show-all-validators"
rightIcon={ rightIcon={
<Icon <Icon
name="arrow-right" name="arrow-right"
className="fill-current mr-2 align-text-top" className="mr-2 align-text-top fill-current"
/> />
} }
className="inline-flex items-center" className="inline-flex items-center"
@ -103,7 +103,7 @@ const TopThirdCellRenderer = (
{t('Reveal top validators')} {t('Reveal top validators')}
</Button> </Button>
</div> </div>
<p className="font-semibold text-white mb-0"> <p className="mb-0 font-semibold text-white">
{t( {t(
'Validators with too great a stake share will have the staking rewards for their delegators penalised.' 'Validators with too great a stake share will have the staking rewards for their delegators penalised.'
)} )}

View File

@ -1,7 +1,7 @@
import { forwardRef, useMemo, useRef } from 'react'; import { forwardRef, useMemo, useRef } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import { useAppState } from '../../../../contexts/app-state/app-state-context'; import { useAppState } from '../../../../contexts/app-state/app-state-context';
import { BigNumber } from '../../../../lib/bignumber'; import { BigNumber } from '../../../../lib/bignumber';
import { import {

View File

@ -4,7 +4,7 @@ import type {
VegaICellRendererParams, VegaICellRendererParams,
VegaValueFormatterParams, VegaValueFormatterParams,
} from '@vegaprotocol/datagrid'; } from '@vegaprotocol/datagrid';
import { AgGridLazy as AgGrid, COL_DEFS } from '@vegaprotocol/datagrid'; import { AgGrid, COL_DEFS } from '@vegaprotocol/datagrid';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { t } from '@vegaprotocol/i18n'; import { t } from '@vegaprotocol/i18n';
import type { Asset } from '@vegaprotocol/types'; import type { Asset } from '@vegaprotocol/types';

View File

@ -1,5 +1,5 @@
import type { TypedDataAgGrid } from '@vegaprotocol/datagrid'; import type { TypedDataAgGrid } from '@vegaprotocol/datagrid';
import { AgGridLazy as AgGrid, PriceFlashCell } from '@vegaprotocol/datagrid'; import { AgGrid, PriceFlashCell } from '@vegaprotocol/datagrid';
import type { MarketMaybeWithData } from '@vegaprotocol/markets'; import type { MarketMaybeWithData } from '@vegaprotocol/markets';
import { useColumnDefs } from './use-column-defs'; import { useColumnDefs } from './use-column-defs';

View File

@ -9,5 +9,11 @@ export const AnnouncementBanner = () => {
return null; return null;
} }
return <Banner app="console" configUrl={ANNOUNCEMENTS_CONFIG_URL} />; return (
<Banner
app="console"
configUrl={ANNOUNCEMENTS_CONFIG_URL}
background="url('/banner-bg.jpg')"
/>
);
}; };

View File

@ -4,33 +4,24 @@ export default function Document() {
return ( return (
<> <>
<Head> <Head>
{/* {/*
meta tags meta tags
- next advised against using _document for this, so they exist in our - next advised against using _document for this, so they exist in our
- single page index.page.tsx - single page index.page.tsx
*/} */}
{/* icons */} {/* preload fonts */}
<link
rel="icon"
type="image/x-icon"
href="https://static.vega.xyz/favicon.ico"
/>
<link
rel="apple-touch-icon"
content="https://static.vega.xyz/favicon.ico"
/>
{/* fonts */}
<link <link
rel="preload" rel="preload"
href="https://static.vega.xyz/AlphaLyrae-Medium.woff2" href="/AlphaLyrae-Medium.woff2"
as="font" as="font"
type="font/woff2" type="font/woff2"
/> />
{/* styles */} {/* icons */}
<link rel="stylesheet" href="https://static.vega.xyz/fonts.css" /> <link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" content="/favicon.ico" />
{/* eslint-disable-next-line @next/next/no-css-tags */} {/* eslint-disable-next-line @next/next/no-css-tags */}
<link rel="stylesheet" href="/preloader.css" media="all" /> <link rel="stylesheet" href="/preloader.css" media="all" />

View File

@ -19,17 +19,11 @@ export default function Index() {
<meta name="og:url" content="https://console.vega.xyz/" /> <meta name="og:url" content="https://console.vega.xyz/" />
<meta name="og:title" content="Vega Protocol - Console" /> <meta name="og:title" content="Vega Protocol - Console" />
<meta name="og:site_name" content="Vega Protocol - Console" /> <meta name="og:site_name" content="Vega Protocol - Console" />
<meta name="og:image" content="https://static.vega.xyz/favicon.ico" /> <meta name="og:image" content="./favicon.ico" />
<meta <meta name="twitter:card" content="./favicon.ico" />
name="twitter:card"
content="https://static.vega.xyz/favicon.ico"
/>
<meta name="twitter:title" content="Vega Protocol - Console" /> <meta name="twitter:title" content="Vega Protocol - Console" />
<meta name="twitter:description" content="Vega Protocol - Console" /> <meta name="twitter:description" content="Vega Protocol - Console" />
<meta <meta name="twitter:image" content="./favicon.ico" />
name="twitter:image"
content="https://static.vega.xyz/favicon.ico"
/>
<meta name="twitter:image:alt" content="VEGA logo" /> <meta name="twitter:image:alt" content="VEGA logo" />
<meta name="twitter:site" content="@vegaprotocol" /> <meta name="twitter:site" content="@vegaprotocol" />
</Head> </Head>

View File

@ -1,6 +1,13 @@
@import 'ag-grid-community/styles/ag-grid.css'; @import 'ag-grid-community/styles/ag-grid.css';
@import 'ag-grid-community/styles/ag-theme-balham.css'; @import 'ag-grid-community/styles/ag-theme-balham.css';
/** Load AlphaLyrae font */
@font-face {
font-family: AlphaLyrae;
src: url('/AlphaLyrae-Medium.woff2') format('woff2'),
url('/AlphaLyrae-Medium.woff') format('woff');
}
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -1,14 +0,0 @@
#!/bin/sh
entrypoint="${1:-nginx}"
if [[ "$entrypoint" = "nginx" ]]; then
nginx -g 'daemon off;'
elif [[ "$entrypoint" = "ipfs" ]]; then
ipfs config profile apply server
ipfs config --json Addresses.Gateway '"/ip4/127.0.0.1/tcp/80"'
ipfs daemon
elif [[ "-c" ]]; then
shift
/bin/sh -c "$@"
fi

View File

@ -18,7 +18,7 @@ import {
VegaIconNames, VegaIconNames,
TooltipCellComponent, TooltipCellComponent,
} from '@vegaprotocol/ui-toolkit'; } from '@vegaprotocol/ui-toolkit';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import type { import type {
IGetRowsParams, IGetRowsParams,
IRowNode, IRowNode,

View File

@ -13,7 +13,7 @@ import type {
VegaICellRendererParams, VegaICellRendererParams,
} from '@vegaprotocol/datagrid'; } from '@vegaprotocol/datagrid';
import { ProgressBarCell } from '@vegaprotocol/datagrid'; import { ProgressBarCell } from '@vegaprotocol/datagrid';
import { AgGridLazy as AgGrid, PriceCell } from '@vegaprotocol/datagrid'; import { AgGrid, PriceCell } from '@vegaprotocol/datagrid';
import type { ColDef } from 'ag-grid-community'; import type { ColDef } from 'ag-grid-community';
import { accountValuesComparator } from './accounts-table'; import { accountValuesComparator } from './accounts-table';
import { MarginHealthChart } from './margin-health-chart'; import { MarginHealthChart } from './margin-health-chart';

View File

@ -14,6 +14,7 @@ import {
export type AnnouncementBannerProps = { export type AnnouncementBannerProps = {
app: AppNameType; app: AppNameType;
configUrl: string; configUrl: string;
background?: string;
}; };
// run only if below the allowed maximum delay ~24.8 days (https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#maximum_delay_value) // run only if below the allowed maximum delay ~24.8 days (https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#maximum_delay_value)
@ -36,6 +37,7 @@ const doesEndInTheFuture = (now: Date, data: Announcement) => {
export const AnnouncementBanner = ({ export const AnnouncementBanner = ({
app, app,
configUrl, configUrl,
background,
}: AnnouncementBannerProps) => { }: AnnouncementBannerProps) => {
const [isVisible, setVisible] = useState(false); const [isVisible, setVisible] = useState(false);
const { data, reload } = useAnnouncement(app, configUrl); const { data, reload } = useAnnouncement(app, configUrl);
@ -79,10 +81,10 @@ export const AnnouncementBanner = ({
} }
return ( return (
<Banner className="relative px-10"> <Banner className="relative px-10" background={background}>
<div <div
data-testid="app-announcement" data-testid="app-announcement"
className="relative font-alpha flex gap-2 justify-center text-center text-lg text-white" className="relative flex justify-center text-lg text-center text-white font-alpha gap-2"
> >
<span>{data.text}</span>{' '} <span>{data.text}</span>{' '}
{data.urlText && data.url && ( {data.urlText && data.url && (
@ -90,7 +92,7 @@ export const AnnouncementBanner = ({
)} )}
</div> </div>
<button <button
className="absolute right-0 top-0 p-4 w-10 h-full flex items-center justify-center text-white" className="absolute top-0 right-0 flex items-center justify-center w-10 h-full p-4 text-white"
data-testid="app-announcement-close" data-testid="app-announcement-close"
onClick={() => { onClick={() => {
setVisible(false); setVisible(false);

View File

@ -1,4 +1,4 @@
export * from './lib/ag-grid/ag-grid-lazy'; export * from './lib/ag-grid/ag-grid';
export * from './lib/column-definitions'; export * from './lib/column-definitions';

View File

@ -1,17 +0,0 @@
import { forwardRef, lazy } from 'react';
import type { AgGridReactProps, AgGridReact } from 'ag-grid-react';
type Props = AgGridReactProps & {
style?: React.CSSProperties;
gridRef?: React.Ref<AgGridReact>;
};
export const AgGridLazyInternal = lazy(() =>
import('./ag-grid-lazy-themed').then((module) => ({
default: module.AgGridThemed,
}))
);
export const AgGridLazy = forwardRef<AgGridReact, Props>((props, ref) => (
<AgGridLazyInternal {...props} gridRef={ref} />
));

View File

@ -0,0 +1,12 @@
import { forwardRef } from 'react';
import type { AgGridReactProps, AgGridReact } from 'ag-grid-react';
import { AgGridThemed } from './ag-grid-themed';
type Props = AgGridReactProps & {
style?: React.CSSProperties;
gridRef?: React.Ref<AgGridReact>;
};
export const AgGrid = forwardRef<AgGridReact, Props>((props, ref) => (
<AgGridThemed {...props} gridRef={ref} />
));

View File

@ -1,13 +1,12 @@
import { act, render, waitFor } from '@testing-library/react'; import { act, render, waitFor } from '@testing-library/react';
import { import { useDataGridEvents } from './use-datagrid-events';
useDataGridEvents, import { AgGridThemed } from './ag-grid/ag-grid-themed';
GRID_EVENT_DEBOUNCE_TIME,
} from './use-datagrid-events';
import { AgGridThemed } from './ag-grid/ag-grid-lazy-themed';
import type { MutableRefObject } from 'react'; import type { MutableRefObject } from 'react';
import { useRef } from 'react'; import { useRef } from 'react';
import type { AgGridReact } from 'ag-grid-react'; import type { AgGridReact } from 'ag-grid-react';
const GRID_EVENT_DEBOUNCE_TIME = 500;
const gridProps = { const gridProps = {
rowData: [{ id: 1 }], rowData: [{ id: 1 }],
columnDefs: [ columnDefs: [

View File

@ -6,7 +6,7 @@ import {
isNumeric, isNumeric,
} from '@vegaprotocol/utils'; } from '@vegaprotocol/utils';
import type { ColDef } from 'ag-grid-community'; import type { ColDef } from 'ag-grid-community';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import type { import type {
VegaICellRendererParams, VegaICellRendererParams,
VegaValueFormatterParams, VegaValueFormatterParams,

View File

@ -15,7 +15,7 @@ import {
import { t } from '@vegaprotocol/i18n'; import { t } from '@vegaprotocol/i18n';
import * as Schema from '@vegaprotocol/types'; import * as Schema from '@vegaprotocol/types';
import { import {
AgGridLazy as AgGrid, AgGrid,
positiveClassNames, positiveClassNames,
negativeClassNames, negativeClassNames,
MarketNameCell, MarketNameCell,
@ -299,7 +299,7 @@ const FeesBreakdownTooltip = ({
return ( return (
<div <div
data-testid="fee-breakdown-tooltip" data-testid="fee-breakdown-tooltip"
className="max-w-sm bg-vega-light-100 dark:bg-vega-dark-100 border border-vega-light-200 dark:border-vega-dark-200 px-4 py-2 z-20 rounded text-sm break-word text-black dark:text-white" className="z-20 max-w-sm px-4 py-2 text-sm text-black border rounded bg-vega-light-100 dark:bg-vega-dark-100 border-vega-light-200 dark:border-vega-dark-200 break-word dark:text-white"
> >
{role === MAKER && ( {role === MAKER && (
<> <>

View File

@ -7,7 +7,7 @@ import {
} from '@vegaprotocol/utils'; } from '@vegaprotocol/utils';
import { t } from '@vegaprotocol/i18n'; import { t } from '@vegaprotocol/i18n';
import type { TypedDataAgGrid } from '@vegaprotocol/datagrid'; import type { TypedDataAgGrid } from '@vegaprotocol/datagrid';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import { TooltipCellComponent } from '@vegaprotocol/ui-toolkit'; import { TooltipCellComponent } from '@vegaprotocol/ui-toolkit';
import type { import type {
ColDef, ColDef,

View File

@ -17,7 +17,7 @@ import {
import type { ForwardedRef } from 'react'; import type { ForwardedRef } from 'react';
import { memo, forwardRef, useMemo } from 'react'; import { memo, forwardRef, useMemo } from 'react';
import { import {
AgGridLazy as AgGrid, AgGrid,
SetFilter, SetFilter,
DateRangeFilter, DateRangeFilter,
negativeClassNames, negativeClassNames,

View File

@ -18,7 +18,7 @@ import {
} from '@vegaprotocol/ui-toolkit'; } from '@vegaprotocol/ui-toolkit';
import { memo, useMemo } from 'react'; import { memo, useMemo } from 'react';
import { import {
AgGridLazy as AgGrid, AgGrid,
SetFilter, SetFilter,
DateRangeFilter, DateRangeFilter,
negativeClassNames, negativeClassNames,

View File

@ -8,7 +8,7 @@ import type {
VegaICellRendererParams, VegaICellRendererParams,
} from '@vegaprotocol/datagrid'; } from '@vegaprotocol/datagrid';
import { import {
AgGridLazy as AgGrid, AgGrid,
COL_DEFS, COL_DEFS,
PriceFlashCell, PriceFlashCell,
signedNumberCssClassRules, signedNumberCssClassRules,

View File

@ -100,7 +100,8 @@ describe('ProposalsList', () => {
const container = within( const container = within(
document.querySelector(rowContainerSelector) as HTMLElement document.querySelector(rowContainerSelector) as HTMLElement
); );
expect(container.getAllByRole('row')).toHaveLength(
expect(await container.findAllByRole('row')).toHaveLength(
// @ts-ignore data is mocked // @ts-ignore data is mocked
mock?.result?.data.proposalsConnection.edges.length mock?.result?.data.proposalsConnection.edges.length
); );

View File

@ -1,5 +1,5 @@
import type { FC } from 'react'; import type { FC } from 'react';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import { t } from '@vegaprotocol/i18n'; import { t } from '@vegaprotocol/i18n';
import * as Types from '@vegaprotocol/types'; import * as Types from '@vegaprotocol/types';
import { removePaginationWrapper } from '@vegaprotocol/utils'; import { removePaginationWrapper } from '@vegaprotocol/utils';

View File

@ -4,7 +4,7 @@ import type {
VegaICellRendererParams, VegaICellRendererParams,
VegaValueFormatterParams, VegaValueFormatterParams,
} from '@vegaprotocol/datagrid'; } from '@vegaprotocol/datagrid';
import { AgGridLazy as AgGrid, NumericCell } from '@vegaprotocol/datagrid'; import { AgGrid, NumericCell } from '@vegaprotocol/datagrid';
import { import {
addDecimal, addDecimal,
addDecimalsFormatNumber, addDecimalsFormatNumber,

View File

@ -4,14 +4,27 @@ import type { ReactNode } from 'react';
export interface BannerProps { export interface BannerProps {
children?: ReactNode; children?: ReactNode;
className?: string; className?: string;
background?: string;
} }
export const AnnouncementBanner = ({ className, children }: BannerProps) => { export const AnnouncementBanner = ({
const bannerClasses = classnames( className,
"bg-[url('https://static.vega.xyz/assets/img/banner-bg.jpg')] bg-cover bg-center bg-no-repeat", children,
'p-4', background = 'url("https://static.vega.xyz/assets/img/banner-bg.jpg")',
className }: BannerProps) => {
); const bannerClasses = classnames('p-4', className);
return <div className={bannerClasses}>{children}</div>; return (
<div
className={bannerClasses}
style={{
background,
backgroundRepeat: 'no-repeat',
backgroundPosition: 'center',
backgroundSize: 'cover',
}}
>
{children}
</div>
);
}; };

View File

@ -169,8 +169,7 @@ const ConnectDialogContainer = ({
const isDesktopWalletRunning = useIsWalletServiceRunning( const isDesktopWalletRunning = useIsWalletServiceRunning(
walletUrl, walletUrl,
connectors['jsonRpc'], connectors['jsonRpc']
appChainId
); );
const snapStatus = useSnapStatus( const snapStatus = useSnapStatus(

View File

@ -0,0 +1,41 @@
import { renderHook, waitFor } from '@testing-library/react';
import { JsonRpcConnector } from './connectors';
import { useIsWalletServiceRunning } from './use-is-wallet-service-running';
describe('useIsWalletServiceRunning', () => {
it('returns true if wallet is running', async () => {
const url = 'https://foo.bar.com';
const connector = new JsonRpcConnector();
const spyOnCheckCompat = jest
.spyOn(connector, 'checkCompat')
.mockResolvedValue(true);
const { result } = renderHook(() =>
useIsWalletServiceRunning(url, connector)
);
expect(result.current).toBe(null);
await waitFor(() => {
expect(spyOnCheckCompat).toHaveBeenCalled();
expect(result.current).toBe(true);
});
});
it('returns false if wallet is not running', async () => {
const url = 'https://foo.bar.com';
const connector = new JsonRpcConnector();
const spyOnCheckCompat = jest
.spyOn(connector, 'checkCompat')
.mockRejectedValue(false);
const { result } = renderHook(() =>
useIsWalletServiceRunning(url, connector)
);
expect(result.current).toBe(null);
await waitFor(() => {
expect(spyOnCheckCompat).toHaveBeenCalled();
expect(result.current).toBe(false);
});
});
});

View File

@ -0,0 +1,39 @@
import { useEffect, useState } from 'react';
import type { JsonRpcConnector } from './connectors';
export const useIsWalletServiceRunning = (
url: string,
connector: JsonRpcConnector | undefined
) => {
const [isRunning, setIsRunning] = useState<boolean | null>(null);
useEffect(() => {
if (!connector) return;
if (url && url !== connector.url) {
connector.url = url;
}
const check = async () => {
try {
// we are not checking wallet compatibility here, only that the wallet is running
await connector.checkCompat();
setIsRunning(true);
} catch {
setIsRunning(false);
}
};
// check immediately
check();
// check every second for quick feedback to the user
const interval = setInterval(check, 1000);
return () => {
clearInterval(interval);
};
}, [connector, url]);
return isRunning;
};

View File

@ -1,47 +0,0 @@
import { useCallback, useEffect, useState } from 'react';
import type { JsonRpcConnector } from './connectors';
import { ClientErrors } from './connectors';
export const useIsWalletServiceRunning = (
url: string,
connector: JsonRpcConnector | undefined,
appChainId: string
) => {
const [run, setRun] = useState<boolean | null>(null);
const checkState = useCallback(async () => {
if (!connector) return false;
if (url && url !== connector.url) {
connector.url = url;
}
try {
await connector.checkCompat();
const chainIdResult = await connector.getChainId();
if (chainIdResult.chainID !== appChainId) {
throw ClientErrors.WRONG_NETWORK;
}
} catch (e) {
return false;
}
return true;
}, [connector, url, appChainId]);
useEffect(() => {
if (!connector) return;
let interval: NodeJS.Timeout;
checkState().then((value) => {
setRun(value);
interval = setInterval(async () => {
setRun(await checkState());
}, 1000 * 10);
});
return () => {
clearInterval(interval);
};
}, [checkState, connector]);
return run;
};

View File

@ -20,7 +20,7 @@ import type {
VegaICellRendererParams, VegaICellRendererParams,
VegaValueFormatterParams, VegaValueFormatterParams,
} from '@vegaprotocol/datagrid'; } from '@vegaprotocol/datagrid';
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; import { AgGrid } from '@vegaprotocol/datagrid';
import { EtherscanLink } from '@vegaprotocol/environment'; import { EtherscanLink } from '@vegaprotocol/environment';
import type { WithdrawalFieldsFragment } from './__generated__/Withdrawal'; import type { WithdrawalFieldsFragment } from './__generated__/Withdrawal';
import { import {