vega-frontend-monorepo/libs/wallet/src/connect-dialog/json-rpc-connector-form.tsx
Joe Tsang 777d330f8e
chore(test fixes): use api token in test (#2316)
* chore: clean jsonrpc wallet api methods - remove permission methods

* chore: clean jsonrpc wallet api methods - remove permission methods

* chore: clean jsonrpc wallet api methods - remove permission methods

* chore: clean jsonrpc wallet api methods - fix failing unit test

* chore: update vega_version

* chore: update vega to v0.63.0 in workflows

* chore: mock api-token in connect wallet response

* chore: fix token env in workflow

* chore: remove dummy wallet leftovers

* chore: fix asset tests

* chore: fix remaining explorer tests

* chore: increase tx timeout

* chore: remove smoke test temporarily

* chore: remove other governance smoke test

* chore: remove smoke staking test

* chore: move validator tests to regression

* chore: revert regression change because they are also running

* chore: move vega wallet tests to slow

* chore: skip tests instead

Co-authored-by: maciek <maciek@vegaprotocol.io>
Co-authored-by: Rado <szpiechrados@gmail.com>
2022-12-05 16:51:53 +00:00

209 lines
5.0 KiB
TypeScript

import capitalize from 'lodash/capitalize';
import { createDocsLinks, t } from '@vegaprotocol/react-helpers';
import {
ButtonLink,
Diamond,
Link,
Loader,
Tick,
} from '@vegaprotocol/ui-toolkit';
import type { ReactNode } from 'react';
import type { JsonRpcConnector } from '../connectors';
import { ClientErrors } from '../connectors';
import type { WalletError } from '../connectors';
import { ConnectDialogTitle } from './connect-dialog-elements';
import { Status } from '../use-json-rpc-connect';
import { useEnvironment } from '@vegaprotocol/environment';
export const ServiceErrors = {
NO_HEALTHY_NODE: 1000,
CONNECTION_DECLINED: 3001,
REQUEST_PROCESSING: -32000,
};
export const JsonRpcConnectorForm = ({
connector,
appChainId,
status,
error,
reset,
}: {
connector: JsonRpcConnector;
appChainId: string;
status: Status;
error: WalletError | null;
onConnect: () => void;
reset: () => void;
}) => {
if (status === Status.Idle) {
return null;
}
return (
<Connecting
status={status}
error={error}
connector={connector}
appChainId={appChainId}
reset={reset}
/>
);
};
const Connecting = ({
status,
error,
connector,
appChainId,
reset,
}: {
status: Status;
error: WalletError | null;
connector: JsonRpcConnector;
appChainId: string;
reset: () => void;
}) => {
if (status === Status.Error) {
return (
<Error
error={error}
connectorUrl={connector.url}
appChainId={appChainId}
onTryAgain={reset}
/>
);
}
if (status === Status.CheckingVersion) {
return (
<>
<ConnectDialogTitle>{t('Checking wallet version')}</ConnectDialogTitle>
<Center>
<Loader />
</Center>
<p className="text-center">
{t('Checking your wallet is compatible with this app')}
</p>
</>
);
}
if (status === Status.GettingChainId) {
return (
<>
<ConnectDialogTitle>{t('Verifying chain')}</ConnectDialogTitle>
<Center>
<Loader />
</Center>
</>
);
}
if (status === Status.Connected) {
return (
<>
<ConnectDialogTitle>{t('Successfully connected')}</ConnectDialogTitle>
<Center>
<Tick />
</Center>
</>
);
}
if (status === Status.Connecting || status === Status.GettingPerms) {
return (
<>
<ConnectDialogTitle>{t('Connecting...')}</ConnectDialogTitle>
<Center>
<Diamond />
</Center>
<p className="text-center">
{t(
"Approve the connection from your Vega wallet app. If you have multiple wallets you'll need to choose which to connect with."
)}
</p>
</>
);
}
return null;
};
const Center = ({ children }: { children: ReactNode }) => {
return (
<div className="flex justify-center items-center my-6">{children}</div>
);
};
const Error = ({
error,
connectorUrl,
appChainId,
onTryAgain,
}: {
error: WalletError | null;
connectorUrl: string | null;
appChainId: string;
onTryAgain: () => void;
}) => {
let title = t('Something went wrong');
let text: ReactNode | undefined = t('An unknown error occurred');
let tryAgain: ReactNode | null = (
<p className="text-center">
<ButtonLink onClick={onTryAgain}>{t('Try again')}</ButtonLink>
</p>
);
const { VEGA_DOCS_URL } = useEnvironment();
if (error) {
if (error.code === ClientErrors.NO_SERVICE.code) {
title = t('No wallet detected');
text = t(`No wallet application running at ${connectorUrl}`);
} else if (error.code === ClientErrors.WRONG_NETWORK.code) {
title = t('Wrong network');
text = `To complete your wallet connection, set your wallet network in your app to "${appChainId}".`;
} else if (error.code === ServiceErrors.CONNECTION_DECLINED) {
title = t('Connection declined');
text = t('Your wallet connection was rejected');
} else if (error.code === ServiceErrors.NO_HEALTHY_NODE) {
title = error.message;
text = (
<>
{capitalize(error.data)}
{'. '}
{VEGA_DOCS_URL && (
<Link
href={createDocsLinks(VEGA_DOCS_URL).VEGA_WALLET_CONCEPTS_URL}
>
{t('Read the docs to troubleshoot')}
</Link>
)}
</>
);
} else if (error.code === ServiceErrors.REQUEST_PROCESSING) {
title = t('Connection in progress');
text = t('Approve the connection from your Vega wallet app.');
tryAgain = null;
} else if (error.code === 0) {
title = t('Wrong network');
text = (
<>
{t(`To complete your wallet connection, set your wallet network in your
app to ${appChainId}.`)}
</>
);
} else {
title = error.message;
text = `${error.data} (${error.code})`;
}
}
return (
<>
<ConnectDialogTitle>{title}</ConnectDialogTitle>
<p className="text-center mb-2">{text}</p>
{tryAgain}
</>
);
};